Bash 스크립트의 파이프에서 "읽기" 사용

Bash 스크립트의 파이프에서 "읽기" 사용

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

readstdin(읽는 곳)과 stderr( -p있는 경우 프롬프트를 인쇄하는 곳)을 통해 사용자와 "상호작용"합니다.

표준 입력이스크립트, read내용을 가져오므로 한 줄을 건너뜁니다.

$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?

이는 좋은 습관이 아니며 모든 쉘에서 작동하지 않습니다. 또한 표준 입력을 통해 스크립트를 파이핑할 때는 bash바이트 단위로 읽어야 합니다.

귀하의 예에서 전체 스크립트는 한 줄이므로 read내장 함수는 EOF만 가져오고 변수를 설정하지 않습니다.

read제어 tty에서 항상 읽으 려면 명시적으로 리디렉션하십시오.

read var </dev/tty

이 역시 주의해서 사용해야 합니다. expect(1)스크립트를 탐지하기 위해 스크립트를 사용해야 한다면 아무도 감사하지 않을 것입니다.

관련 정보