alias rm='rm -i'
我的文件中有~/.bashrc
(我刚刚了解到它是被认为是不好的做法由一些)。
运行它时似乎没有考虑别名nice
:
bli@naples:~$ touch test
bli@naples:~$ rm test
rm: remove regular empty file 'test'? n
bli@naples:~$ nice rm test
bli@naples:~$
为什么会这样?
答案1
默认情况下,nice
是一个外部命令:
$ command -v nice
/usr/bin/nice
这意味着它不知道别名,这是 shell 功能:
$ alias foo='echo hello'
$ foo
hello
$ nice foo
nice: foo: No such file or directory
然而,shell 有一个功能允许别名还扩展更多别名。您以空格结束展开。
$ alias nice='/usr/bin/nice '
找到最后的那个空格;这一点很重要。
现在...
$ nice foo
hello
$ command -v nice
alias nice='/usr/bin/nice '
如果您希望 shell 进行别名扩展,则任何外部命令都可以使用这样的别名进行包装。
答案2
nice
不是bash
。bash
替换别名,而不替换别名nice
。使用别名是 bash 独有的功能。还有 zsh、ksh、...so:shell 功能。nice
不是一个外壳。
答案3
nice
将使用系统调用之一exec(3)
,该系统调用对 shell 别名一无所知。全局别名替换可以在某些 shell(例如 ZSH)中完成,尽管我认为它是一个巨大的枪,我只是将它作为对未来 10 代的警告而提及:
% alias -g rm='rm -i'
% echo hi rm there
hi rm -i there
%