【发布时间】:2012-12-14 03:03:29
【问题描述】:
在 bash 脚本中,第一行的#!/bin/bash 是什么意思?
更新:#!/bin/bash 和 #!/bin/sh 之间有区别吗?
【问题讨论】:
标签: bash
在 bash 脚本中,第一行的#!/bin/bash 是什么意思?
更新:#!/bin/bash 和 #!/bin/sh 之间有区别吗?
【问题讨论】:
标签: bash
这称为shebang,它告诉外壳程序在执行时用什么程序解释脚本。
在您的示例中,脚本将由bash shell 解释和运行。
其他一些 shebangs 示例是:
(来自维基百科)
#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby
还有一些我能想到的其他问题,例如:
#!/bin/ksh
#!/bin/awk
#!/bin/expect
例如,在带有 bash shebang 的脚本中,您可以使用 bash 语法编写代码;而在带有期望 shebang 的脚本中,您可以使用期望语法对其进行编码,依此类推。
对更新部分的回应:
这取决于/bin/sh 在您的系统上实际指向的内容。通常它只是指向/bin/bash 的符号链接。有时可移植脚本使用#!/bin/sh 编写只是为了表示它是一个shell 脚本,但它使用该特定系统上/bin/sh 引用的任何shell(可能它指向/bin/bash、/bin/ksh 或/bin/zsh )
【讨论】:
#!/bin/bash 和#!/bin/sh 之间有区别吗?
#!/bin/bash 表示在 bash 中运行此脚本。 #!/bin/sh 表示在 sh 中运行此脚本,这是默认的 unix shell,可能是 bash 或任何其他变体,如 ksh、dash、zsh 等
bash 以sh 运行时,它的行为与以bash 运行时不同(更像POSIX)。阅读手册;它确实涵盖了这个细节。
在 bash 脚本中,第一行的 #!/bin/bash 是什么意思?
在 Linux 系统中,我们有解释 UNIX 命令的 shell。现在Unix系统中有许多shell。其中,有一个叫bash的shell,在Linux中很常见,历史也很悠久。这是 Linux 中默认的 shell。
当您编写脚本(unix 命令的集合等)时,您可以选择指定可以使用哪个 shell。通常,您可以使用Shebang(是的,这就是它的名称)来指定它的外壳。
因此,如果您在脚本顶部使用 #!/bin/bash,那么您就是在告诉您的系统使用 bash 作为默认 shell。
现在来回答你的第二个问题:#!/bin/bash 和 #!/bin/sh 有区别吗?
答案是肯定的。当您告诉 #!/bin/bash 时,您就是在告诉您的环境/操作系统使用 bash 作为命令解释器。这是硬编码的东西。
每个系统都有自己的 shell,系统将使用它来执行自己的系统脚本。该系统 shell 可能因操作系统而异(大多数情况下它将是 bash。Ubuntu 最近使用 dash 作为默认系统 shell)。当您指定 #!/bin/sh 时,系统将使用它的内部系统 shell 来解释您的 shell 脚本。
访问link 以获取更多信息,我已在其中解释了该主题。
希望这会消除您的困惑...祝您好运。
【讨论】:
当脚本中的第一个字符是#! 时,称为shebang。如果您的文件以
#!/path/to/something 标准是运行 something 并将文件的其余部分作为输入传递给该程序。
话虽如此,#!/bin/bash、#!/bin/sh 甚至#!/bin/zsh 之间的区别在于是否使用 bash、sh 或 zsh 程序来解释文件的其余部分。 bash 和 sh 传统上只是不同的程序。在某些 Linux 系统上,它们是同一程序的两个副本。在其他 Linux 系统上,sh 是指向dash 的链接,而在传统的 Unix 系统(Solaris、Irix 等)上,bash 通常是与sh 完全不同的程序。
当然,该行的其余部分不必以 sh 结尾。也可以是#!/usr/bin/python、#!/usr/bin/perl,甚至是#!/usr/local/bin/my_own_scripting_language。
【讨论】:
sh 通常是 bash 运行兼容模式,自从 bash 成为大多数 Linux 发行版的默认 shell 和 IIRC 在此之前的好几年里,这是正确的,可以肯定地说它是已经 15 年,可能超过 20 年。
/bin/sh 是破折号。 Android 表示它使用ash 作为/bin/sh。
sh 兼容模式。如果我们深入研究 Solaris、Aix、HPUX、Ultrix、SCO 等,每个都有自己的默认 shell,它们将具有 sh 仿真(以保持 POSIX 兼容。)