簡體   English   中英

不同的命令替換輸出

[英]Different output of command substitution

為什么添加| wc -l | wc -l更改結果,如下所示?

tst:

#!/bin/bash
pgrep tst | wc -l
echo $(pgrep tst | wc -l)
echo $(pgrep tst) | wc -l
$ ./tst
1
2
1

乃至

$ bash -x tst
+ wc -l
+ pgrep tst
0
++ pgrep tst
++ wc -l
+ echo 0
0
++ pgrep tst
+ echo

命令替換會導致一個名為tst的附加進程,該進程包含在wc -l的輸入中。

pgrep和subshel​​l可能會有奇怪的交互,但是在這種情況下,這只是一條紅鯡魚。 實際原因是命令替換周圍缺少雙引號:

$ cat tst2
#!/bin/bash
pgrep tst | wc -l
echo "$(pgrep tst | wc -l)"
echo "$(pgrep tst)" | wc -l
$ ./tst2
1
2
2

原始腳本中發生的是命令中的內容

echo $(pgrep tst) | wc -l

pgrep輸出兩個進程ID(運行腳本的主shell和創建用於處理管道echo部分的子shell)。 它將每個人打印為單獨的一行,如下所示:

11730
11736

命令替換捕獲了這一點,但是由於它不在雙引號中,因此它們之間的換行符被轉換為參數break,因此整個過程等效於:

echo 11730 11736 | wc -l

結果, echo兩個ID都打印為一行,而wc -l正確地報告了這一點。

暫無
暫無

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

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