문맥
나는 사용하고있다이 방법루트로 실행하지 않는 경우 스크립트에서 권한을 높이십시오.
내 Bash 스크립트는 사용해야 하는 특정 파일이 존재하는지 확인합니다.
if [ $EUID != 0 ]; then
if [ -f "/foo/bar" ]
then
AGE=$(expr `date +%s` - `stat -c %Y "/foo/bar"`)
echo "/foo/bar is here, ${AGE}s old"
else
echo "/foo/bar not there (yet?)"
fi
sudo "$0" "$@"
exit $?
fi
# the rest of the script, needs /foo/bar
따라서 루트가 아닌 사용자가 이 명령을 실행하고 파일이 존재하는 경우 응답은 다음과 같습니다 /foo/bar is here, 27s old
. 그렇지 않으면 응답은 입니다 /foo/bar is not there (yet?)
. 그런 다음 sudo
실행하라는 메시지를 표시합니다.
이제 질문은: 두 번째 경우, 아직 준비되지 않은 경우 , 나타나는 즉시 사용자에게 알릴 /foo/bar
수 있는 방법이 있습니까 ? /foo/bar
사용자가 비밀번호를 입력하면 "아, 파일이 있습니다." 또는 "기다린 후 Enter를 다시 누르는 것이 좋습니다."라는 메시지가 표시됩니다.
여기에는 두 부분이 있습니다.파일 시스템에 파일이 이미 존재하는지 감지(이건 묻지 마세요) 그리고sudo 프롬프트가 나타나면 무언가를 울립니다..
질문
나는 두 번째 부분에 관심이 있습니다. sudo 프롬프트 위 또는 아래에 "비동기적으로" 출력에 무언가를 쓸 수 있습니까?
답변1
질문의 두 번째 부분인 프롬프트를 기다리는 동안 메시지를 작성하는 방법에 대답하려면 다음을 수행하십시오 sudo
.
trap '2>/dev/null' CHLD
(sleep 5; echo; echo "New spam has just arrived!") &
MSGPID=$!
sudo -v
wait $MSGPID
trap - CHLD
sleep 5
서브셸에 비동기적으로 도착하는 메시지를 시뮬레이션합니다. 첫 번째는 echo
메시지가 Password:
프롬프트 옆에 나타나지 않는지 확인하는 것입니다. stderr
글쓰기 대신 글쓰기를 할 때도 작동합니다 stdout
.
첫 번째 trap
는 백그라운드 작업 상태에 대한 메시지를 제거하는 것입니다. waitpid
두 번째는 trap
첫 번째의 효과를 취소합니다 trap
.
의미 있는 PID를 반환하기 전에 하위 쉘의 명령이 종료되면 나쁜 일이 발생할 수 있습니다(일부 운영 체제에서는 발생할 수 있지만 지금은 그다지 많지 않기를 바랍니다).