$ bash -c 'echo "0 is $0 1 is $1"' abc def
0 is abc 1 is def
$ echo 'echo "0 is $0 1 is $1"' > bashtest
$ bash bashtest abc def
0 is bashtest 1 is abc
第二次运行相当于如果我将bash测试变成带有shebang的shellcript然后直接运行...
基本上我想知道为什么abc并不总是$1
。使用$0
时,它会变为bash -c
。
答案 0 :(得分:10)
我也不知道这一点。但是man page提到了它:
-c string:如果存在-c选项,则从中读取命令 串。如果字符串后面有参数,则为 分配给位置参数,从$ 0开始。
ARGUMENTS
部分有更详细的解释:
ARGUMENTS
如果参数处理后仍然存在参数,则-c和-c都不存在 -s选项已被提供,第一个参数被假定为 包含shell命令的文件的名称。如果在此调用bash 时尚,$ 0设置为文件的名称,并且位置参数 - ters设置为其余参数。 Bash读取并执行com- 来自此文件的mands,然后退出。 Bash的退出状态是退出状态 在脚本中执行的最后一个命令的tus。如果没有命令 执行后,退出状态为0.首先尝试打开 文件在当前目录中,如果没有找到文件,那么shell 在PATH中的目录中搜索脚本。