2016-11-15 43 views
3

我有以下命令:如何爲每個stdin行執行命令?

$ cmd-a | while read -r line; do echo "${line}"; cmd-b; done 

這種運作良好,並會爲所有意圖和目的看起來像cmd-a只是打印標準輸出正常,但每條線路我們執行cmd-b爲好。

有沒有更乾淨的方法來做到這一點?

cmd-a | xargs -n1 cmd-b將是很好的,但它分裂的所有空白(我知道GNU xargs的有-d選項,但它不幸的是沒有提供給我,),並會抑制cmd-a輸出。

+0

@JohnKugelman好點,謝謝!你說得對,我希望'cmd-a'的輸出被寫入到標準輸出以及'cmd-b'的輸出中。我會更新問題更清楚。 –

+0

@anubhava不確定你的意思。我知道過程替代是什麼,但是如何在這種情況下應用它? –

+0

'while IFS = read -r line;做回聲「$ {line}」; CMD-B;完成<(cmd-a)' – anubhava

回答

6

現有的建議完全是慣用和清潔的; BashFAQ #001建議完全相同的機制來逐行迭代輸入。沒有理由替代它,但如果你經常使用它,封裝它可能是有意義的。

考慮以下功能:

for_each_line() { 
    while IFS= read -r line; do 
    printf '%s\n' "$line" 
    line=$line "[email protected]" 
    done 
} 

...其後運行爲:

cmd-a | for_each_line cmd-b 

...或者,如果你的cmd-b是一個函數,並希望它能夠修改外殼狀態,可按以下方式調用上述(根據BashFAQ #24):

for_each_line cmd-b < <(cmd-a) 

...這將使環境中的前一行可用於cmd-b,如果它有任何理由根據相同的值修改其行爲。

+0

堅實的回答 - 非常感謝! –

+1

一個錯誤 - 我的原始代碼是使用'echo'而不是'printf'。這意味着,使用bash運行股票期權,僅包含'-n'的行將消失;啓用'xpg_echo'選項的bash可能會有不同的表現;和其他POSIX-shell上的[行爲極其不明確](http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html) - 特別參見鏈接的APPLICATION USAGE部分標準文件。適當修正。 –