在 Bash 中包装别名

在 Bash 中包装别名

将旧的 .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 ...)它按预期工作。


所以我很好奇两件事:

  1. 何时使用别名与函数定义?
  2. 何时使用命令;如果我这样做了,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$ 

相关内容