Centos 7 Dockerイメージをこのように実行すると、
docker run -it centos:7 bash
使用中のアイテムの実行プロセスの交換問題ありません。予想通り、Bashは最初からプロセス置換をサポートしました。実際には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バッシュだと思います。
/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
答え1
はい、bash
呼び出されると、sh
POSIXモードで実行され、すべてのbashのみの機能が無効になります。マニュアルで -名前shで呼び出す
Bash が sh 名で呼び出されると、POSIX 標準に準拠しながら、sh の以前のバージョンの起動動作をできるだけ近づけて模倣しようとします。
$ 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
プロセス交換などの非標準機能は有効になりません。バラよりバッシュPOSIXモードこのモードで実行される全体の動作を確認してください。
シェルバージョン5.1以降、POSIXモードでプロセスを置き換えることができます。
答え2
BashのPOSIXモードでは、一部のオプションが無効になります。bash
で呼び出すと有効になりますsh
。 Bashのマニュアルページから:
sh で呼び出されると、 bash は起動ファイルを読み込み、posix モードに入ります。
しかし、5.1
POSIXモードでバージョンプロセスの交換を再度有効にします。
したがって、現在のバージョン(現在削除された独自の回答で4.2を使用しています)では、手続き型置換bash
がsh
。
答え3
何ですか/bin/sh
?私たちはそれについて話していますUnix Legacyここ!いくつかの歴史:
sh
1979年、Unixバージョン7でリリースされたBourne Shellです。これはBrian KernighanとRob PikeのThe Unixプログラミング環境(The Unixプログラミング環境)で有名になりました。この本は、Unixプログラミング環境を紹介する最初の商業出版物です。シェルチュートリアル形式のプログラミング言語。
ksh
もともとDavid Kornによって書かれたKornシェルは、元のBourne Shellソースコードに基づいており、csh
BourneシェルとCシェルの間の中間パスです。構文はほとんど Bourne シェルからインポートされますが、ジョブ制御機能は C シェルと似ています。もともとKornシェルの機能はPOSIXシェル標準の基礎として使用されていました。
bash
「Bourne Again SHell」です。 Bash 構文は Bourne シェル構文の親セットです。 Bash構文には、コマンドライン編集、コマンド、ディレクトリスタック、history
$RANDOMおよび$PPID変数、POSIXコマンド代替構文$(...)など、KornシェルとCシェルからインポートされたアイデアが含まれています。
dash
「Debian Almquist シェル」です。最優先事項はPOSIX互換性です。
BashまたはDashを使用するハードリンクは、sh
動作をPOSIX標準に制限します。
答え4
もう一つのポイントは、Centos 7の別のバイナリがないsh
ことです。bash
sh
[root@work ~]# ls -la `which sh`
lrwxrwxrwx. 1 root root 4 Jun 16 2020 /usr/bin/sh -> bash
[root@work ~]# ls -la /bin/sh
lrwxrwxrwx. 1 root root 4 Jun 16 2020 /bin/sh -> bash
[root@work ~]# rpm -qf /usr/bin/sh /bin/sh
bash-4.2.46-34.el7.x86_64
bash
dash
そして、busybox
おそらく他のシェルは起動されたコマンドラインをチェックし、通常のシェルのような他のシェルのように偽装するでしょう(sh
そのように呼び出された場合)。このシンボリックリンクはこれを可能にします。
/bin/sh
あなたはいつもそこにいて、基本的なシェルになることを期待できます。