web-dev-qa-db-ja.com

bash:2つのコマンドの出力を連結して、3番目のコマンドにパイプできるようにするにはどうすればよいですか?

$ hg status

そして

$ hg status --ignored

非常によく似た出力を提供します。 hg status --all(またはsvnのsvn status --no-ignore)があるかのように、それらをawkにフィードできるように連結したいと思います。

私は次のようなことを考えています:

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

「確かに非常にきれいにする」コマンドを作成しますが、改行が欠落しているか何かが原因で、ファイルが残ることがあります。

25

サブシェルを使用できます。

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

コマンドをグループ化するための中括弧 を使用します:

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

(からの回答として投稿 camhのコメント

29
Vincent Scheib

残りのhgステータスフラグを使用して、本当に必要なものを表示できます。

hg status -uriamn

これは、不明なファイル(u)、削除されたファイル(r)、無視された(i)、追加された(a)、変更された(m)を示し、ステータスプレフィックスを表示せずに表示します。

6
richq

これは私のために働きます:

echo $(a)$(b)

「」を追加すると、区切り文字を追加できます。例:

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

私はこれをOpenwrtで使用して、IP設定をブロードキャストします。

echo "$( uci get system.@system[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 ;
2
animtakhnet