差异,当符号链接使用

问题描述:

我有一个使用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是映射到/bin/bashsoft-link

$ 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执行是一个符号链接/bin/bash

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

+0

我猜你是不执行的bash,因为'/ bin'在'$ PATH'中的'/ usr/bin'之前,'/ bin'中有'sh'程序。 – Lennart

+0

但是'哪个sh'显示'/ bin/sh'指向'/bin/bash'...thus不应该是'/ bin/bash'被执行?谢谢 – Bill

+0

嗯。但很明显,sh和bash不执行相同的程序。 – Lennart

当作为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. 
+1

由于'sh'是一个到'bash'的符号链接(请参阅我的问题中'which'和'ls -l'的输出),不应执行'sh'命令调用'bash'?我不关心为什么'sh file.sh'给出错误,但是当'sh'是到'bash'的符号链接时,为什么'sh file.sh'不等于'bash file.sh'。谢谢。 – Bill

+1

@Bill'sh file.sh'给出错误*,因为*'sh file.sh'不等于'bash file.sh'。 'bash'只是简单地解析和执行相同的脚本,当它被调用为'sh'而不是'bash'时。 – chepner

+0

@WilliamPursell因为'sh'是符号链接到'bash',不应该'bash'被执行?这就是符号链接的含义,如果我没有错......请在问题中查看'which'和'ls -l'的输出。谢谢 – Bill