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 回答