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