Bash
CentOS 7:什麼是 /bin/sh?它看起來像 Bash,但似乎是別的東西
當我像這樣執行 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 -> 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 模式下可用。