使用符号链接时sh和bash之间的区别

时间:2013-05-14 19:14:16

标签: bash sh symlink

我有一个使用process substitution

的shell脚本

脚本是:

  #!/bin/bash
  while read line
  do
    echo "$line"
  done < <( grep "^abcd$" file.txt )

当我使用sh file.sh运行脚本时,我得到以下输出

$sh file.sh
file.sh: line 5: syntax error near unexpected token `<'
file.sh: line 5: `done < <( grep "^abcd$" file.txt )'

当我使用bash file.sh运行脚本时,脚本可以运行。

有趣的是,sh是映射到soft-link的{​​{1}}。

/bin/bash

我测试过以确保使用以下内容在我的shell中遵循符号链接:

$ which bash
/bin/bash
$ which sh
/usr/bin/sh
$ ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 9 Jul 23  2012 /usr/bin/sh -> /bin/bash
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 648016 Jul 12  2012 /bin/bash

由于$ ./a.out hello world $ ln -s a.out a.link $ ./a.link hello world $ ls -l a.out -rwx--x--x 1 xxxx xxxx 16614 Dec 27 19:53 a.out $ ls -l a.link lrwxrwxrwx 1 xxxx xxxx 5 May 14 14:12 a.link -> a.out sh file.sh的符号链接,我无法理解/bin/bash file.sh未执行sh的原因。

任何见解都将非常感激。感谢。

1 个答案:

答案 0 :(得分:4)

当作为sh调用时,bash进入posix        读取启动文件后的模式。在posix模式下无法识别进程替换。根据posix,<(foo)应该直接从名为(foo)的文件中输入。 (好吧,根据我对标准的解读。在很多地方语法都很模糊。)

编辑:来自bash manual

The following list is what’s changed when ‘POSIX mode’ is in effect:
...
Process substitution is not available.