2

来自 zshbuiltins 手册,

   exec [ -cl ] [ -a argv0 ] simple command
          Replace  the  current shell with an external command rather than forking.  With -c clear the environment; with -l prepend - to the argv[0] string of the command executed (to simulate a login shell); 
   with -a argv0 set the argv[0] string  of  the  command executed.  See the section `Precommand Modifiers'.

我尝试使用-a 一个简单的脚本,但它似乎不起作用

[balakrishnan@mylap scripts]$ cat printer.sh;echo "-----";cat wrapper.sh
#!/bin/sh
echo $0 $1 $2 $3 $4
-----
#!/bin/zsh
argv0="$0"
exec -a "$argv0" printer.sh
[balakrishnan@mylap scripts]$ wrapper.sh 
printer.sh
[balakrishnan@mylap scripts]$ 

由于我设置wrapper.shargv0,我希望在printer.shechos时打印它$0。但它仍然打印printer.sh

4

1 回答 1

1

zsh设置argv[0]正确,但是当/bin/sh运行解释脚本时,它设置$0为正在运行的脚本的名称,忽略argv[0].

zsh手册页没有明确描述这种行为,但手册页bash确实:

论据

如果在选项处理之后参数仍然存在,并且既没有提供 the-c也没有 -s 提供选项,则假定第一个参数是包含 shell 命令的文件的名称。Ifbash以这种方式调用, $0设置为文件名,位置参数设置为其余参数。


您可以通过运行一个小型 C 程序而不是 shell 脚本来看到它argv[0]被正确设置:

#include <stdio.h>

int main(int argc, char** argv) {
    printf("%s\n", argv[0]);
    return 0;
}
于 2013-04-19T18:50:41.190 回答