Bash

CentOS 7:什麼是 /bin/sh?它看起來像 Bash,但似乎是別的東西

  • September 11, 2021

當我像這樣執行 Centos 7 Docker Image

docker run -it centos:7 bash

執行使用Process Substitution的東西很好(正如預期的那樣,因為 Bash 從一開始就支持 Process Substitution - 實際上是 Bash 1.4.x)。

例如:

while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)

但是當我切換到*/bin/sh*時,相同的程式碼不再起作用

/bin/sh
while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)
sh: syntax error near unexpected token `<'

雖然*/bin/sh*似乎是 Bash

/bin/sh --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

但是,為什麼程序替換不再起作用呢?不過,其他非 POSIX 功能似乎也可以工作

echo ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin

是的bash,當呼叫 as 時sh,它以 POSIX 模式執行,禁用其所有僅 bash 功能。來自手冊 -使用名稱 sh 呼叫

如果使用名稱 sh 呼叫 Bash,它會盡可能地模仿 sh 的歷史版本的啟動行為,同時也符合 POSIX 標準

$ ls -lrth /bin/sh
lrwxrwxrwx. 1 root root 4 Aug 26  2018 /bin/sh -&gt; bash
$ /bin/bash -c 'set -o | grep posix'
posix           off
$ /bin/sh -c 'set -o | grep posix'
posix           on

啟用模式後,posix將不會啟用程序替換等非標準功能。請參閱Bash POSIX 模式以查看其在該模式下執行的完整行為。

從 shell 的 5.1 版開始,程序替換在 POSIX 模式下可用。

引用自:https://unix.stackexchange.com/questions/668262