Псевдоним bash с параметрами

Я хотел бы переключиться с csh на bash, затем я должен установить.bashrc с помощью команд, которые я использую. Переводить псевдоним с параметрами, кажется, не так просто, как я полагал. CSH:

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

парам \!* означает все параметры в командной строке; Затем я попытался для Баш:

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 & ;}
Другие вопросы по тегам