为什么bash在被称为sh时表现不同?

时间:2013-11-25 14:19:00

标签: linux bash shell file-descriptor

我有一台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[*]}

3 个答案:

答案 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小。