将选项传递给〜/ .bashrc中的grep

时间:2014-07-29 21:47:20

标签: bash shell grep

在我的〜/ .bashrc中,我有以下内容:

function grep_shortcut {
    local x="$1" y="$2"
    shift 2
    echo grep $x "$y" "${@-.}"
    grep $x "$y" "${@-.}"
}

function grb {
    grep_shortcut "-Irs --include '*.*rb'" $@
}

如果我运行grb fooecho将打印grep -Irs --include '*.*rb' foo .,这就是我想要的,但我没有得到grep的结果。我不明白为什么。

任何?

感谢。

1 个答案:

答案 0 :(得分:1)

使用grb foo,当您运行grep $x "$y" "${@-.}"时,实际命令为:

grep "-Irs" "--include" "'*.*rb'" "foo" "."

这是解决问题的快捷方法:

#!/bin/bash

function grep_shortcut {
    local x=$1 y=$2
    eval "x=($x)"
    shift 2
    echo grep "${x[@]}" "$y" "${@-.}"
    grep "${x[@]}" "$y" "${@-.}"
}

function grb {
    grep_shortcut "-Irs --include '*.*rb'" "$@"
}

grb foo

这是避免eval的另一种方式:

#!/bin/bash

function grep_shortcut {
    local x=("${@:2:$1}"); shift "$(( 1 + $1 ))"
    local y=$1; shift
    echo grep "${x[@]}" "$y" "${@-.}"
    grep "${x[@]}" "$y" "${@-.}"
}

function grb {
    grep_shortcut 3 -Irs --include '*.*rb' "$@"
}

grb foo