skip to Main Content

I have been working on a few scripts on CentOS 7 and sometimes I see:

#!/bin/sh -

on the first line. Looking at the man page for sh I see the following under the 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).

What exactly does this mean? When do I need to use this special parameter option??

2

Answers


  1. /bin/sh is an executable representing the system shell. Actually, it is usually implemented as a symbolic link pointing to the executable for whichever shell is the system shell. The system shell is kind of the default shell that system scripts should use. In Linux distributions, for a long time this was usually a symbolic link to bash, so much so that it has become somewhat of a convention to always link /bin/sh to bash or a bash-compatible shell. However, in the last couple of years Debian (and Ubuntu) decided to switch the system shell from bash to dash – a similar shell – breaking with a long tradition in Linux (well, GNU) of using bash for /bin/sh. Dash is seen as a lighter, and much faster, shell which can be beneficial to boot speed (and other things that require a lot of shell scripts, like package installation scripts).

    Dash is fairly well compatible with bash, being based on the same POSIX standard. However, it doesn’t implement the bash-specific extensions. There are scripts in existence that use #!/bin/sh (the system shell) as their shebang, but which require bash-specific extensions. This is currently considered a bug that should be fixed by Debian and Ubuntu, who require /bin/sh to be able to work when pointed to dash.

    Even though Ubuntu’s system shell is pointing to dash, your login shell as a user continues to be bash at this time. That is, when you log in to a terminal emulator anywhere in Linux, your login shell will be bash. Speed of operation is not so much a problem when the shell is used interactively, and users are familiar with bash (and may have bash-specific customization in their home directory).

    Login or Signup to reply.
  2. The documentation you are reading has nothing to do with the command line you’re looking at: it’s referring to special variables. In this case, if you run echo $- you will see “the current option flags as specified upon invocation…”.

    If you take a look at the OPTIONS part of the bash man page, you will find:

    --       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 --.
    

    In other words, an argument of - simply means “there are no other options after this argument”.

    You often see this used in situation in which you want to avoid filenames starting with - accidentally being treated as command options: for example, if there is a file named -R in your current directory, running ls * will in fact behave as ls -R and produce a recursive listing, while ls -- * will not treat the -R file specially.

    The single dash when used in the #! line is meant as a security precaution. You can read more about that here.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search