我有一台ubuntu机器,默认shell设置为bash,两种方式都是$ PATH中的二进制文件:
$ which bash
/bin/bash
$ which sh
/bin/sh
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Mar 6 2013 /bin/sh -> bash*
但是当我尝试调用一个使用the inline file descriptor的脚本(只有bash可以处理,但不是sh)时,两个调用的行为都不同:
$ . ./inline-pipe
reached
$ bash ./inline-pipe
reached
$ sh ./inline-pipe
./inline-pipe: line 6: syntax error near unexpected token `<'
./inline-pipe: line 6: `done < <(echo "reached")'
我所指的示例脚本看起来像
#!/bin/sh
while read line; do
if [[ "$line" == "reached" ]]; then echo "reached"; fi
done < <(echo "reached")
真实的有点长:
#!/bin/sh
declare -A elements
while read line
do
for ele in $(echo $line | grep -o "[a-z]*:[^ ]*")
do
id=$(echo $ele | cut -d ":" -f 1)
elements["$id"]=$(echo $ele | cut -d ":" -f 2)
done
done < <(adb devices -l)
echo ${elements[*]}
答案 0 :(得分:3)
当bash
被调用为sh
时,它(主要)将自身限制为POSIX标准中的功能。进程替换不是这些特征之一,因此是错误。
答案 1 :(得分:-1)
理论上,它是bash的一个特性:如果你打电话为“sh”,它默认关闭它的所有功能。默认情况下,root shell是“/ bin / sh”。
其主要目标是安全性。辅助是在系统的某些shell之间产生某种程度的兼容性,因为它使系统脚本能够在备用(更快?更安全?)的环境中运行。
这是理论。
实际上这样做,开发团队中总会有人想要通过各种参数(安全性,简单性,安全性,稳定性)来减少和消除所有内容 - 但这些论点总是朝着删除的方向发展,删除,破坏)。
这是因为debian中的bash没有网络套接字,这是因为debian在20年内无法正常集成最好的压缩器(bz2,xz) - 这是因为root shell是默认的如此,如八十年代的PDP11那样原始。
答案 2 :(得分:-2)
我相信ubuntu上的sh
实际上是dash
,它比使用较少功能的bash小。