Ls 和輸入重定向

Ls 和輸入重定向

我想將文件的內容重定向到ls命令輸入:

ls -l < /home/john/1.txt

其中1.txt內容只是:

/etc

我期望列出在- 即dirls中定義的文件的內容,但它似乎忽略輸入流 - 仍然列出文件中定義的當前目錄(insted of dir)的內容。/home/jonh1.txt/etc/etc/home/jonh1.txt

答案1

它似乎忽略了輸入流

是的。該ls程式絕不使用輸入流,因為它不是為了從輸入流中讀取任何內容而編寫的。這不是任何 Unix 程式自動附帶的東西——它必須單獨實現。

不要將輸入流 (stdin) 與命令列參數 (argv) 混淆;前者是可以逐行讀取的實際流,而後者則是簡單的唯讀單字數組。就您而言,兩者都存在並包含不同的數據。

(為什麼它不應該對所有程序都是自動的?好吧,以種類或者或者grep舉個例子。這些程式接受不同類型的值——檔案名稱作為參數,但文字作為標準輸入內容。因此,您可以將任何命令透過管道傳輸到| sort,它會對輸入進行排序。但是,如果標準輸入和命令列是同一件事,則您無法再透過管道輸入任何內容,| sort因為它會認為管道輸入是檔案名稱清單。反之亦然,你不能給它文件名,因為它只是對名稱進行排序。

如需替代方案,請參閱StackOverflow 上的這個解釋(你已經在評論中得到了)。

答案2

嘗試使用 xargs:

xargs ls -l < /home/john/1.txt

答案3

如果您編寫任何接受使用者輸入的命令列程序,您將非常清楚地看到發生了什麼。如果程式有 read/readLine(不同的語言可能會給它不同的名稱)、語句,那麼程式會提示使用者輸入,那麼您也可以使用或重定向該|輸入<

如果你看一個接受輸入的程序,你會看到像more或 一樣less,如果你在沒有輸入的情況下鍵入它$more<ENTER>,那麼它會提示輸入。透過向其傳輸數據,它會停止提示輸入。如果我們不帶參數來運行 sed$sed<ENTER>那麼肯定會給出錯誤,而我們$echo abc|sed<ENTER>也不能這樣做。但如果我們$sed 's/a/b/'<ENTER>這樣做,它會提示輸入。這就是為什麼 echo abc|sed 's/a/b/'<ENTER> 有效。

如果您編寫一個像 Hello World 這樣簡單的程序,但它接受輸入,例如程序提示輸入單詞,並且如果用戶輸入“abc”,則它會說“Hello abc”,您可以看到這一點。您將能夠透過管道連接到該程式。不需要任何額外的編程即可使輸入管道和重定向正常工作。如果程式接受使用者的鍵盤輸入,則管道和重定向將起作用,然後程式將不會提示輸入。

答案4

編輯

正如卡米爾·馬喬羅夫斯基在下面的評論中指出的那樣,以下並不是正確的方法。

如果/home/john/1.txt保證恰好包含一條路徑,則你絕對應該用雙引號。如果檔案可能包含多個路徑並且您故意依賴分詞,那麼這不是提供任意路徑的正確方法。

原帖(壞例子)

您可以使用以下內容:

ls -l $(cat /home/john/1.txt)

參見> man bash部分命令替換

相關內容