나는 다음과 같은 일을하려고합니다 :
sudo su <<EOF
select x in a b c; do echo "Selected $x"; break; done
EOF
그러나 입력을 승인하지 않고 종료됩니다.
이렇게 하면 작동합니다.
sudo su -c 'select x in a b c; do echo $x; break; done'
그러나 heredoc에 더 긴 스크립트를 작성하는 것이 더 나을 것입니다(예, 파일에 넣는 것이 더 낫다는 것을 알고 있습니다).
이 질문에 대한 답은 어디에나 있을 것이라고 확신하지만 bash/heredoc/tty/stdin에 대한 올바른 검색어 조합을 찾을 수 없는 것 같습니다.
이것을 달성할 수 있는 방법이 있나요?
답변1
문제는 select
here 문서로 리디렉션되는 표준 입력에서 읽으려고 하는 것입니다. 프롬프트에 대한 응답이 없기 때문에 오류가 발생합니다.
해결 방법은 여기에 설명된 대로 입력을 다시 터미널로 리디렉션하는 것입니다.
sudo -s <<'EOF'
select x in a b c; do
echo "Selected $x"
break
done </dev/tty
EOF
EOF
또한 here-doc에서 변수가 확장되는 것을 방지하려면 주위에 따옴표를 넣어야 합니다 . 그렇지 않으면 $x
값을 얻은 하위 쉘이 아닌 원래 쉘에서 확장 됩니다 select
.
답변2
나머지 부분을 다른 것으로 실행하려면 파일을 사용하는 한 가지 방법이 있습니다.
$ cat asdf
who am i
sudo su
who am i
$ bash < asdf
jhldoe tty?? Jun 7 16:30
root tty?? Jun 7 16:30
$
더 간단한 것은 표준 입력이 제공된 쉘이 이러한 명령을 실행한다는 것입니다.
$ sudo sh <<EOF
> who am i
> pwd
> EOF
root tty?? Jun 7 16:31
/var/tmp
$
표준 입력을 읽고 터미널에 액세스하는 문제에 대해 내 솔루션을 사용할 수 있었습니다.feed
스크립트(문서,단위 테스트,.feedrc
루트의 홈 디렉토리).
$ (echo 'select x in a b c; do echo "Selected $x"; break; done') | sudo feed - bash
이렇게 하면 루트 셸에 들어가고 입력이 해당 셸에 푸시되므로 사용자의 요구 사항에 적합할 수도 있고 그렇지 않을 수도 있습니다.