방금 Cygwin을 업데이트했는데 새 버전의 .bashrc
상단에 다음 줄이 포함되어 있습니다.
echo "BEFORE TEST"
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
echo "AFTER TEST"
대화형으로 실행하지 않으면 아무 것도 할 필요가 없다는 것을 알고 있지만 다음 ssh
명령을 사용하는지에 대한 질문이 있습니다.
ssh localhost pwd
나는 이것을 본다:
BEFORE TEST
따라서 분명히 [[ "$-" != *i* ]]
테스트에 실패하고 반환됩니다. 분명히 ssh localhost pwd
이것은 간단한 예이지만 .bashrc
명령을 실행하면 항상 실행할 수 있기를 원합니다 ssh
. 내 실제 자동화는 이 cygwin 인스턴스에 대해 원격으로 명령을 실행하지만 .bashrc
경로( my 에서 설정)가 올바르게 설정되지 않았기 때문에 실패합니다.
또한, 이 테스트가 실제로 무엇을 하는지 설명해 줄 수 있는 사람이 있나요? 무엇인가요 i
? $-
그것은 무엇을 의미해야 합니까?
답변1
pwd
( 귀하의 경우) 로 단일 명령을 실행하면 ssh
대화형 셸이 아니므로 동작이 정확하다고 생각합니다.
in이 아닌 in 또는 PATH
으로 설정해야 합니다 .~/.profile
~/.bash_profile
~/.bashrc
발견된 대로bash(1)
매뉴얼 페이지:
매개변수 (...) 특수 매개변수 쉘은 여러 매개변수를 특별히 처리합니다. 이러한 매개변수는 정보 제공 목적으로만 할당이 허용되지 않습니다. (...) - 호출 시 지정된 현재 옵션 플래그로 확장됩니다. set 내장 명령을 통해 또는 쉘을 통해 (예: -i 옵션)
따라서 i
포함은 옵션이 사용되었음을 $-
의미합니다 -i
(또는 대화식으로 쉘에 의해 자동으로 설정됨).
답변2
엔조팁의 답변맞지만(따라서 투표), SSH를 통해 쉘을 시작할 때 쉘 시작과 관련된 세부 정보로 보완해야 한다고 생각했습니다.
Bash 문서를 읽는 독자들은 .bashrc
Bash가 대화형 셸에서 실행되고 있는지 확인 해야 하는 이유가 궁금할 것입니다 .bashrc
.인터렉티브껍질을 쿵쿵 두드리세요. 그럼에도 불구하고 ~/.bashrc
대부분의 Unix 계열 시스템에는 현재 셸이 대화형인지 확인하기 위해 기본적으로 일부 유형의 검사(test $-
또는 )가 포함되어 있습니다.$PS1
그 이유는Bash에는 원격 쉘을 위한 특별한 경우가 있습니다.. 비대화형 Bash 쉘은 일반적으로 ~/.bashrc
시작 시 명령을 실행하지 않지만 쉘이 시작될 때 특별한 상황이 발생합니다.원격 쉘 데몬에 의해 호출됨:
rshd
Bash는 원격 쉘 데몬(보통 쉘 데몬 )이나 보안 쉘 데몬 에 의해 실행되는 경우와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다sshd
. Bash가 이런 방식으로 실행 중이라고 판단하면 ~/.bashrc에서 명령을 읽고 실행합니다(파일이 존재하고 읽을 수 있는 경우). 로 호출되면 이 작업을 수행하지 않습니다sh
.
자세한 내용은 내 답변을 참조하세요.bashrc가 현재 쉘이 대화형인지 확인하는 이유는 무엇입니까?.