带参数的bash别名

leo*_*zos 3 bash alias bashrc

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

alias gr 'xmgrace -legend load -nxy \!* -free -noask&'
Run Code Online (Sandbox Code Playgroud)

param\!*表示命令行中的所有参数;然后我尝试了 bash:

alias gr='xmgrace -legend load -nxy $@ -free -noask&'
alias gr='xmgrace -legend load -nxy $(@) -free -noask&'
Run Code Online (Sandbox Code Playgroud)

但都没有奏效。

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

alias t 'set t=\`pwd\``;echo $t'
alias tt 'cd $t'
Run Code Online (Sandbox Code Playgroud)

我尝试了很多东西,但没有任何结果。

hee*_*ayl 5

这不是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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,foo最后添加了别名情况下的第一个参数,因此命令foo file.txt被扩展为:

grep -f "" bar.txt file.txt
Run Code Online (Sandbox Code Playgroud)

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

grep -f file.txt bar.txt
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你可以定义一个函数,如:

gr () { xmgrace -legend load -nxy "$@" -free -noask & ;}
Run Code Online (Sandbox Code Playgroud)