현재 tty에 연결된 su를 통해 heredoc 스크립트를 실행하십시오.

현재 tty에 연결된 su를 통해 heredoc 스크립트를 실행하십시오.

나는 다음과 같은 일을하려고합니다 :

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

문제는 selecthere 문서로 리디렉션되는 표준 입력에서 읽으려고 하는 것입니다. 프롬프트에 대한 응답이 없기 때문에 오류가 발생합니다.

해결 방법은 여기에 설명된 대로 입력을 다시 터미널로 리디렉션하는 것입니다.

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

이렇게 하면 루트 셸에 들어가고 입력이 해당 셸에 푸시되므로 사용자의 요구 사항에 적합할 수도 있고 그렇지 않을 수도 있습니다.

관련 정보