关于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
相关产品推荐
相关产品推荐

