Bash readline은 파이프되면 모든 것을 먹습니다.

Bash readline은 파이프되면 모든 것을 먹습니다.

간단한 스크립트가 있습니다.

# test.sh

read -p ">> " user
read -p ">> " -n1 yes

echo

echo "user: $user"
echo "yes: $yes"

실행되면 값을 묻는 메시지가 표시되고 해당 값이 sum bash test.sh변수에 저장됩니다 . 그래서 출력은 다음과 같습니다useryes

user@host:~/static/dcc$ bash test.sh 
>> foo
>> b
user: foo
yes: b

그러나 cat test.sh가 bash로 파이프되면 작동하지 않습니다. 대신 read는 user입력을 요청하지 않고 그 뒤의 모든 것을 먹고 변수에 저장합니다.

user@host:~/static/dcc$ cat test.sh | bash

user: read -p ">> " -n1 yes
yes: 

프로세스 대체를 사용하면 잘 작동하지만 bash가 sudo로 실행되는 경우에는 작동하지 않습니다(이것이 제가 필요한 것입니다)

user@host:~/static/dcc$ bash <(cat test.sh)
>> user
>> y
user: user
yes: y
user@host:~/static/dcc$ sudo bash <(cat test.sh)
bash: /dev/fd/63: No such file or directory

실제 사례에서는 컬을 사용하여 네트워크에서 스크립트를 가져와서 마치 sudo를 사용하는 것처럼 실행하려고 합니다. 가능하다면 스크립트를 먼저 다운로드하는 추가 단계를 피하고 싶습니다.

답변1

글쎄, readstdin에서 읽은 다음 stdin을 통해 나머지 스크립트를 제공합니다... 따라서 작동하지 않습니다.

이 파일을 다운로드해야 합니다. 대체 트릭은 잘 작동하지만 잘 작동합니다. sudo가 호출되는 쉘에서가 아니라 sudo가 호출되는 쉘에서 수행됩니다. 이것을 쉽게 피할 수 있습니다:

sudo bash -c 'bash <(curl https://scripttodownload)'

관련 정보