쉘이 대화형 모드에서 실행 중인 경우 bash에서 어떻게 확인할 수 있나요?

쉘이 대화형 모드에서 실행 중인 경우 bash에서 어떻게 확인할 수 있나요?

~/.bashrc대화형 모드에서 실행 중인지 또는 SSH를 통해 명령을 실행 중인지 어떻게 알 수 있습니까 ? .bashrc후자인 경우 ANSI 이스케이프 시퀀스 인쇄를 피하고 싶습니다 .

답변1

에 따르면 man bash:

PS1이 설정되고 bash가 대화형인 경우 $-에는 i가 포함되어 쉘 스크립트나 시작 파일이 이 상태를 테스트할 수 있습니다.

따라서 다음을 사용할 수 있습니다.

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

또한:

로그인 셸이 아닌 대화형 셸이 시작되면 bash는 /etc/bash.bashrc 및 ~/.bashrc(이러한 파일이 있는 경우)에서 명령을 읽고 실행합니다.

따라서 ~/.bashrc대화형 쉘에만 소스가 제공됩니다. 때때로 사람들은 예상되는 동작을 방해하기 때문에 출처가 잘못된 ~/.bash_profile것 입니다. ~/.profile공통 코드의 유지 관리를 단순화하려면 별도의 파일을 사용하여 공통 코드를 포함하고 두 rc 파일에서 독립적으로 소스를 제공해야 합니다.

예를 들어 로그인 rc파일 의 올바른 작동을 방해할 수 있으므로 ~/.bash_profilestdout 에 대한 출력이 없는 경우 가장 좋습니다 .~/.profilersync

어쨌든 잘못된 구성이 존재할 수 있으므로 상호 작용성을 테스트하는 것이 좋습니다.

답변2

도구 test는 이를 확인할 수 있습니다(맨 페이지에서):

 -t FD          True if FD is opened on a terminal.

예를 들어 다음을 사용할 수 있습니다.

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

또는

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

답변3

사용:

if tty -s; then echo interactive; fi

답변4

Red Hat이 하는 방식은 이렇습니다... 가장 빠른 방법인 것 같네요...

if [ "${-#*i}" == "$-" ]; then

이는 bash 매개변수를 가져오고, 하위 문자열을 제거하고, 가능한 한 가장 짧게 수행하고, 시작과 i 사이의 모든 항목을 일치시키는 것을 의미합니다. 그런 다음 원래 bash 매개변수와 동일한지 확인하세요.

SFTP를 사용하여 사용자에게 연결하여 작업을 수행했는지 확인하십시오. 대화형이 아닌 세션에 출력이 있으면 실패합니다.

관련 정보