我开始编写一个在 CentOS 7 中运行的 shell 脚本。它应该调用哪个解释器,shebang 行应该是什么样子?
我试过这个:
#!/bin/sh
但是当我输入时cd /bin
,ls -al
就会出现数百个子目录,其中没有一个是sh
.我应该使用哪一个?该脚本将运行一些 Maven 命令。
答案1
实际上,在 CentOS 7 上,/bin/sh
是 的符号链接/bin/bash
,这是大多数 Linux 发行版上默认提供的 shell。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 9 febr. 08:21 /bin/sh -> bash
(如果上面的命令返回No such file or directory
,那么你是对的,你会遇到问题。然后你可以运行which sh
来知道正确的路径)
因此,如果您的输出与我相同,则使用#!/bin/sh
和#!/bin/bash
是相同的。
作为替代方案,您可以使用这个 shebang:#!/usr/bin/env sh
或#!/usr/bin/env bash
。在这种情况下,它将运行PATH 中的第一个sh
或可用的内容,无论在、或任何地方设置。尽管它对于可移植性来说可能很方便,但请注意,如果您的 PATH 中有多个指定的可执行文件,则可能会存在一些安全问题。bash
sh
/bin
/usr/bin
sh
答案2
您可以让它调用您想要的任何解释器(bash、csh、zsh、sh、perl 或任何其他解释器)。
#!/bin/sh
是 POSIXly 正确的并且它应该运行。
的输出是什么ls /bin | grep s
?
另外,您可能需要检查您的文件权限。当我编写第一个脚本时,这让我丧命(chmod +x ./myscript.sh
)。