“bash 可执行文件”和“bash -c 可执行文件”之间的区别

“bash 可执行文件”和“bash -c 可执行文件”之间的区别

我的理解是,这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 filebashfile其视为命令,通过查找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)和可执行文件 外壳脚本

相关内容