Bash - 이 문서는 다른 사용자의 입력 값을 읽습니다.

Bash - 이 문서는 다른 사용자의 입력 값을 읽습니다.

bash 스크립트에 here 문서가 있습니다. 다음 값을 읽고 싶습니다.

su myUser<<SESSION
set -x 
echo -n "Enter your name and press [ENTER]: "
read name
echo "the name is $name"
SESSION

그러나 다른 사용자로부터 이 스크립트를 실행하면 bash는 입력 대기를 멈추지 않고 명령을 무시합니다 read.

어떤 아이디어가 있나요?

답변1

L. 스콧 존슨이 연기함올바르게 발견됨, read표준 입력에서 읽습니다. 실행 중인 셸의 표준 입력은 suhere 문서에 연결되므로 read리터럴 문자열을 읽습니다 echo "the name is "(여기 문서는 따옴표가 없으므로 $name빈 문자열 또는 호출하는 셸로 확장됩니다).

여기에도 같은 내용이 있지만 여기 문서를 참조하여 $name추가 줄을 다시 출력합니다.

su username <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name
echo "the name is $name"
echo "What I read was $name"
SESSION

출력은 다음과 같습니다

Password:
+ echo -n Enter your name and press [ENTER]:
Enter your name and press [ENTER]: + read name
+ echo What I read was echo "the name is $name"
What I read was echo "the name is $name"

이를 올바르게 수행하려면 read표준 입력에서 읽을 수 없습니다. 대신 표준 입력의 복사본으로 새 파일 설명자를 열고 read읽어보세요.

su username 3<&0 <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name <&3
echo "the name is $name"
SESSION

다른 사용자의 쉘이 bash또는 ksh이면 read name <&3으로 대체할 수 있습니다 read -u3 name.

그러나 하위 쉘은 상위 쉘의 환경(변수 등)을 수정할 수 없으므로 name쉘 호출에서 변수를 설정할 수는 없습니다 .su

답변2

읽기 명령을 무시하지 않고 이를 실행하고 표준 입력을 읽습니다. 그런 다음 해당 행을 echo "the name is $name표준 입력에서 읽고 $name에 할당합니다.

su myUser<<SESSION
set -x 
echo -n \"Enter your name and press [ENTER]: \"
read name
someUser
echo \"the name is \$name\"
SESSION

산출:

+ echo -n '"Enter' your name and press '[ENTER]:' '"'
-n "Enter your name and press [ENTER]: "
+ read name
+ echo '"the' name is 'someUser"' 
"the name is someUser"

관련 정보