2

誰かがこれを説明できますか?以下のようにコマンドを実行しました

$ cat `bash`

$ ls

$ ctrl+D

そしてそれは私にターミナルでいくつかの予期しない出力を与えています。

注:bashはバッククォートです。

4

1 に答える 1

6

良い質問!「予期しない出力」は、cwd内のlsによって検出されたすべてのファイルを印刷する猫です。詳細な説明は次のとおりです。

最初の行:

$ cat `bash`

bashはバッククォートで囲まれているため、bashパーツは実際に元のシェルから新しいシェルを生成します(バッククォートはこのコンテキストで囲まれたプログラムを実行することを意味します)

次に、あなたがするとき:

$ ls

これは実際には、新しく生成されたbashシェルで行われます。新しく生成されたbashシェルがある場所のディレクトリが一覧表示されます(元のシェルと同じである必要があります)。これにより、本質的に、最初のステップのcatコマンドが次のように変更されます。

$ cat file_1 file_2 ... file_x

(基本的に、lsによって返されるそのディレクトリ内のすべてのファイル。ただし、出力が元のシェルのstdoutに出力されるのを待っているため、これらの結果はまだ表示されません。catは新しいbashのstdoutを評価するのを待っています。シェル。)

最後に、あなたがするとき:

$ ctrl+D

元のシェルから生成した新しいbashシェルを終了し、catは新しいシェル(lsからの検索結果)でstdoutに出力されたすべてのものを古いシェルに出力します。

あなたは私が今言ったことを確認することができます:

$ cd ~/
$ mkdir temp_test_dir
$ cd temp_test_dir
$ echo "some text for file1" > file1
$ echo "other text for file2" > file2

次に、質問で持っていたものを実行します。

$ cat `bash`
$ ls
$ ctrl+D

そして、これはあなたが見るべきものです:

some text for file1
other text for file2

ある順序で、これはlsによって検出されたすべてのファイルを出力する猫です。

于 2012-10-18T06:59:49.653 に答える