2012-10-18 136 views
2

有人可以解釋一下嗎?我跑瞭如下所示的命令:貓'bash`命令的意外輸出

$ cat `bash` 

$ ls 

$ ctrl+D 

它在終端上給我一些意想不到的輸出。

注意:bash是反引號。

+0

我很好奇。你想做什麼? – doubleDown

+0

這在這裏相當具有代表性。 SO是編程問題。 – kapa

+0

@doubleDown我只是想了解bash shell在反引號中執行時的行爲。 –

回答

6

好問題! 「意外輸出」是貓打印所有由ls在cwd中找到的文件。詳細解釋如下:

關於第一個行:

$ cat `bash` 

bash部分實際上從你的原殼產生一個新的外殼,因爲慶典是由反引號括(反引號是指運行在此背景下,封閉的程序)

然後,當你這樣做:

$ ls 

這實際上是在新生成的bash shell完成。它列出了新生成的bash shell所在的目錄(應該與原來的一樣)。這反過來,在本質上改變了第一步

$ cat file_1 file_2 ... file_x 

(基本上都是由LS返回目錄中的文件的cat命令。但是,你不會看到這些結果又因爲輸出等待打印到原來的殼的標準輸出:貓正在等待評估新的bash shell的標準輸出)

最後,當你這樣做:

$ ctrl+D 

它退出新的bash的外殼,你從你的原始殼中產生,然後貓輸出所有的東西t打印到新shell(來自ls的搜索結果)的標準輸出到您的舊shell中。

你可以驗證一下剛纔說的是:

$ 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找到的所有文件的cat。