我有一个使用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
的{{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
的原因。
任何见解都将非常感激。感谢。
答案 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.