2011-09-21 78 views
24
$ hg status 

bash:我如何連接兩個命令的輸出,以便我可以將它們連接到第三個?

$ hg status --ignored 

給出非常相似的輸出。我想將它們連接起來,所以我可以養活他們的awk,因爲如果有一個汞柱狀態 - 所有(或svn的SVN狀態--no-忽略

我想是這樣:

$ echo "$(hg status)" "$(hg status --ignored)" | awk ' ($1 == "?") || ($1 == "I") { print $2 }' | xargs rm -r 

做出「讓非常乾淨確實」命令,但它似乎偶爾留下一個文件的背後,也許是因爲新行變爲丟失或東西。

+0

如果您要更換'和'echo'(或跳過最後一個管道),那麼什麼是產出和它應該已經rm'?另外,可能會有'rm'拒絕刪除文件的權限問題。 –

回答

27

您可以使用一個子shell:

(hg status; hg status --ignored) | awk '($1 == "?") || ($1 == "I") { print $2 }' | xargs rm -r 
+27

沒有必要使用子shell(另一個進程)。相反,你可以使用大括號來分組:'{a; b; } | c' – camh

+2

+1,非常優雅 – orip

+1

我看不到有意義的速度差'time {git branch; git分支-r; }>/dev/null;時間(git分支; git分支-r)>/dev/null'事實上,subshel​​l在我的系統上一直更快 - 所以@camh,組的優勢是什麼? –

6

可以使用汞狀態標誌的各地展示你真正想要的:

hg status -uriamn 

這表明未知文件(U),刪除文件(r),忽略(i),添加(a),修改(m)並且不顯示狀態前綴。

+0

+1我剛寫下「爲什麼不試試'hg st -iu | awk ...'?」並看到你的答案顯示出來... – Kent

+0

而且我早就發佈了,但我試圖製作一個有趣的anagram標誌;-) – richq

25

使用curly braces to group commands

$ { echo first line; echo second line; } | grep "line" 
first line 
second line 

(發佈從camh's comment答案)

+0

非常好,謝謝。這就是我正在尋找的,試圖連接頭文件以傳遞給'sendmail -t'以及另一個命令的輸出。 –

2

這個工作對我來說:

echo $(a)$(b) 

,如果你添加 「」 你可以添加分隔符如:

echo "$(./gethostname.sh)|($(./getip.sh);" 

我用這個上OpenWrt的播出我的IP設置:

echo "$(uci get [email protected][0].hostname)|$(ip addr | grep inet | grep br-lan | cut -d ' ' -f 6 | cut -d '/' -f 1);" | socat - UDP-DATAGRAM:255.255.255.255:4999,broadcast ; 
相關問題