在#!/ bin / sh之后加破折号'-'-

时间:2019-07-19 16:09:07

标签: shell centos sh

我一直在CentOS 7上处理一些脚本,有时我看到:

#!/bin/sh -

在第一行。在sh的手册页中,我在Special Parameters

下看到以下内容
   -      Expands to the current option flags as  specified  upon  invocation,
          by  the  set  builtin  command, or those set by the shell
          itself (such as the -i option).

这到底是什么意思?何时需要使用此特殊参数选项?

2 个答案:

答案 0 :(得分:5)

您正在阅读的文档与您正在查看的命令行无关:它是指特殊变量。在这种情况下,如果运行echo $-,将看到“调用时指定的当前选项标志...”。

如果您查看OPTIONS手册页的bash部分,则会发现:

--       A -- signals the end of options and disables  further  option  processing.
         Any  arguments  after  the  -- are treated as filenames and arguments.  An
         argument of - is equivalent to --.

换句话说,参数-仅表示“此参数后没有其他选项”。

您经常会看到这种用法,在这种情况下,您希望避免将以-开头的文件名意外地视为命令选项:例如,如果当前目录中有一个名为-R的文件,运行ls *实际上会像ls -R一样会产生递归列表,而ls -- *不会特别对待-R文件。

#!行中使用单破折号是为了安全起见。您可以了解有关here的更多信息。

答案 1 :(得分:-2)

/ bin / sh是代表系统外壳程序的可执行文件。实际上,通常将其实现为指向可执行文件的符号链接,无论该shell是系统shell还是该可执行文件。系统外壳是系统脚本应使用的默认外壳。在Linux发行版中,长期以来,这通常是bash的符号链接,以至于总是将/ bin / sh链接到bash或bash兼容的shell已成为一种惯例。 但是,在最近几年中,Debian(和Ubuntu)决定将系统外壳程序从bash切换为破折号-类似的外壳程序-打破了Linux(以及GNU)使用bash的悠久传统/ bin / sh。 Dash被视为更轻便,速度更快的Shell,可以提高启动速度(以及其他需要大量Shell脚本(例如软件包安装脚本)的东西)。

Dash与bash完全兼容,基于相同的POSIX标准。但是,它没有实现bash特定的扩展。现有的脚本使用#!/ bin / sh(系统外壳程序)作为它们的shebang,但是需要特定于bash的扩展名。目前认为这是应该由Debian和Ubuntu修复的错误,它们要求/ bin / sh指向破折号后才能工作。

即使Ubuntu的系统外壳指向破折号,但作为用户的登录外壳此时仍是bash。也就是说,当您在Linux中的任何地方登录到终端仿真器时,您的登录Shell将为bash。当交互式使用外壳程序时,操作速度并不是什么大问题,并且用户熟悉bash(并且可能在其主目录中具有bash特定的自定义设置)。