Posso usar a saída do pipe como argumento de script de shell?

Posso usar a saída do pipe como argumento de script de shell?

Suponha que eu tenha um script de shell bash chamado Myscript.shque precise de um argumento como entrada.

Mas quero que o conteúdo do arquivo de texto chamado text.txtseja esse argumento.

Eu tentei isso, mas não funciona:

cat text.txt | ./Myscript.sh

Existe uma maneira de fazer isso?

Responder1

Substituição de comando.

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

Responder2

Você pode usar a saída do pipe como um argumento de script de shell.

Experimente este método:

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

Responder3

Para completar @bac0n, que IMHO é o único a responder corretamente à pergunta, aqui está um short-liner que precederá os argumentos canalizados à sua lista de argumentos do script:

#!/bin/bash

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

echo "$@"

Exemplo de uso:

$ ./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

Responder4

Se você tiver mais de um conjunto de argumentos no arquivo (para múltiplas chamadas), considere usarxargsouparalelo, por exemplo

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

informação relacionada