stderr의 특정 오류 리디렉션

stderr의 특정 오류 리디렉션

if그래서 일부 기능을 가져오는 명령문을 사용하여 스크립트를 실행하고 싶습니다 .

$ cat functions.sh
#!/bin/bash

sampleFunction(){
    if [[ ! "${fakeVariable}" == '2' ]]
    then
        read -n1 -r -p "Error! Press any key to continue ..."
    fi
}
sampleFunction
echo "Well, hi!"

내가 실행할 때 :

if ! 2>/dev/null . "${HOME}"'/functions.sh'
then
    echo "${HOME}"'/functions.sh could not be spawned. Terminating ...'
fi

콘솔은 출력하지 않지만 Error! Press any key to continue ...거기에 앉아서 내가 키를 누를 때까지 기다리고 있습니다. 일단 그렇게 하면 Well, hi무엇이 인쇄되는지 알 수 있습니다.

functions.sh누락된 경우 $HOME다음과 같이 인쇄됩니다.

/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

그래야만합니다.

내가 그것을 꺼내서 2>/dev/null존재 functions.sh한다면, 나는 Error! Press any key to continue ...그것을 원래대로 인쇄하고 Well, hi!키를 누른 후를 추적합니다.

만약 2>/dev/null그렇다면 꺼내면functions.sh잃어버린,나는 얻다:

-bash: /Users/leetbacoon/functions.sh: No such file or directory
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

기본적으로 내가 원하는 것은 이것이다.

$ ### functions.sh exists
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
Error! Press any key to continue ...
Well, hi!
$ ###
$ ### functions.sh doesn't exist
$ if ! 2>/dev/null . "${HOME}"'/functions.sh' ; then echo "${HOME}"'/functions.sh could not be spawned. Terminating ...' ; fi
/Users/leetbacoon/functions.sh could not be spawned. Terminating ...

운영 체제는 macOS High Sierra 10.13.6이고 bash 버전은 3.2.57(1) 릴리스입니다.

답변1

프롬프트와 진단 메시지는 항상 표준 오류 스트림에서 생성됩니다. 이는 일반 출력의 리디렉션 가능성을 방해하지 않기 위한 것입니다. $PS1그런데 쉘의 메인 프롬프트( )도 마찬가지이다.

이는 read -p출력 프롬프트가 다음과 같다는 것을 의미합니다.반품표준 오류 스트림에 쓰고 해당 스트림을 로 리디렉션하므로 /dev/null프롬프트 메시지가 표시되지 않습니다.

/Users/leetbacoon/functions.sh그것을 얻으려고 하기 전에 그것이 존재하는지 테스트하는 것이 좋습니다 :

if [ -f "$HOME/functions.sh" ]; then
    . "$HOME/functions.sh"
else
    printf '%s is missing...\n' "$HOME/functions.sh" >&2
done

~/.bash_profile이는 때때로 호출되는 방식을 모방하고 ~/.bashrc"해당 파일 또는 디렉토리 없음" 오류를 방지합니다.

또한 생성된 오류 메시지는 오해의 소지가 있습니다. 파일을 가져오더라도 서브셸은 물론 아무것도 "생성"되지 않습니다.

답변2

read명령은 프롬프트를 인쇄하는 데 사용됩니다 stderr. 아니면 당신은해야합니다

  1. 2> /dev/null스크립트를 호출할 때 사용하지 마세요.
  2. stdout을 사용하여 프롬프트를 인쇄하려면 2>&1명령 끝에 다음을 추가하세요 .read
        read -n1 -r -p "Error! Press any key to continue ..." 2>&1

관련 정보