如何在Bash中覆盖或移除调用二进制程序的第一个参数?
Bash内置修改/移除argv[0]的方法
当然有啦!Bash从4.2版本开始就内置了直接修改程序argv[0]的能力,完全不需要额外写C程序或者折腾文件移动、别名,下面给你详细讲两种实用的方式:
1. 使用exec -a直接自定义/清空argv[0]
这是最直接的Bash内置方案,语法非常简单:
exec -a <新的argv0值> <目标程序路径> [后续参数...]
- 如果要覆盖argv[0]为自定义名称:比如想让
ls以为自己被叫做mylist启动,就这么写:
此时exec -a "mylist" /bin/ls -lls的argv[0]会是mylist,而不是默认的ls。 - 如果要完全移除argv[0](让它变成空字符串):只需要把
<新的argv0值>设为空即可:
这样目标程序收到的exec -a "" /path/to/your/program arg1 arg2argv[0]就是空字符串,相当于“移除”了第一个参数的内容。
注意:
exec会替换当前的Shell进程,如果不想替换当前Shell,只需要把命令放在子shell里:(exec -a "" /path/to/your/program arg1 arg2)执行完后会自动回到原来的Shell环境。
2. 兼容旧版Bash的替代方案(如果你的Bash低于4.2)
如果你的Bash版本比较旧(低于4.2),exec -a不可用,还可以用env命令来实现(env通常是系统自带的,也算轻量方案):
env -i "" /path/to/your/program arg1 arg2
这里env -i会清空环境变量(如果需要保留环境,可以去掉-i),然后把空字符串作为argv[0]启动目标程序,效果和上面的exec -a ""一致。
对比你原来的方案的优势
相比移动二进制文件或创建别名,这种内置方式的好处很明显:
- 不需要修改文件系统,不会影响其他用户或脚本对程序的调用
- 别名只在当前Shell会话生效,而
exec -a可以在任何脚本或临时调用中灵活使用 - 可以直接清空argv[0],这是别名和文件移动做不到的
内容的提问来源于stack exchange,提问作者Drastics
相关产品推荐
相关产品推荐

