3

我有一个使用的 shell 脚本process substitution

脚本是:

  #!/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映射到/bin/bash.

$ 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

我测试以确保在我的 shell 中使用以下符号链接:

$ ./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它是指向/bin/bash.

任何见解将不胜感激。谢谢。

4

1 回答 1

4

当作为 sh 调用时,bash 在读取启动文件后进入 posix 模式。在 posix 模式下无法识别进程替换。根据 posix,<(foo)应该直接从名为(foo). (嗯,也就是按照我的阅读标准。语法很多地方都是模棱两可的。)

编辑:来自bash 手册

The following list is what’s changed when ‘POSIX mode’ is in effect:
...
Process substitution is not available.
于 2013-05-14T19:20:23.750 回答