0

我想同时使用带有多个参数的 bash 别名和 bash 函数。我模拟 svn sub 命令。

$ svngrep -nr 'Foo' .
$ svn grep -nr 'Foo' .

我的期望是如下所示:

grep --exclude='*.svn-*' --exclude='entries' -nr 'Foo' .

但实际上,只有别名('svngrep')表现良好,函数('svn grep')会导致无效选项错误。如何编写我的 .bashrc?

#~/.bashrc

alias svngrep="grep --exclude='*.svn-*' --exclude='entries'"

svn() {
  if [[ $1 == grep ]]
then
  local remains=$(echo $@ | sed -e 's/grep//')
  command "$svngrep $remains"
else
  command svn "$@"
fi
}
4

3 回答 3

2

您想shift从位置参数中删除第一个单词:这保留了"$@".

svn() {
  if [[ $1 = grep ]]; then
    shift
    svngrep "$@"
  else
    command svn "$@"
  fi
}

使用 bash 的[[内置函数,single=用于字符串相等,double==用于模式匹配——在这种情况下你只需要前者。

于 2012-06-09T10:35:56.673 回答
0

svngrep不是变量。它是 bash 使用的别名。因此必须创建一个新变量,例如:

svngrep_var="grep --exclude='*.svn-*' --exclude='entries'"

并在您的代码段中使用它:

...
command "$svngrep_var $remains"
...
于 2012-06-09T07:49:27.240 回答
0

我自己重新考虑了这一点。并且工作正常!谢谢!

#~/.bashrc
alias svngrep="svn grep"
svn() {
if [[ $1 == grep ]]
then
    local remains=$(echo $* | sed -e 's/grep//')
    command grep --exclude='*.svn-*' --exclude='entries' $remains
else
  command svn $*
fi
}

我选择保持别名简单。我使用 $* 而不是 $@。

编辑:2012-06-11

#~/.bashrc
alias svngrep="svn grep"
svn() {
  if [[ $1 = grep ]]
  then
    shift
    command grep --exclude='*.svn-*' --exclude='entries' "$@"
  else
    command svn "$@"
  fi
}
于 2012-06-09T09:06:58.190 回答