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
표준 입력에서 읽습니다. 실행 중인 셸의 표준 입력은 su
here 문서에 연결되므로 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"