¿Cómo paso la entrada canalizada al segundo comando en un alias?

¿Cómo paso la entrada canalizada al segundo comando en un alias?

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 aliasdefinición y hacer

alias xyz='{ command1; command2; }'

En cuyo caso comamnd1obtendrá 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 bashadmite zshla sustitución de procesos, puede definirlo command2para 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 pqrcomo command2argumento de entrada.

Respuesta3

Para pasar algo a la entrada estándar de command2en la lista de comandos

command1; command2

Debería asegurarse de que command1no lea desde la entrada estándar. Esto podría hacerse redirigiendo la entrada estándar /dev/nulldesde 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 xyzcomo una función de shell:

xyz () {
    command1 </dev/null
    command2 "$@"
}

Aquí, command2obtendrí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 command2dicen "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)

información relacionada