我的理解是,这bash -c file
与在交互式 bash shell 中调用file
, wherebash file
意味着使用 bash 解释文件(就好像它是 shell 脚本一样)。这准确吗?这是否是您无法运行的原因,bash <executable>
因为它会尝试将文件解释为 shell 脚本,而不是分叉并运行 exec 文件?
答案1
首先,从bash 文档:
-c 字符串
处理选项后从字符串中读取并执行命令,然后退出。任何剩余的参数都分配给位置参数,从 $0 开始。
因此,当您提供-c
选项时,bash
请将 string after-c
视为命令序列,然后在子进程环境中执行这些命令。因此,当您调用 时bash -c file
,bash
将file
其视为命令,通过查找PATH
环境变量来查找它。如果file
找到,则执行它,否则将引发命令未找到错误。
当您调用时bash file
,bash 只是将file
其视为外壳脚本,读取并执行命令file
,然后退出。再次,从bash 文档:
如果选项处理后仍有参数,并且未提供 -c 和 -s 选项,则假定第一个参数是包含 shell 命令的文件的名称(请参阅 Shell 脚本)。当以这种方式调用 Bash 时,$0 将设置为文件名,位置参数将设置为其余参数。 Bash 从此文件读取并执行命令,然后退出。 Bash 的退出状态是脚本中执行的最后一个命令的退出状态。如果没有执行任何命令,则退出状态为 0。
所以,你的理解是对的。
答案2
只是总结:
bash <file>
只能执行外壳脚本bash -c <file>
可以执行二进制文件 (例如/usr/bin/date
,/usr/bin/echo
)和可执行文件 外壳脚本