Suponha que eu tenha um script de shell bash chamado Myscript.sh
que precise de um argumento como entrada.
Mas quero que o conteúdo do arquivo de texto chamado text.txt
seja esse argumento.
Eu tentei isso, mas não funciona:
cat text.txt | ./Myscript.sh
Existe uma maneira de fazer isso?
Responder1
./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