如何解决bash中使用exec -a修改$0值不生效的问题
问题复现
你现有的两个脚本内容如下:
原有脚本
print_argv0.sh
#!/bin/bash echo $0
caller.sh
#!/bin/bash exec -a modified.sh ./print_argv0.sh
运行./caller.sh时期望输出modified.sh,实际输出的是print_argv0.sh的绝对路径。
问题原因
直接通过路径执行脚本时,内核会根据脚本的shebang行调用对应的解释器(此处为bash),并且会把脚本的实际路径作为参数传给解释器,exec -a设置的argv0会被bash默认重置为脚本的实际路径,因此无法通过$0读取到你设置的modified.sh。
解决方法
方法1:修改caller.sh,显式调用解释器执行目标脚本
把caller.sh的内容修改为如下即可生效:
#!/bin/bash exec -a modified.sh bash ./print_argv0.sh
这种方式相当于把modified.sh作为argv0传给bash解释器,bash会把这个值赋值给脚本内的$0,运行后就会输出你期望的modified.sh。
方法2:修改print_argv0.sh,直接读取进程的原始argv0
如果你不想修改caller脚本,可以直接在目标脚本里读取proc文件系统下存储的原始启动参数,不受bash重置$0的影响:
#!/bin/bash # 读取/proc/self/cmdline的第一个字段(原始argv0) head -z -n1 /proc/self/cmdline | tr -d '\0'
注意:该方法仅适用于支持procfs的Linux系统,macOS等其他类Unix系统不支持该写法。
内容的提问来源于stack exchange,提问作者impactaky
相关产品推荐
相关产品推荐

