새로운 cygwin .bashrc 대화형 검사가 작동하지 않는 이유는 무엇입니까?

새로운 cygwin .bashrc 대화형 검사가 작동하지 않는 이유는 무엇입니까?

방금 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 문서를 읽는 독자들은 .bashrcBash가 대화형 셸에서 실행되고 있는지 확인 해야 하는 이유가 궁금할 것입니다 .bashrc.인터렉티브껍질을 쿵쿵 두드리세요. 그럼에도 불구하고 ~/.bashrc대부분의 Unix 계열 시스템에는 현재 셸이 대화형인지 확인하기 위해 기본적으로 일부 유형의 검사(test $-또는 )가 포함되어 있습니다.$PS1

그 이유는Bash에는 원격 쉘을 위한 특별한 경우가 있습니다.. 비대화형 Bash 쉘은 일반적으로 ~/.bashrc시작 시 명령을 실행하지 않지만 쉘이 시작될 때 특별한 상황이 발생합니다.원격 쉘 데몬에 의해 호출됨:

rshdBash는 원격 쉘 데몬(보통 쉘 데몬 )이나 보안 쉘 데몬 에 의해 실행되는 경우와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다 sshd. Bash가 이런 방식으로 실행 중이라고 판단하면 ~/.bashrc에서 명령을 읽고 실행합니다(파일이 존재하고 읽을 수 있는 경우). 로 호출되면 이 작업을 수행하지 않습니다 sh.

자세한 내용은 내 답변을 참조하세요.bashrc가 현재 쉘이 대화형인지 확인하는 이유는 무엇입니까?.

관련 정보