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

关于bash中-c选项的理解误区与执行结果疑问

问题分析与解决

你对bash -c的理解误区

当执行bash -c ./foo.sh x y时,你的逻辑错在:

  • ./foo.sh是bash要执行的命令字符串,bash会单独启动一个子进程去运行这个脚本
  • x和y是执行bash -c的这个bash进程自身的$0和$1,和被调用的./foo.sh脚本完全无关。./foo.sh作为独立子进程,它的$0默认是自身路径,且你没给它传任何参数,所以$1为空,这就是实际输出和预期不符的原因。

实现目标的两种方法

你的需求是让foo.sh认为自身名称是x,同时传递位置参数,以下是可行方案:

方案1:用bash的-a选项直接设置$0

bash的-a选项可以指定当前shell的$0值,用它执行脚本时,脚本的$0会被替换为指定值:

bash -a x ./foo.sh y

执行后输出:par 0 is x, par 1 is y

方案2:用exec -a指定脚本的$0

exec -a命令可以设置新进程的$0,结合bash -c实现需求:

bash -c 'exec -a x ./foo.sh y'

如果需要传递多个参数,用"$@"批量传递更灵活:

bash -c 'exec -a "$0" "$1" "${@:2}"' x ./foo.sh y z

这里x是foo.sh的$0,y和z会分别成为foo.sh的$1和$2。

内容的提问来源于stack exchange,提问作者user1934428

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:55:23