Почему скрипт будет работать с /bin/bash, но не с /bin/sh?

Я пытаюсь понять, почему скрипт будет работать с #!/bin/bash, но не с #!/bin/sh. Я использую Cygwin, и оба sh.exe и bash.exe кажутся идентичными (одинаковый размер файла).

$ cat 1.sh
#!/bin/sh
while read line; do
  echo ${line:0:9}
done < <(help | head -5)

$ ./1.sh
./1.sh: line 4: syntax error near unexpected token `<'
./1.sh: line 4: `done < <(help | head -5)'

$ cat 2.sh
#!/bin/bash
while read line; do
  echo ${line:0:9}
done < <(help | head -5)

$ ./2.sh
GNU bash,
These she
Type `hel
Use `info
Use `man

person Steven Penny    schedule 16.06.2012    source источник


Ответы (2)


Несмотря на то, что это один и тот же файл, оболочка анализирует свое имя при запуске и переключается либо в режим простой оболочки, либо в режим bash.

person Oleg V. Volkov    schedule 16.06.2012
comment
документация (о 8-м абзаце раздела) - person Dennis Williamson; 16.06.2012
comment
См. gnu.org/software /bash/manual/html_node/ тоже - person Frederick Cheung; 16.06.2012

Проблемы

  1. Bash — это надмножество оболочки Bourne, поэтому в Bash возможно многое, что невозможно в более ограниченных оболочках.
  2. Даже если sh является жесткой ссылкой на bash, он ведет себя иначе, когда вызывается как sh. Многие функции, поддерживаемые оболочкой Bash, не будут работать в этом режиме.

Решения

  1. Удалите из сценария свои bashisms, включая полезные функции, такие как подстановка процессов в строке 4.
  2. Запустите свой скрипт как Bash, а не как vanilla Bourne.
person Todd A. Jacobs    schedule 16.06.2012