파이프 출력을 쉘 스크립트 인수로 사용할 수 있습니까? 파일의 내용 text.txt이 그 인수가 되기를 원합니다

Myscript.sh입력으로 하나의 인수가 필요한 bash 쉘 스크립트가 있다고 가정하십시오 .

그러나 나는 텍스트 파일의 내용 text.txt이 그 인수가 되기를 원합니다 .

나는 이것을 시도했지만 작동하지 않습니다 :

cat text.txt | ./Myscript.sh

이것을 할 수있는 방법이 있습니까?



답변

명령 대체 .

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


답변

파이프 출력을 쉘 스크립트 인수로 사용할 수 있습니다.

이 방법을 시도하십시오 :

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


답변

파일에 둘 이상의 명령이있는 경우 xargs 또는 parallel 사용을 고려하십시오 ( 예 :

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


답변

시험,

 $ 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

그래서 당신은 하나에 의해 값 하나를 입력 할 수 있습니다 comli.sh에서 comli.txt.


답변

공정 대체

./Myscript.sh <(cat text.txt)

예를 들어 https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution을 참조 하십시오.


답변

mapfile로 stdin을 읽으면 위치 매개 변수를 재설정 할 수 있습니다.

#!/bin/bash

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

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

( “$ @”를 인용하면 for대신 루프 라인 이 만들어집니다 ).

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


답변

@ bac0n을 완성하기 위해 IMHO가 질문에 올바르게 대답하는 유일한 방법은 다음과 같습니다. 파이프 인수를 스크립트 인수 목록 앞에 추가하는 짧은 라이너가 있습니다.

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

echo $@

사용 예 :

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