我一直在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).
这到底是什么意思?何时需要使用此特殊参数选项?
答案 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特定的自定义设置)。