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 cmd3
entre cmd2
y 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
cat
procesar la entrada restante, invierta la lógica:fuente
cat
regresa con un estado de salida distinto de cero (común al obtener un SIGPIPE),cmd3
se ejecutará. Mejor use if / then / else como en la respuesta de Thor u otras soluciones que eviten la ejecucióncat
.if
/else
/fi
Obras. Suponiendo cualquier shell similar a Bourne:fuente
Todas las respuestas dadas hasta ahora se reemplazan
cmd3
concat
. También puede evitar ejecutar cualquier comando con:Eso es POSIX, pero tenga en cuenta que si está en un
bash
script dondebash
no está ensh
modo (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 -q
which 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 bar
es 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, reemplazarcat
conecho
cambios 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
,cmd3
ycat
no son mutuamente excluyentesthen
yelse
ramas de la mismaif
, pero que sicmd3
falla,cat
también se ejecutará. (Por supuesto, sicmd3
siempre tiene éxito, o si consume toda la entrada para que no quede nadastdin
paracat
procesar, entonces puede que no importe). Si necesita ambasthen
yelse
ramas, es mejor usar unif
comando 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