Digamos que tengo la siguiente tubería:
cmd1 < input.txt |\
cmd2 |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt
Bajo ciertas condiciones me gustaría agregar un cmd3entre cmd2y cmd4. ¿Hay alguna manera de crear una tubería condicional amable sin guardar el resultado de cmd2 en un archivo temporal? Yo pensaría en algo como:
cmd1 < input.txt |\
cmd2 |\
(${DEFINED}? cmd3 : cat ) |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt

Respuestas:
Solo lo habitual
&&y los||operadores:(Tenga en cuenta que no se necesita una barra diagonal inversa posterior cuando la línea termina con una tubería).
Actualización según la observación de Jonas .
Si cmd3 puede terminar con un código de salida distinto de cero y no desea
catprocesar la entrada restante, invierta la lógica:fuente
catregresa con un estado de salida distinto de cero (común al obtener un SIGPIPE),cmd3se ejecutará. Mejor use if / then / else como en la respuesta de Thor u otras soluciones que eviten la ejecucióncat.if/else/fiObras. Suponiendo cualquier shell similar a Bourne:fuente
Todas las respuestas dadas hasta ahora se reemplazan
cmd3concat. También puede evitar ejecutar cualquier comando con:Eso es POSIX, pero tenga en cuenta que si está en un
bashscript dondebashno está enshmodo (como con un script que comienza con#! /path/to/bash), deberá habilitar la expansión de alias conshopt -s expand_aliases(oset -o posix).Otro enfoque que aún no ejecuta ningún comando innecesario es usar eval:
O:
En Linux (al menos), en lugar de
cat, podría usarpv -qwhich uses ensplice()lugar deread()+write()para pasar los datos entre las dos tuberías, lo que evita que los datos se muevan dos veces entre el kernel y el espacio de usuario.fuente
Como una adición a la respuesta aceptada de manatwork : tenga en cuenta el y-false-o gotcha y su interacción con las corrientes. Por ejemplo,
salidas
foo. No es sorprendente,y
Ambas salidas
baz. (Tenga en cuenta queecho foo | grep bares falso y no tiene salida). Sin embargo,No produce nada. Esto puede o no ser lo que quieres.
fuente
else(o||) debe actuar como una operación nula manteniendo la entrada sin cambios. Entonces, reemplazarcatconechocambios todo hace que su código sea irrelevante. Con respecto a "y-falso-o gotcha", no veo interferencia con la tubería: pastebin.com/u6Jq0bZe[[ "${DEFINED}" ]] && cmd3 || cat,cmd3ycatno son mutuamente excluyentesthenyelseramas de la mismaif, pero que sicmd3falla,cattambién se ejecutará. (Por supuesto, sicmd3siempre tiene éxito, o si consume toda la entrada para que no quede nadastdinparacatprocesar, entonces puede que no importe). Si necesita ambasthenyelseramas, es mejor usar unifcomando explícito , no&&y||.Tuve una situación similar que resolví con las funciones bash :
fuente
Aquí hay una posible solución alternativa:
concatenar tuberías con nombre para crear una pseudo-tubería:
fuente
Para referencia futura, si vienes aquí buscando tuberías condicionales en peces , así es como lo haces:
fuente