带参数的 bash 别名

带参数的 bash 别名

我想从 csh 切换到 bash,然后我必须使用我使用的命令设置 .bashrc。使用参数转换别名似乎并不像我认为的那么容易。csh:

alias gr 'xmgrace -legend load -nxy \!* -free -noask&'

该参数\!*表示命令行上的所有参数;然后我尝试使用 bash:

alias gr='xmgrace -legend load -nxy $@ -free -noask&'
alias gr='xmgrace -legend load -nxy $(@) -free -noask&'

但都没有奏效。

另一个问题来自于记住当前目录 csh:

alias t 'set t=\`pwd\``;echo $t'
alias tt 'cd $t'

我尝试了很多方法但都没有任何结果。

答案1

别名的工作方式并非如此bash,别名中的所有位置参数bash都附加在命令的末尾,而不是您定义的位置。要解决此问题,您需要使用bash函数。

举个例子会让你更清楚:

$ cat file.txt 
foo
$ cat bar.txt 
foobar
spamegg
$ grep -f file.txt bar.txt 
foobar

$ alias foo='grep -f "$1" bar.txt'  ## Alias 'foo'
$ foo file.txt 
grep: : No such file or directory

$ spam () { grep -f "$1" bar.txt ;}  ## Function 'spam'
$ spam file.txt 
foobar

如您所见,别名的第一个参数foo被添加在末尾,因此命令foo file.txt被扩展为:

grep -f "" bar.txt file.txt

而在函数的情况下,spam命令被正确扩展为:

grep -f file.txt bar.txt

因此,就您而言,您可以定义如下函数:

gr () { xmgrace -legend load -nxy "$@" -free -noask & ;}

相关内容