Bash脚本-c选项下source命令$1参数异常问题咨询
问题分析:source执行脚本时$1非空的原因
脚本内容
abc.sh的代码如下:
#!/bin/bash echo First Arg: $0 echo Second Arg: $1 a=$(ls) echo Directory contents: $a
执行命令
执行的bash命令:
/usr/bin/bash -c 'source "$0" && exec "$@" ' /home/usr/rob/abc.sh /home/usr/rob/abc.sh ARG1
问题描述
根据Bash文档,-c选项会读取给定字符串中的命令,字符串外的第一个参数会传递给子shell的$0,因此source "$0"会解析为source /home/usr/rob/abc.sh。预期中source执行脚本时$1应为空,但实际输出里$1是脚本路径,而exec "$@"的参数输出符合预期,请问该现象的原因是什么?
原因解释
当通过bash -c启动子shell时,字符串外的参数分配规则为:
- 第一个参数(
/home/usr/rob/abc.sh)被设置为子shell的$0 - 剩余的所有参数(
/home/usr/rob/abc.sh、ARG1)会成为子shell的位置参数$1、$2
而source命令的特性是在当前shell环境中执行脚本,不会重置位置参数——也就是说,被source的脚本会直接继承当前shell的位置参数列表。
因此在source "$0"执行abc.sh时,当前子shell的$1正是/home/usr/rob/abc.sh(即bash -c命令里$0之后的第一个参数),所以abc.sh中echo Second Arg: $1会输出该路径。
而exec "$@"会将$@展开为子shell的位置参数列表(/home/usr/rob/abc.sh和ARG1),exec启动abc.sh时会创建新进程,新进程的位置参数会被重新初始化:$0为脚本路径,$1为ARG1,这就符合预期输出。
内容的提问来源于stack exchange,提问作者user3103957
相关产品推荐
相关产品推荐

