6

$0扩展为 shell 脚本的名称。

$ cat ./sample-script
#!/bin/bash
echo $0
$ chmod 700 ./sample-script
$ ./sample-script
./sample-script

如果通过符号链接调用 shell 脚本,则$0扩展为它的名称:

$ ln -s ./sample-script symlinked-script
$ ./symlinked-script
./symlinked-script

我怎样才能得到别名的名称?这里 `$0' 再次扩展为文件名:

$ alias aliased-script=./sample-script
$ aliased-script
./sample-script
4

3 回答 3

12

根据手册页,别名非常愚蠢

...读取命令时扩展别名,而不是执行命令时...

所以由于 bash 基本上只是用另一个字符串替换一个字符串然后执行它,因此命令无法知道别名中扩展了什么。

于 2012-04-22T19:22:34.107 回答
3

我想您已经知道这一点,但为了记录,答案是:您需要通过实现别名的代码进行合作。

alternate_name () {
  MY_ALIAS_WAS=alternate_name real_name "$@"
}

或者,如果您真的想使用被取代的别名语法:

alias alternate_name="MY_ALIAS_WAS=alternate_name real_name"

...进而...

$ cat ~/bin/real_name
#!/bin/sh
echo $0, I was $MY_ALIAS_WAS, "$@"
于 2012-04-22T19:26:56.980 回答
2

bash 不提供此功能。这就是为什么使用符号链接而不是别名来调用多路复用命令的原因。

于 2012-04-22T19:19:55.917 回答