![在 Bash 中包装别名](https://linux22.com/image/95928/%E5%9C%A8%20Bash%20%E4%B8%AD%E5%8C%85%E8%A3%85%E5%88%AB%E5%90%8D.png)
将旧的 .cshrc 文件转换为 .bash_aliases 文件。我遇到了一些有关转换的语法问题,但这需要更深入的 Bash 知识。
在 [t]Csh 中,打开 xwindow 应用程序时 shell 会挂起,除非它们是使用 & 符号在后台打开的(例如,firefox &)
。为了避免这种情况,我会在 Csh 中创建某些别名以在后台运行任务,但仍然如此)让命令行保持打开状态(使用\!*
):
alias ff 'firefox \!* &
当它转换为 Bash 时,它会执行如下操作:
ff () { command ff "$@" & }
我仍然不确定什么时候使用函数以及什么时候使用别名,但是当我尝试围绕已定义的别名包装更多选项时,我陷入了困境:
win () { command xterm -geometry 105x25 -font 8x13 -bc "$@" & }
blue () { command win -bg gray33 -fg gray39 "$@" ; }
如果我删除命令之内蓝色的(例如,blue () { win -bg ...
)它按预期工作。
所以我很好奇两件事:
- 何时使用别名与函数定义?
- 何时使用命令;如果我这样做了,
alias win='xterm ...'
那么我必须做什么command win
?
答案1
第一,将函数用于任何不平凡的事情;一个简单的别名是默认设置一些标志:
# no license spam
alias gdb='gdb -q'
对于几乎任何更复杂的事情,我都使用函数。
二、command
指命令,诸如此类/bin/ls
;别名不是命令,函数也不是命令。您可能没有win
命令,因此command win
将无法调用该函数,因为这不是命令。
顺便说一句,“无限”循环非常容易创建
alias fooalias=foofunc
function foofunc() { fooalias; }
这就是为什么如果有人正在编写一个函数与命令同名thencommand
变得非常方便,因此 shell 不会永远尝试调用该函数:
# loops until stack death or segfault or something
function xterm() { xterm ... }
# good
function xterm() { command xterm ... }
如果您只是想获取其他函数来调用其他可能是命令或函数的函数,只需按原样调用即可。确实需要调用该命令的必须使用command
.
function winwinwin () { winwin ... }
function winwin () { win ... }
function win () { xterm ... }
function xterm () { command xterm ... }
winwinwin
将调用该winwin
函数 将调用该win
函数 将调用该xterm
函数 然后将调用指定的command
.
在function
前面,这是可选的,但我使用它是因为它使搜索函数变得相当容易(fgrep function ...
),而不是必须寻找后面可能有空格的东西,并且错误嗯,括号需要在我使用的正则表达式引擎中转义吗?对于优先级,很容易进行测试或打印通知来显示正在发生的情况:
ls () { ls -k; echo funcall; }
alias ls='echo blat'
ls
一般来说,首先定义函数,然后设置别名可能是一个更好的主意,以免令人意外:
bash-4.1$ alias ls='echo blat'
bash-4.1$ ls () { command ls -k; echo funcall; }
bash: syntax error near unexpected token `('
bash-4.1$ function ls () { command ls -k; echo funcall; }
bash-4.1$