假設一個管道鏈的輸出command1 | command2 | comamnd3是一個檔案名,你想把<這個檔案重定向到另一個命令。
我想使用類似command4 < command1 | command2 | comamnd3的東西,但似乎<運算子比|更有優先權
例如,我可以在最近的檔案中搜索 "hello "這個詞,這樣做:
grep "hello" $(ls -t | head -n1)
但是,如何在不使用子殼的情況下做到這一點,只是使用管道和重定向?I.e grep "hello" < ls -t | head -n1 (*)
(*)是的,我知道我不需要為grep進行重定向。這只是一個例子
uj5u.com熱心網友回復:
你應該通過以下方式來依賴子外殼:
( command4 < command1 ) | command2 | comamnd3
uj5u.com熱心網友回復:
command4 < command1 | command2 | comamnd3
為什么不把你的命令移到管道鏈的末尾,因為它應該是合乎邏輯的? :
command1 | command2 | command3 | command4
|不僅僅是一個重定向,它是兩個獨立行程之間的重定向管道,當<和>是屬于同一行程的stdout/stdin的重定向,這就是為什么它們在'|'管道之前執行。
如果你想把你的命令4放在開頭,出于任何個人原因,你可以用()來連接其他命令,就像這樣:
command4 < ( command1 | command2 | command3 )
而你的例子:
grep "hello" < ls -t | head -n1 ( *)
對于這樣的事情,你可以使用xargs:
。ls -t | head -n1 | xargs grep "hello"
uj5u.com熱心網友回復:
你似乎誤解了subshell的含義。由于shell是一個shell,你運行的其他每一個biraries都將意味著一個subprocess:
在
grep "Foo bar" $(/bin/ls -1t|head -n1)
你運行兩個子命令。ls | head,然后檢索答案,將它們作為引數傳遞給第三個子命令。grep,你將運行3個子行程。
你可以通過使用read內置來避免使用head:
read -r filename < < (/bin/ls -1t)
grep "Foo bar" "$filename"。
由于read逐行讀取,只有一行(第一行)將被存盤到filename變數。在這種情況下,只有ls和grep會產生子行程。
注意$(...)和<(...)之間的區別,第一個語法將把答案作為字串的內容傳遞,但是第二個引數將生成一個未命名的fifo然后把答案作為輸入流。然后注意重定向<和<(...)前的空格,告訴read從未命名的fifo獲取輸入。
如果你想把他的結果存盤到一個變數中,改變一個管道鏈的順序可能是有用的:
head -n 1 < <(tac < <(grep 456 < <(seq {120,124}000))
123456
seq {120,124}000 | grep 456 | tac | head -n1
123456
{ tac | head -n1 ;} < <(seq {120,124}000 | grep 456)
123456
以此類推...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309904.html
標籤:
上一篇:JSSDK未知主機域
