쉘이 대화식 모드로 실행되고 있는지 bash에서 어떻게 확인할 수 있습니까?


45

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


이스케이프 시퀀스를 인쇄할지 여부를 선택하는 것은 쉘의 대화식이 아닌 $ TERM 값을 기반으로하는 것이 좋습니다. 변수는 이스케이프 시퀀스를 해석하는 부분 인 클라이언트 터미널의 기능을 식별합니다.
yrk

답변:


52

에 따르면 man bash:

bash가 대화식 인 경우 PS1이 설정되고 $-i를 포함하여 쉘 스크립트 또는 시작 파일이이 상태를 테스트 할 수 있도록합니다.

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

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

또한:

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

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

로그인 rc파일과 같이 stdout에 출력이 ~/.bash_profile없거나 예를 들어 ~/.profile올바른 작동을 방해 할 수 있으므로 가장 좋습니다 rsync.

어쨌든 잘못된 구성이 존재할 수 있으므로 대화 형 기능을 테스트하는 것이 좋습니다.


7
$-는 i를 포함 할 수 있으며 반드시 같을 필요는 없습니다. 내가 사용하는[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky : 평등 테스트에서 별표가 포함 위해 테스트하기i
데니스 윌리엄슨

오 와우도 그것들을 알아 차리지 못했습니다. 모니터에서 큰 따옴표처럼 보입니다. 글꼴 크기가 커질 때가 있습니다. <
늙음

때때로, 사람들 은 예상되는 행동을 방해하기 때문에 그것을 출처에서 얻 ~/.bash_profile거나 ~/.profile올바르지 않습니다 . 당신은 소싱에 대해 어떻게 생각하십니까 ~/.bashrc에서 ~/.bash_login? 로그인 셸이 대화식 일 필요는 없으므로 잘못된 것 같습니다.
Piotr Dobrogost

1
@PiotrDobrogost : 이것은 쉘 시작 파일에 대한 훌륭한 토론 입니다.
Dennis Williamson

12

사용하다:

if tty -s; then echo interactive; fi

작동하지 않는 것
Steven Shaw

이 난이 정답이라고 생각 하나 나를 위해 작동하지 않습니다 stackoverflow.com/a/49064632/1223975
알렉산더 밀스

표준 입력에 TTY가 있는지 확인합니다. 관련 될 수 있지만 쉘의 "-i"플래그로 표시되는 쉘의 대화식 모드와 동일하지 않습니다.
yrk

작동하지 않습니다. 왜 사람들은 공감 했습니까?
Setop

11

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

멋지고 포탄 사이에 이식성이있는 것 같습니다. 테스트 bash <<< 'test -t 0 && echo Y || echo X'쓰기 Y, bash -c 'test -t 0 && echo Y || echo X'쓰기X
kyb

1
또한 표준 입력이 TTY인지 확인합니다. 관련 될 수 있지만 쉘의 "-i"플래그로 요청되고 표시되는 쉘의 대화식 모드와 동일하지 않습니다.
yrk

6

나는 일반적으로 프로그램 tty의 출력을 봅니다.

당신이 tty에 있다면, 그것은 당신이 어떤 tty에 있는지 알려줄 것입니다. 대화식 모드가 아닌 경우 일반적으로 "tty가 아님"과 같은 것을 알려줍니다.


3
tty -s는 터미널에 있으면 리턴 값 0을 설정하고 그렇지 않으면 출력을 제공하지 않고 1을 설정합니다. 당신은 'if tty -s; _interactive; fi '
BillThor

감사! 그것은이었다 ... 내가 이런 종류의 작업을 수행하는 데 필요한 한 이후 시간과 나는 세부 사항의 일부를 잊고 추측
크리스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.