¿Puedo utilizar la salida de la tubería como argumento del script de Shell?

¿Puedo utilizar la salida de la tubería como argumento del script de Shell?

Supongamos que tengo un script de shell bash llamado Myscript.shque necesita un argumento como entrada.

Pero quiero que el contenido del archivo de texto llamado text.txtsea ese argumento.

He probado esto pero no funciona:

cat text.txt | ./Myscript.sh

¿Hay alguna forma de hacer esto?

Respuesta1

Sustitución de mando.

./Myscript.sh "$(cat text.txt)"

Respuesta2

Puede utilizar la salida de la tubería como argumento del script de shell.

Pruebe este método:

cat text.txt | xargs -I {} ./Myscript.sh {}

Respuesta3

Para completar @ bac0n, que en mi humilde opinión es el único que responde correctamente a la pregunta, aquí hay una breve línea que antepondrá argumentos canalizados a la lista de argumentos de su script:

#!/bin/bash

declare -a A=("$@")
[[ -p /dev/stdin ]] && { \
    mapfile -t -O ${#A[@]} A; set -- "${A[@]}"; \
}

echo "$@"

Uso de ejemplo:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3

Respuesta4

Si tiene más de un conjunto de argumentos en el archivo (para múltiples llamadas), considere usarxargosoparalelo, p.ej

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

información relacionada