我想將文件的內容重定向到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
部分命令替換。