如何执行但保持相同的argv0

时间:2013-04-19 18:42:01

标签: zsh

来自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.sh设置为argv0,我希望在printer.sh回声$0时打印。但它仍然打印printer.sh

1 个答案:

答案 0 :(得分:1)

zsh正确设置argv[0],但当运行/bin/sh来解释脚本时,它会将$0设置为正在运行的脚本的名称,忽略{{1} }}

argv[0]手册页未明确描述此行为,但zsh联机帮助页确实如此:

  

ARGUMENTS

     

如果参数处理后参数仍然存在,bash-c都没有     已提供-s选项,假设第一个参数为     包含shell命令的文件的名称。如果在此调用bash     时尚, $0设置为文件名,位置参数 -     ters被设置为剩下的参数。


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

#include <stdio.h>

int main(int argc, char** argv) {
    printf("%s\n", argv[0]);
    return 0;
}