PowerShell 脚本最好也有一个 shebang 吗?

PowerShell 脚本最好也有一个 shebang 吗?

Shell 脚本在具有舍邦像这样:

#!/bin/bash
echo "The shebang above this line works like a typical a comment but with a purpose"

PowerShell 脚本也是 shell 脚本。所以这样做应该没问题:

#!/usr/local/bin/pwsh
echo "The shebang above this line works like a typical a comment but with a purpose"

如果该脚本适用于 Windows 计算机,则似乎没有意义,但对于 Linux 和 Mac 计算机,它们似乎有意义。

您认为 PowerShell 脚本最好也有一个 shebang 吗?

答案1

当您在 UNIX/Linux 派生系统上运行可执行脚本时,内核(有时是 shell)会在第一行查找#!(shebang) 标记,该标记指示要使用的解释器的名称。

如果您没有 shebang,则没有关于执行脚本的方法的明确信息,并且由用户明确指定解释器。

例如,

bash somescript         # user calls bash explicitly to run the script

chmod a+x somescript    # make executable
head -n1 somescript     # show the first line
#!/bin/bash

./somescript            # the script itself defines bash to execute it

这同样适用于任何解释器,而不仅仅是标准 shell。所以你可以有#!/bin/awk, #!/usr/bin/perl, 等等。

同样,您没有理由不#!/usr/local/bin/pwsh提供解释器可以执行从中读取的代码标准输入。这就是我想要做的。

答案2

PowerShell 脚本主要在 Windows 下运行,该操作系统关注除.exe.com、 之外的所有文件的文件扩展名.cmd.bat这些文件是直接执行的。 Windows 也没有可执行文件的概念——Unix 操作系统中所谓的“可执行”位。

另一方面,Linux 对标记为可执行文件的文件使用 shebang 来找出要使用的解释器,因此 shebang 变得至关重要。

您认为 PowerShell 脚本最好也有一个 shebang 吗?

对于 Windows 机器来说,它毫无意义,对于 Linux 机器来说,它完全有意义。最终由您决定。添加 PS shebang 不会有什么坏处,所以你可以将它添加到你所有的脚本中,只是我不知道人们在 Linux 下使用 PS。

答案3

一般来说,您希望您的 shebang 开始,#!/usr/bin/env因为 env 的位置始终位于/usr/bin/所有 x-nix 上。与 不同envbash有时可以在/usr/bin/bin两者中(取决于操作系统)。/usr/bin/env将搜索您的路径以找到正确的可执行文件并使您的脚本更加可移植。

#!/usr/bin/env pwsh

会在你的路径中找到pwsh,前提是你不是 root,因为 root 通常不会/usr/local/bin在路径中包含

例外情况是当您处理具有多个环境的程序(例如 python virtualenv)时,其中 shebang 用于调用 python 的特定环境。但 virutalenv 永远不可移植,因此这里牺牲可移植性是一致的。

相关内容