
He definido un alias como:
alias xyz='command1; command2'
Quiero canalizar la salida de otro comando pqr al comando2 como:
pqr | xyz -f -
¿Es posible? ¿Cómo puedo lograr eso?
Respuesta1
Usar un alias generalmente esnobuenas prácticas en scripts de shell no interactivos (BashFAQ/080). De la forma en que tiene el alias definido en su OP, solo los primeros comandos se leen desde la entrada estándar, porque ;
evita que su entrada estándar vaya más allá de su primer comando.
Una forma posible es agrupar comandos usando {..}
, de modo que cualquier redireccionamiento se aplique a todo el conjunto de comandos dentro del grupo. Aún puedes conservar tu alias
definición y hacer
alias xyz='{ command1; command2; }'
En cuyo caso comamnd1
obtendrá innecesariamente una copia de la entrada estándar. Puedes cerrarlo haciendo
alias xyz='{ command1 < /dev/null ; command2 - ; }'
O utilice funciones para definir sus comandos internos.
xyz() {
command1; command2
}
Si su shell bash
admite zsh
la sustitución de procesos, puede definirlo command2
para recibir contenido estándar como argumentos posicionales. Redefina su función como
xyz() {
command1
command2 "$@"
}
y luego llame a su comando ( pqr
) como
xyz < <(pqr)
Una simple demostración de lo anterior,
zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food) #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood
Respuesta2
Le sugiero que pruebe el enfoque xargs, es decir:
alias xyz='command1; command2 | xargs pqr'
Eso es equivalente a ejecutarlo pqr
como command2
argumento de entrada.
Respuesta3
Para pasar algo a la entrada estándar de command2
en la lista de comandos
command1; command2
Debería asegurarse de que command1
no lea desde la entrada estándar. Esto podría hacerse redirigiendo la entrada estándar /dev/null
desde command1
:
command1 </dev/null; command2
Esto te deja con el alias
alias xyz='command1 </dev/null; command2`
que haríasnopoder llamar con
pqr | xyz -f -
ya que eso equivaldría a
pqr | command1 </dev/null; command2 -f -
que es lo mismo que
pqr | command1 </dev/null
command2 -f -
En su lugar, defina xyz
como una función de shell:
xyz () {
command1 </dev/null
command2 "$@"
}
Aquí, command2
obtendría tanto la entrada estándar de la función como cualquier argumento de la línea de comando proporcionado a la función.
Ahora podrá utilizar esto como en la tubería pqr | xyz -f -
.
Si (y solo si) los -f -
argumentos a los que pasa command2
dicen "leer desde la entrada estándar" (denotando -
entrada estándar), entonces podría -
pasar una sustitución de proceso a xyz
, si su Shell lo admite:
xyz -f <(pqr)
Con la función anterior, esto sería lo mismo que hacer
command1 </dev/null
command2 -f <(pqr)