.bashrc 파일에서 "대화형으로 실행하지 않는 한 아무것도 하지 마십시오"는 무엇을 의미합니까?

.bashrc 파일에서 "대화형으로 실행하지 않는 한 아무것도 하지 마십시오"는 무엇을 의미합니까?

내 .bashrc 상단에는 다음 명령이 포함되어 있습니다.

# If not running interactively, don't do anything
case $- in
   *i*) ;;
    *) return;;
esac

내 .bashrc 템플릿은 Ubuntu에서 생성되었기 때문에 내 .bash.rc에 추가한 적이 없습니다.

내가 아는 한, 이 명령은 원격 셸(rsh) 또는 보안 셸(ssh)에서 .bashrc 파일을 가져오는 것을 방지하기 위한 것입니다. .bashrc에 다음과 같은 내용이 있는 경우 alias rm='rename'위의 별칭은 원격 셸에서 작동하지 않습니다. 그러나 해당 명령이 없으면 별칭이 작동합니다. 원격 셸에 "이름 바꾸기"가 설치되어 있지 않으면 rm실행 시 오류가 발생합니다. 따라서 궁극적인 목표는 .bashrc 파일의 출처를 차단하여 예상치 못한 동작을 방지하는 것입니다.

그래서 이것이 내가 혼란스러워하는 곳입니다.이 명령을 완전히 제거했는데 원격 셸에는 아무런 차이가 없습니다.테스트하기 전에 .bashrc를 가져왔고 시스템을 재부팅하기도 했지만 ssh(이 경우 서버 2개)에서 예상치 못한 동작이 전혀 보이지 않습니다.

.bashrc에 echo 함수를 생성하고 서버에서 호출하는 등의 간단한 테스트를 시도했습니다. 내가 얻는 전부는명령을 찾을 수 없습니다: foo.

내가 내릴 수 있는 유일한 결론은 내 서버 중 하나에는 자체 .bashrc가 있고 다른 서버에는 .zshrc가 있기 때문에 내 로컬 .bashrc보다 우선하므로 소스가 제공되지 않는다는 것입니다. 그렇다면 위 명령이 왜 필요한가요? 위 명령은 더 이상 사용되지 않으며 2022년에는 더 이상 유효하지 않습니까? 아니면 작동할 수도 있지만 .bashrc, .zshrc 또는 유사한 파일이 없는 서버에 ssh를 사용하는 시스템 관리자에게만 해당됩니다.

요약:이미 자체 .bashrc 또는 .zshrc 파일이 있는 내 서버에 ssh를 통해서만 연결하는 경우 .bashrc 파일에 이를 추가해야 합니까?

답변1

하나인터렉티브쉘은 프롬프트를 표시하고 명령을 입력할 수 있는 곳입니다.

비대화형 쉘은 스크립트를 시작하는 곳입니다.

읽다6.2 Bash 시작 파일쉘이 시작될 때 어떤 파일이 검색되는지 보려면 매뉴얼을 참조하십시오.

일반적으로 무언가를 넣습니다.

  • ~/.profile또는 ~/.bash_profile로그인 시 발생하기를 원합니다(환경 변수 설정, SSH 에이전트 시작, 대화형 쉘 및 실행 중인 기타 프로그램에 영향을 미치는 작업).
  • ~/.bashrc대화형 사용을 위해서만 설정하려는 것(별칭, 기능, 명령 입력을 더 쉽게 만드는 것)

이것이 차이점이다

$ echo "$-"
himBCHs

그리고 스크립트를 실행하세요

$ cat > myscript.sh
#!/usr/bin/env bash
echo "$-"

$ bash ./myscript.sh
hB

~/.bashrc스크립트에서 필요한 것이 있으면 할 수 있지만 source ~/.bashrc질문의 사례 설명으로 인해 실패할 수 있습니다. 더 나은 옵션은 bash에게 대화형 쉘처럼 작동하도록 지시하는 것입니다.

$ bash -i ./myscript.sh
himBCH

답변2

남자 배쉬가 말한다

An interactive shell is one started without non-option 
arguments (unless -s is specified) and without the -c option  
whose  standard input and error are both connected to  
terminals (as determined by isatty(3)), or one started with   
the -i option. PS1 is set and $- includes i if bash is  
interactive, allowing a shell script or a startup file to 
test this state.

방금 보여준 코드는 쉘이 대화형인지 확인하는 테스트입니다. 이 경우 나머지는 실행되고, .bashrc그렇지 않으면 init-shell 파일의 나머지는 무시됩니다.

답변3

TLDR: 이미 자체 .bashrc 또는 .zshrc 파일이 있는 내 서버에 SSH를 통해서만 연결하는 경우 이를 .bashrc 파일에 추가해야 합니까?

예, 아니오.

예. 파일 전송 명령이 scp제대로 작동하는지 확인하려면 이 정보가 필요합니다. 이 오류를 참조하세요:https://bugzilla.redhat.com/show_bug.cgi?id=20527

echo.bashrc 에 아무것도 없으면 scp실패합니다 .

아니요. 파일 전송이 제대로 작동하는지 확인하고 비대화형 셸을 통해 명령을 실행하지 않는 경우 .bashrc에 해당 파일이 필요하지 않습니다.

답변4

이것은 내가 찾은 가장 선명한 사진입니다.

여기에 이미지 설명을 입력하세요.

(죄송합니다, 사진 출처를 잃어버렸습니다. 찾으시면 알려주세요)


이를 사용하여 ssh remote원격 서버에 연결하면 로그인 대화형 셸이 됩니다.

ssh remote echo 1다음을 사용하여 원격 서버에 연결된 경우echo 1

exec /bin/zsh내부 실행과 같은 트릭을 사용 ~/.bash_profile하고 을 ssh remote사용하여 해당 서버에 연결하면 zsh는 비로그인 대화형으로 실행됩니다.

exec /bin/zsh내부 실행과 같은 트릭을 사용 ~/.bash_profile하고 ssh remote echo 1zsh를 사용하여 해당 서버에 연결하면 비대화식으로 비로그인으로 실행됩니다.

관련 정보