0

.zshrc で ack-grep エイリアスを使用したい。私のエイリアスは次のようになります。

alias 'ack'='ack-grep -C -i -G --match'

しかし、私が必要とするのは、これから文字列を配置することです:

% ack string1 string2

中身

alias 'ack'='ack-grep -C -i -G string1 --match string2'

これを作る方法は?

アップデート

動作したコードは次のとおりです。

ack() { 
    case $# in
    1) args="$1";;
    2) args="$1 -G $2";;
    *) args="$@";;
    esac
    eval "ack-grep -iC $args"
}

私の場合eval、複数の変数を使用するために使用する必要があります。

更新 2

セキュリティ上の問題のない更新されたコード:

ack () {
    if (( $# == 2 )); then
        ack-grep -iC "$1" -G "$2"
    elif (( $# == 1 )); then
        ack-grep -iC "$1"
    else
        echo 'Sorry, function works only for one and two params. In other case use ack-grep. Reread .zshrc'
    fi
}
4

2 に答える 2

0
Use a function:

ack() { ack-grep -C -i -G $1 --match $2; }

おそらく、もう少し堅牢にしたいと思うでしょう。何かのようなもの:

ack() { 
    case $# in
    1) args="-G $1";;
    2) args="-G $1 --match $2";;
    *) args="$@";;
    esac
    ack-grep -C -i "$args"
}

エイリアスはこの種のものに適切な機能を提供しないため、ほとんどの場合、代わりに関数を使用する必要があります。(実際、前述の「ほぼ」は省略できます。)

于 2013-02-20T13:12:05.543 に答える
0

eval必要になることはめったにありません。

ack () { 
    if (( $# > 2 )); then
        ack-grep -iC "$@"
    else
        ack-grep -iC "$1" ${2:+-G "$2"}
    fi
}

更新: これは、最初のソリューションの正確なバージョンですeval

ack() { 
    case $# in
    1) ack-grep -iC "$1";;
    2) ack-grep -iC "$1" -G "$2";;
    *) ack-grep -iC "$@";;
    esac
}
于 2013-02-23T00:32:05.087 に答える