我想了解stdin重定向在運算式中的位置< <(cmd)
作為了解更多關于 bash 的測驗,我嘗試撰寫一個 bash 函式while .. do .. done并讓它作業,我不得不使用試錯法,主要是因為我不知道以下行為或第一個重定向< <(find ...):
while read L ;do basename "$L";((k ));done < <(
find -maxdepth 1 -type d -name '.*' |
sort
)
只用<(find ...它是行不通的。我想這是因為命令列的標準輸出find轉到了一個 tmp 檔案(所以我讀了);所以我又添加了一個<來進一步“推動” stdout的副本。我可以理解,但是我怎么知道tmp 檔案中復制的標準輸出不會在遇到的第一個命令處停止:basename并且一直到 命令的標準輸入while?
uj5u.com熱心網友回復:
<(...)本身就是一個程序替代。它的行為類似于檔案名,除了它命名的檔案的“內容”是命令的輸出。例如,
$ echo <(echo foo)
/dev/fd/63
$ cat <(echo foo; echo bar)
foo
bar
while回圈不接受引數,這就是為什么在沒有輸入重定向的情況下會出現語法錯誤的原因。
$ while read x; do echo "$x"; done <(echo foo; echo bar)
bash: syntax error near unexpected token `<(echo foo; echo bar)'
通過輸入重定向,while回圈(它是一個命令,和任何其他命令一樣,有它自己的標準輸入)使用行程替換作為它的標準輸入。
$ while read x; do echo "$x"; done < <(echo foo; echo bar)
foo
bar
while實際上并不使用其標準輸入,但回圈中的任何命令都從while回圈中繼承其標準輸入。這包括read,因此每次執行read都會從檔案中獲取不同的行,直到檔案耗盡,此時read退出狀態為 1,回圈終止。
uj5u.com熱心網友回復:
重定向在命令列中走多遠?
重定向適用于它所應用的命令的整個持續時間。
shell 語法定義了“命令列”中的基本內容。您可以精通 POSIX shell 標準和Bash 檔案。
命令是以下之一:
Simple command (see Simple Commands) Pipeline (see Pipelines) List compound-list (see Lists) Compound command (see Compound Commands) Function definition (see Function Definition Command)
命令可以是復合命令,可以是回圈結構,也可以是while回圈結構。Awhile是一個單一的命令。
重定向在命令的整個持續時間內被重定向,并被該命令內的任何命令繼承。
while
redirected here
do
redirected here
done < redirection
if
redirected here
then
redirected here
else
redirected here
fi < redirection
etc.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536806.html
標籤:狂欢io重定向
上一篇:正則運算式、捕獲組和美元符號
下一篇:Agda安裝PLFA配置
