[-t 1]은 무엇을 점검합니까?


답변:


14

[]바로 가기입니다 test.

에 따르면 man test:

-t FD
FD가 터미널과 연관된 파일 설명자인 경우에 해당됩니다.

따라서 bash를 대화식 쉘 (터미널- 용어 설명 은 스레드 참조 )로 실행하면 bash는 zsh로 대체됩니다.

.bash * 파일에 대한 추가 정보 :

bash가 대화식 로그인 쉘 또는 --login 옵션 을 사용하는 비 대화식 쉘로 호출 되면 파일이 존재하는 경우 먼저 / etc / profile 파일에서 명령을 읽고 실행합니다. 해당 파일을 읽은 후 ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을 순서대로 찾아서 존재하고 읽을 수있는 첫 번째 명령을 읽고 실행합니다. 이 동작을 막기 위해 쉘을 시작할 때 --noprofile 옵션을 사용할 수 있습니다.

로그인 쉘의 종료는 , bash는 읽기 및 파일에서 실행하는 명령 ~ / .bash_logout 및 /etc/bash.bash_logout, 파일이 존재하는 경우.

로그인 쉘이되지 않는 대화 형 쉘 시작은, bash는 읽기 및 실행하는 명령에서 ~은 / .bashrc에 해당 파일이 존재하는 경우. --norc 옵션을 사용하여이를 방지 할 수 있습니다. --rcfile 파일 옵션은 bash가 ~ / .bashrc 대신 파일에서 명령을 읽고 실행하도록합니다.

스테판 Chazelas가 코멘트 :
쉘은 표준 출력 터미널을하지 않고 대화 할 수 있으며, 쉘은 표준 출력에 터미널 (언제나처럼의 출력을 파이프 / 리디렉션하지 않고 터미널 내에서 스크립트를 실행), 및 비 - 상호 작용 될 수 있음을 참고 bash.bashrc대화식이 아닌 경우에도 읽습니다 ( 호스트에서 사용자의 로그인 쉘이있는 ssh host cmd위치 bash또는 bash --login -c 'some code'). case $- in *i*)...쉘이 대화식인지 테스트하는 올바른 방법입니다.


4
쉘은 stdout이 터미널이 아닌 대화식 일 수 있으며 쉘은 stdout의 터미널과 비대화식이 될 수 있으며 (출력을 재 지정 / 파이프하지 않고 터미널 내에서 스크립트를 실행할 때와 같이), 그렇지 않은 경우에도 bash읽을 수 있습니다 .bashrc대화 형 (에서와 같은 ssh host cmd경우 bash호스트에있는 사용자의 로그인 쉘, 또는 bash --login -c 'some code'어디에 .bash_profile소스 .bashrc). case $- in *i*)...쉘이 대화식인지 테스트하는 올바른 방법입니다.
Stéphane Chazelas

@ StéphaneChazelas 좋은 지적. 나는 당신의 대답에 주석이 포함됩니다
mrc02_kr

"대화식"에 대한 여러 가지 다른 정의가 있습니다. 쉘 이 대화식 이라고 생각 하면 i설정됩니다 (그리고 현대 쉘 if에서 사용 하는 대신 테스트 할 수 있음 case). 그러나 stdout (또는 stdin 또는 stderr ...)이 터미널에 연결된 경우에만 관심을 갖는 많은 유스 케이스가 있습니다.
Mark Reed

9

테스트 명령 [ -t 1 ] 검사 떠들썩한 파티의 출력 단자에 있는지 여부. 이 줄의 의도는 터미널을 열 때 다른 bash 사용을 방해하지 않고 zsh를 분명히 실행하는 것입니다. 그러나 그것은 매우 나쁘게 이루어졌습니다.

.bashrc세 가지 상황에서 파일 을 읽습니다.

  • bash가 대화식 쉘로 실행될 때, 즉 배치 명령을 실행하지 않고 사용자가 입력 한 명령을 실행합니다.
  • bash가 RSH 또는 SSH 데몬에 의해 실행되는 비 대화식 쉘인 경우 (일반적으로 실행 ssh host.example.com somecommand하고 bash는의 로그인 쉘 이기 때문에 host.example.com)
  • 예를 들어 사용자가 명시 적으로 호출하면 .bash_profile( bash의 시작 파일 선택은 약간 이상합니다 ).

[ -t 1 ]대화식 쉘을 감지하는 나쁜 방법입니다. 터미널로 가지 않는 표준 출력으로 bash를 대화식으로 실행할 수는 있지만 드문 일입니다. 비 대화식 쉘에서 터미널로가는 표준 출력을 갖는 것이 더 일반적입니다. 비 대화식 쉘은 비즈니스가 실행 .bashrc되지 않지만 불행히도 SSH가 호출 한 쉘을 bash합니다. 훨씬 더 좋은 방법이 있습니다. bash (및 다른 sh 스타일 쉘)는 신뢰할 수있는 내장 방법을 제공합니다.

case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

따라서“대화식 쉘인 경우 zsh를 시작하십시오”라고 작성해야합니다.

case $- in
  *i*) exec zsh;;
esac

그러나 그것은 좋은 생각이 아닙니다 : bash 쉘을 열지 못하게하여 zsh를 사용하더라도 유용합니다. 이 블로그 게시물을 잊어 버리고 대신 bash 대신 zsh를 실행하도록 터미널을 여는 바로 가기를 구성하십시오. "Windows에서 Bash 응용 프로그램을 열 때마다 Zsh 쉘로 시작합니다": zsh를 원할 때 Zsh 응용 프로그램을 열도록 구성하지 마십시오.


위해 rsh/ ssh이 있다면 대화 형 쉘, 그건 하지 로그인 쉘. 로그인 셸의 경우 ( sshd비 대화식 로그인 셸을 시작하지 않지만로 할 수 있음 ssh host exec bash -l) .bash_profile대신 읽습니다. 또한 대한주의 rsh/ ssh, 당신은 또한 필요 $SHLVL해제 또는 0으로
스테판 Chazelas가

5

남자 1 테스트 :

-t FD

터미널에서 파일 디스크립터 FD가 열린다

내 예 실행한다 (대체한다,이 경우, 처리를 실행하는 bash)와 zsh경우에 표준 출력은 단자 (안 등의 파일 / 파이프 /)에 개방된다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.