重複したらすみません。しかし、ここでは同様の質問が見つかりません。私はこの奇妙な行動を偶然発見しました。このロジックを説明できる人はいますか?なぜ「ABC」と確認されるのですか?
$ cat repro.sh
bash -s <<-EOS1
bash -s <<EOS2 &
#ABC
EOS2
echo "" | wc
#1234567
EOS1
$ . ./repro.sh
1 0 1
bash: line 5: ABC: command not found
bash: line 6: EOS2: command not found
1 0 1
答え1
これはbashのバグです。次のアドレスにバグレポートを送信する必要があります。[Eメール保護]。
より良い例 - ご覧のとおり、「stdinのスクリプト」、「検索可能なファイルとしてのstdin」、および「バックグラウンドコマンドのheredoc」が組み合わされているため、入れ子になったheredocは不十分であるか必要ありません。
$ cat a.sh
true <<EOF &
#ABC
EOF
seq 1 3
true | true
#1234567
$ bash <a.sh
1
2
3
bash: line 5: rue: command not found
1
2
3
bash: line 9: rue: command not found
1
...
<same nonsense repeated hundred of times with increasing line numbers>
bash の外部で cat "無駄に" を使用すると、この問題を解決できます (サイトでタブが壊れているため、タブは例では省略されました)。
cat <<-EOS1 | bash -s
bash -s <<EOS2 &
#ABC
EOS2
echo "" | wc
#1234567
EOS1
スクリプトはパイプから読み取られるため、bashは入力から前後に見て、エッジを切り捨てようとするのではなく、バイト単位(バイトあたりのシステムコール)で読み取るように説得できます。 ;-)