~/.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_profile
stdout 에 대한 출력이 없는 경우 가장 좋습니다 .~/.profile
rsync
어쨌든 잘못된 구성이 존재할 수 있으므로 상호 작용성을 테스트하는 것이 좋습니다.
답변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를 사용하여 사용자에게 연결하여 작업을 수행했는지 확인하십시오. 대화형이 아닌 세션에 출력이 있으면 실패합니다.