[英]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
和subshell可能會有奇怪的交互,但是在這種情況下,這只是一條紅鯡魚。 實際原因是命令替換周圍缺少雙引號:
$ 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.