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

22

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?

Narin
fonte

Respostas:

19

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

Tente este método:

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

Se você tiver mais de um comando no arquivo, considere usar xargs ou paralelo , por exemplo

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

Experimentar,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

para que você possa inserir os valores um a um para comli.shpartir comli.txt.

Ranjithkumar T
fonte
0

Lendo stdin com o mapfile, você pode redefinir os parâmetros posicionais.

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

(Citar "$ @" criará forlinhas de loop).

$ cat test.txt | ./script.sh
1 one
2 two
3 tree
bac0n
fonte
0

Para concluir @ bac0n, que IMHO é o único a responder corretamente à pergunta, aqui está um pequeno atalho que anexará argumentos direcionados à sua lista de argumentos de script:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

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
aznoqmous
fonte