2011-09-21 16 views
24
$ hg status 

bash: làm thế nào để tôi nối đầu ra của hai lệnh để tôi có thể dẫn chúng đến một phần ba?

$ hg status --ignored 

cho kết quả đầu ra rất giống nhau. Tôi muốn ghép chúng để tôi có thể cho chúng ăn để awk, như thể có một tình trạng hg --all (hoặc svn của svn tình trạng --no-lờ)

Tôi đang nghĩ đến một cái gì đó như :

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

để thực hiện lệnh 'thực hiện rất sạch', nhưng có vẻ như thỉnh thoảng để lại tệp, có lẽ vì dòng mới bị thiếu hoặc gì đó.

+0

Nếu bạn thay thế 'rm' với' echo' (hoặc bỏ qua các đường ống cuối cùng), sau đó đầu ra là gì và những gì nên nó đã? Ngoài ra, có thể có các vấn đề về quyền khi 'rm' từ chối xóa tệp. –

Trả lời

27

Bạn có thể sử dụng một subshell:

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

Không cần sử dụng subshell (quá trình khác). Thay vào đó bạn có thể sử dụng niềng răng để nhóm: '{a; b; } | c' – camh

+2

+1, rất thanh lịch – orip

+1

Tôi thấy không có sự khác biệt về tốc độ có ý nghĩa 'time {git branch; git branch -r; }>/dev/null; thời gian (git branch; git branch -r)>/dev/null' trong thực tế subshell luôn chạy nhanh hơn trên hệ thống của tôi - vì vậy @camh, lợi thế của một nhóm là gì? –

6

Bạn có thể sử dụng phần còn lại của các cờ trạng thái hg để hiển thị những gì bạn thực sự muốn:

hg status -uriamn 

Điều đó cho thấy tập tin không rõ (u), loại bỏ tập tin (r), bỏ qua (i), thêm (a), sửa đổi (m) và làm như vậy mà không hiển thị tiền tố trạng thái.

+0

+1 Tôi chỉ viết xuống "tại sao không thử' hg st -iu | awk ... '?" và thấy câu trả lời của bạn xuất hiện ... – Kent

+0

Và tôi sẽ đăng sớm hơn, nhưng tôi đã cố gắng để làm cho một đảo chữ thú vị ra khỏi cờ ;-) – richq

25

Sử dụng curly braces to group commands:

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

(văn như một câu trả lời từ camh's comment)

+0

Tuyệt vời, cảm ơn bạn. Đây là những gì tôi đang tìm kiếm, cố gắng nối các tiêu đề để chuyển tới 'sendmail -t' cùng với đầu ra của một lệnh khác. –

2

này làm việc cho tôi:

echo $(a)$(b) 

nếu bạn thêm "" bạn có thể thêm delimiters Eg .:

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

tôi sử dụng này trên openWRT để phát sóng các thiết lập ip của tôi:

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 ;