2011-09-21 9 views
24
$ hg status 

ibash: jak połączyć dane wyjściowe dwóch poleceń, aby móc je potokować do trzeciej?

$ hg status --ignored 

dają bardzo podobnych rezultatów. Chciałabym złączyć je więc mogę karmić je do awk, jak gdyby nie było stanu Hg --all (lub svn na svn statusu --no-zignorować)

myślę coś takiego :

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

dokonać „make bardzo czysty rzeczywiście” polecenie, ale wydaje się, że od czasu do czasu opuszczenia plik za, być może dlatego, że nowa linia znika albo coś.

+0

Jeśli zastąpić 'rm' z' echo' (lub pominąć ostatnią rurę), to co jest wyjście, a co powinno być? Mogą również wystąpić problemy z uprawnieniami, w których 'rm' odmawia usunięcia pliku. –

Odpowiedz

27

Można użyć podpowłoce:

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

Nie ma potrzeby używania podpowłok (inny proces). Zamiast tego możesz użyć nawiasów klamrowych do grupowania: '{a; b; } | c' – camh

+2

+1, bardzo elegancki – orip

+1

Nie widzę znaczącej różnicy prędkości 'time {git branch; git branch -r; }>/dev/null; czas (gałąź git; gałąź git -r)>/dev/null' w rzeczywistości podpięcie jest konsekwentnie szybsze w moim systemie - tak więc @camh, co jest zaletą grupy? –

6

Można użyć resztę flagi stanu Hg, aby pokazać, co naprawdę chcesz:

hg status -uriamn 

To pokazuje nieznanych plików (u), usunięte pliki (r), zignorowane (i), dodane (a), zmodyfikowane (m) i robi to bez pokazywania prefiksu statusu.

+0

+1 Właśnie napisałem "dlaczego nie spróbować' hg st -iu | awk ... "?" i zobaczyłem, że twoja odpowiedź ukazuje się ... – Kent

+0

A ja bym pisał wcześniej, ale próbowałem zrobić zabawny anagram z flag ;-) – richq

25

Zastosowanie curly braces to group commands:

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

(Wysłany jako odpowiedź od camh's comment)

+0

Doskonale, dziękuję. Tego właśnie szukałem, próbując połączyć nagłówki, aby przekazać je do 'sendmail -t' wraz z wyjściami innego polecenia. –

2

Działa to dla mnie:

echo $(a)$(b) 

jeśli dodać "" można dodać ograniczniki np .:

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

Używam tego na OpenWrt nadawać swoje ustawienia 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 ; 
Powiązane problemy