【问题标题】:Writing a Bash script without the shebang line编写没有 shebang 行的 Bash 脚本
【发布时间】:2012-04-14 06:16:44
【问题描述】:

我在 CentOS 下写了一个 bash 脚本,运行良好。在另一台电脑上是错误的。我一开始忘记了shebang,但是为什么在我的电脑上很好呢? 我认为这是一个非常初学者的问题,但我试了一下。谢谢。

更新: 又一个问题出现了。使用 ./filename.shsh filename.sh 执行有什么区别?

【问题讨论】:

  • 您是否使用sh script.sh 运行它?在这种情况下,您不需要 shebang,因为 shell 已经知道使用哪个可执行文件来运行它。
  • 我使用 scriptname.sh 运行它,它运行良好。为什么?
  • 您是否让它在其他系统上可执行?尝试以 ./scriptname.sh 而不是 scriptname.sh 运行它
  • 您的意思是您使用./scriptname.sh <params> 运行它?或者你把它放在 $PATH 的某个地方?
  • “在另一台电脑上出错了。” 我想这意味着当你运行脚本时电脑伸出手打了你一巴掌。如果没有,请告诉我们您尝试运行脚本时发生了什么(如果有确切的错误消息等)

标签: bash


【解决方案1】:

如果execve 对您的脚本失败,那么将使用/bin/sh。在一个系统上/bin/sh 可能是POSIX sh,而在另一个系统上它可能是bash 的别名;您的脚本可能依赖于bash 功能。

【讨论】:

  • 一些 shell 会这样做,但不是全部 - 我见过使用自己而不是 /bin/sh 作为默认值的 shell。
【解决方案2】:

脚本开头没有 shebang 会在调用脚本时在当前运行的任何 shell 中执行。如果您确定脚本将从 bash 启动,而不是从任何其他 shell(ksh、csh 等)启动,则不需要 shebang,因为将启动相同的解释器。

【讨论】:

  • 另外,我相信有些系统使用别名,所以调用 sh 可能实际上运行不同的 shell
  • 这并不总是正确的。我见过以 /bin/sh 开头的 shell,而不是默认开头的 shell。
  • bash 实际上是唯一自己启动的 shell。所有其他 shell 都使用sh,包括zshkshdash,以及使用exec*p 系列函数的任何工具。
  • @thatotherguy,嗯?在没有任何 shebang 的情况下,exec* 函数通常会失败,而不是使用 /bin/sh
  • @CharlesDuffy exec*p 使用 sh。其他非p exec* 函数将失败。它记录在in POSIX
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 2014-09-29
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多