入れ子になった区切り記号の奇妙な動作

入れ子になった区切り記号の奇妙な動作

重複したらすみません。しかし、ここでは同様の質問が見つかりません。私はこの奇妙な行動を偶然発見しました。このロジックを説明できる人はいますか?なぜ「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は入力から前後に見て、エッジを切り捨てようとするのではなく、バイト単位(バイトあたりのシステムコール)で読み取るように説得できます。 ;-)

関連情報