gpt4 book ai didi

linux - 为什么当 bash 被称为 sh 时,它的行为会有所不同?

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:32 25 4
gpt4 key购买 nike

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

最佳答案

bash 被作为 sh 调用时,它(大部分)将自身限制为 POSIX 标准中的功能。进程替换不是这些功能之一,因此会出现错误。

关于linux - 为什么当 bash 被称为 sh 时,它的行为会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com