为什么脚本适用于/ bin / bash而不是/ bin / sh?

时间:2012-06-16 07:51:52

标签: bash shell sh

我试图理解为什么该脚本适用于#!/bin/bash但不适用#!/bin/sh。我正在运行Cygwin,sh.exebash.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

2 个答案:

答案 0 :(得分:5)

尽管是同一个文件,shell在运行时会分析自己的名称,并切换到普通shell或bash模式。

答案 1 :(得分:2)

问题

  1. Bash是Bourne shell的超集,所以在Bash中有很多东西是可能的,在更有限的shell中是不可能的。
  2. 即使 sh bash 的硬链接,当调用 sh 时,它的行为也会有所不同。 Bash shell支持的许多功能在此模式下无效。
  3. 解决方案

    1. 从脚本中删除bashisms,包括第4行中的流程替换等漂亮功能。
    2. 以Bash运行您的脚本,而不是香草Bourne。