백그라운드에서 실행되는 쉘 스크립트의 프롬프트에 어떻게 응답합니까?

백그라운드에서 실행되는 쉘 스크립트의 프롬프트에 어떻게 응답합니까?

HP-UX 서버에 소프트웨어를 설치하기 위한 스크립트를 작성 중입니다. 스크립트가 시작되면 설치 경로를 묻는 메시지가 표시됩니다. 계속 실행할 수 있도록 스크립트에 경로를 전달해야 합니다. 이 요구 사항이 존재하는 스크립트에는 단 한 곳만 있습니다.

스크립트 프롬프트는 다음과 같습니다. 기본 경로를 보려면 Enter 키를 누르거나 소프트웨어를 설치하려면 경로를 입력하세요.

기본 경로를 사용하고 싶지 않아서 새로운 경로를 입력해야 합니다. 하지만 이 스크립트는 백그라운드에서 실행되므로 경로를 제공해야 합니다. 스크립트 형식의 정확한 응답을 잘 모르겠습니다.

답변1

파이프를 사용하여 스크립트의 표준 입력에 대한 답변을 에코할 수 있습니다.

echo "My/Path/not/default"| yourscript.sh

답변2

스크립트가 시작될 때 모든 입력을 제공할 수 있는 경우 다음을 통해 그렇게 할 수 있습니다.리디렉션프로그램 입력. 즉, /path/to/installer달리는 대신 달리세요.

{ echo '/the/path/where/to/install';
  echo 'answer to the second prompt';
} | /path/to/installer

또는 사용여기 문서:

/path/to/installer <<'EOF'
/the/path/where/to/install
answer to the second prompt
EOF

때때로 프로그램과 상호 작용하고 싶지만 다른 작업에도 터미널을 사용하려면 다음 환경에서 프로그램을 실행하십시오.터미널 멀티플렉서예를 들어화면또는멀티플렉서. screen을 사용하여 를 실행하여 세션을 시작한 screen다음 프로그램을 시작합니다. 다른 작업을 수행하려면 +를 눌러 Ctrl두 번째 창을 만든 다음 +를 눌러 창 사이를 이동하세요. 화면을 종료하고 프로그램을 계속 실행하려면 + , ("분리")를 누르십시오. 기존 Screen 세션으로 돌아가려면 실행하세요(옵션 없이 새 세션이 시작됨).AcCtrlAnCtrlAdscreen -rdscreen

답변3

자동 답변을 제공하려면 다음 방법 중 하나를 사용할 수 있습니다.

insaller.sh < an_input_file

또는

command-line | installer.sh

installer.shread -p스크립트를 사용하는 경우 다음 예와 같이 몇 가지 참고할 사항이 있습니다 .

read -p "Press ENTER for default path or enter path to install software:" answer

man bash표준 입력이 터미널이 아닌 경우 아무것도 인쇄되지 않도록 지정합니다.

이것이 당신의 경우라면 다음과 같은 이상한 일을 시도해 볼 수 있습니다:

( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh

상황에 맞게 초를 조정해야 합니다( 30위 예에서).

이런 일이 발생하면read -p 미사용설치 스크립트에서 다음 GNU해결 방법을 시도해 볼 수 있습니다.

 tempdir="$(mktemp -d)"
 mkfifo  "${tempdir}"/input
 touch "${tempdir}"/output.log
 ./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 &
 installerpid=$!
 tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input &

 # ... do stuff


 # before ending the script, just wait that all background processes stop
 wait
 rm -f "${tempdir}"/input "${tempdir}"/output.log

아이디어는 2개의 백그라운드 명령줄을 사용하는 것입니다. 하나는 스크립트를 설치하고 다른 하나는 프롬프트를 기다리고 답변을 제공하는 것입니다.

통신에는 네임드 파이프( input)와 일반 파일( output.log)이 사용됩니다.

tail --pid=$installerpid -fn 1 "${tempdir}"/output.log파일에 쓰여진 줄을 인쇄하십시오 output.log. 설치 프로그램 스크립트가 종료되면 종료됩니다.

( fgrep -q ... ; printf .. ) >> ...input: 프롬프트가 발견될 때까지 차단하고 설치 스크립트에 대한 새 경로를 제공합니다.

관련 정보