差异,当符号链接使用
我有一个使用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/bash
的soft-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
。
任何见解将不胜感激。谢谢。
当作为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.
由于'sh'是一个到'bash'的符号链接(请参阅我的问题中'which'和'ls -l'的输出),不应执行'sh'命令调用'bash'?我不关心为什么'sh file.sh'给出错误,但是当'sh'是到'bash'的符号链接时,为什么'sh file.sh'不等于'bash file.sh'。谢谢。 – Bill
@Bill'sh file.sh'给出错误*,因为*'sh file.sh'不等于'bash file.sh'。 'bash'只是简单地解析和执行相同的脚本,当它被调用为'sh'而不是'bash'时。 – chepner
@WilliamPursell因为'sh'是符号链接到'bash',不应该'bash'被执行?这就是符号链接的含义,如果我没有错......请在问题中查看'which'和'ls -l'的输出。谢谢 – Bill
我猜你是不执行的bash,因为'/ bin'在'$ PATH'中的'/ usr/bin'之前,'/ bin'中有'sh'程序。 – Lennart
但是'哪个sh'显示'/ bin/sh'指向'/bin/bash'...thus不应该是'/ bin/bash'被执行?谢谢 – Bill
嗯。但很明显,sh和bash不执行相同的程序。 – Lennart