You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:51:04