入力ファイルリダイレクトを使用してbashを実行するのとは異なる引数を使用してbashを実行するのはなぜですか?

入力ファイルリダイレクトを使用してbashを実行するのとは異なる引数を使用してbashを実行するのはなぜですか?

bash <scriptなぜ違うのですかbash script?以下を含むスクリプトを使用してこれを試してみると、

cat
hello
world

最初のケースでは、私が期待した結果を得ました。

hello
world

ただし、2番目の場合はctrl-Dと入力する必要があり、次のような結果が得られます。

script: line 2: hello: command not found
script: line 3: world: command not found

私はこれが2番目のケースでは、bashが2行と3行をcatへの入力として読み取らずにコマンドで読み取ることを意味すると思います。

私はbash引数の処理が簡単だと思いましたが、適切なファイルを開いてdup2()を使用すると、そのスクリプトファイルがファイル記述子0に設定されるため、ファイルを引数または入力にリダイレクトしても大きな違いはありません。

bashはファイル全体を読み込み、1行ずつ実行しますか?

答え1

最初のケースでは、bashに標準入力としてスクリプトを提供します。

  • バッシュラン猫
  • catはstdinからファイルの残りの部分を読み取り、stdoutにコピーします。

2番目のケース:

  • bash実行猫コマンド
  • catはctrl-dを押してcatを閉じるまで標準入力(ファイルではありません)から読み込みます。
  • bashは次の行を読んで実行します...

このようにコマンドラインにファイル名を入力すると、通常ファイルはbashスクリプトであり、プログラム自体として扱われます。

もう一つの方法は、これをファイルに入れることです。

cat <<EOF
hello
world
EOF

この場合、stdinはシェルによってリダイレクトされ、catは2番目ですEOF。 EOF(2つの場所)を目的のマークに置き換えることができます。

関連情報