来自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
。
答案 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;
}