![Bash 스크립트의 파이프에서 "읽기" 사용](https://linux55.com/image/156023/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%ED%8C%8C%EC%9D%B4%ED%94%84%EC%97%90%EC%84%9C%20%22%EC%9D%BD%EA%B8%B0%22%20%EC%82%AC%EC%9A%A9.png)
Bash는 파이프에서 스크립트를 실행할 수 있습니다. 최소한의 예는 다음과 같습니다:
> echo "echo hello world" | bash
hello world
curl
또는 에서 다운로드한 스크립트를 실행하려는 경우 편리합니다 wget
.
read
하지만 분명히 이런 종류의 스크립트 실행에는 사용할 수 없습니다 . 예를 들어,
#!/bin/bash
echo 'input: '
read HELLO
echo hello: $HELLO
bash 스크립트 파일에서 위 스크립트를 실행 하면 $HELLO
.echo hello: $HELLO
앞서 설명한 대로 스크립트를 제공하는 경우:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input:
hello:
전혀 상호 작용을 얻지 못합니다. 아직 $HELLO
비어 있습니다. 또한 bash에 옵션을 추가하려고 시도했지만 -i
성공하지 못했습니다.
read
파이프라인 스크립트에서 사용할 수 있는 방법이 있나요 ? 어떻게? 아니면 할 수 없다면 왜 그렇습니까?
답변1
read
stdin(읽는 곳)과 stderr( -p
있는 경우 프롬프트를 인쇄하는 곳)을 통해 사용자와 "상호작용"합니다.
표준 입력이스크립트, read
내용을 가져오므로 한 줄을 건너뜁니다.
$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?
이는 좋은 습관이 아니며 모든 쉘에서 작동하지 않습니다. 또한 표준 입력을 통해 스크립트를 파이핑할 때는 bash
바이트 단위로 읽어야 합니다.
귀하의 예에서 전체 스크립트는 한 줄이므로 read
내장 함수는 EOF만 가져오고 변수를 설정하지 않습니다.
read
제어 tty에서 항상 읽으 려면 명시적으로 리디렉션하십시오.
read var </dev/tty
이 역시 주의해서 사용해야 합니다. expect(1)
스크립트를 탐지하기 위해 스크립트를 사용해야 한다면 아무도 감사하지 않을 것입니다.