簡體   English   中英

Bash命令使用重定向運算符的“讀取”行為

[英]Bash command “read” behaviour using redirection operator

如果我執行以下命令:

> read someVariable _ < <(echo "54 41")

和:

> echo $someVariable

其結果是: 54

< < (帶空格)做什么?

為什么_在“ echo”命令中從結果中給出第一個單詞?

上面的命令僅是示例。

非常感謝

流程替代

正如tldp.org解釋的那樣,

進程替換將一個或多個進程的輸出饋送到另一個進程的標准輸入中。

因此,實際上,這類似於將一個命令的stdout傳遞給另一個命令,例如echo foobar barfoo | wc echo foobar barfoo | wc 但是請注意:在[bash手冊頁] [3]中,您會看到它表示為<(list) 因此,基本上,您可以重定向多個(!)命令的輸出。

注意:從技術上講,當您說<<時,您並不是在指一件事,而是指兩個具有單個<重定向和處理來自<(。。。)的輸出重定向。

現在,如果僅進行過程替換會發生什么?

$ echo <(echo bar)
/dev/fd/63

如您所見,shell在輸出創建的地方創建了臨時文件描述符/dev/fd/63 這意味着<將文件描述符重定向為命令的輸入。

因此,非常簡單的示例是將兩個回顯命令的輸出替換為wc:

$ wc < <(echo bar;echo foo)
      2       2       8

因此,在這里我們讓shell為括號中出現的所有輸出創建一個文件描述符,並將其重定向為wc的輸入。正如預期的那樣,wc從兩個echo命令接收該流,該命令本身將輸出兩行,每行有一個單詞,並且適當地,我們有2個單詞,2行和6個字符加上兩個換行符。

側注 :進程替換可以被稱為bashism(指令或結構在先進殼諸如bash可用的,但不是由POSIX指定),但它是在ksh的bash的存在作為前實現ksh的手冊頁 但是,像tcshmksh這樣的shell沒有進程替代。 那么,如何在不進行進程替換的情況下將多個命令的輸出重定向到另一個命令呢? 分組加管道!

$ (echo foo;echo bar) | wc
      2       2       8

實際上,這與上面的示例相同,但是,這與進程替換在本質上是不同的,因為我們將整個子外殼的stdout和wc stdin [與管道鏈接] [5]關聯在一起。 另一方面,進程替換使命令讀取臨時文件描述符。

因此,如果我們可以使用管道進行分組,為什么我們需要流程替代? 因為有時我們不能使用管道。 考慮下面的示例-比較兩個命令與diff輸出(需要兩個文件,在這種情況下,我們給它兩個文件描述符)

diff <(ls /bin) <(ls /usr/bin)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM