2011-09-21 13 views
24
$ hg status 

ybash: ¿cómo concatenar el resultado de dos comandos para poder canalizarlos a un tercero?

$ hg status --ignored 

dan resultados muy similares. Me gustaría para concatenar ellos, así que ellos pueden alimentar a awk, como si no hubiera estado hg --all (o SVN SVN de estado --no-ignore)

Estoy pensando en algo así como :

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

para hacer un comando de 'hacer muy limpio de hecho', pero parece que salir de vez en cuando un archivo atrás, tal vez debido a un salto de línea se pierde o algo así.

+0

Si reemplaza '' rm' con echo' (o saltar la última pipa), entonces ¿cuál es la salida y lo que debería haber sido? Además, puede haber problemas de permisos donde 'rm' se niega a eliminar un archivo. –

Respuesta

27

Puede utilizar un subnivel:

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

No es necesario utilizar una subshell (otro proceso). En su lugar, puede usar llaves para agrupar: '{a; segundo; } | c' – camh

+2

+1, muy elegante – orip

+1

No veo ninguna diferencia de velocidad significativa 'time {git branch; git branch -r; }>/dev/null; time (git branch; git branch -r)>/dev/null' de hecho subshell es consistentemente más rápido en mi sistema - entonces @camh, ¿cuál es la ventaja de un grupo? –

6

Puede utilizar el resto de los indicadores de estado de Hg para mostrar lo que realmente quiere:

hg status -uriamn 

Eso muestra los archivos desconocidos (u), se quitó archivos (r), ignorado (i), agregado (a), modificado (m) y lo hace sin mostrar el prefijo de estado.

+0

+1 Acabo de escribir "¿por qué no probar' hg st -iu | awk ... '?" y vi que tu respuesta aparece ... – Kent

+0

Y habría publicado antes, pero estaba tratando de hacer un divertido anagrama de las banderas ;-) – richq

25

Uso curly braces to group commands:

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

(Publicado como una respuesta de camh's comment)

+0

Excelente, gracias. Esto es lo que estaba buscando, tratando de concatenar los encabezados para pasar a 'sendmail -t' junto con la salida de otro comando. –

2

Esto funciona para mí:

echo $(a)$(b) 

si se agrega "" puede agregar delimitadores por ejemplo .:

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

yo uso esto en OpenWRT para transmitir mi configuración 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 ; 
Cuestiones relacionadas