내 sysadmin이 변경을 거부하면 bash를 로그인 쉘로 사용하는 방법 변명을주었습니다. 가장 재미있는 것은 그들이

내가 일하고있는 유닉스 sysadmin은 로그인 쉘을에서 (으) ksh로 변경하기 위해 액세스를 꺼려 합니다 bash. 그는 다양한 변명을주었습니다. 가장 재미있는 것은 그들이 모든 스크립트를 작성했기 때문에 ksh내가 실행하려고하면 작동하지 않을 것입니다. 그가이 아이디어를 어디서 얻었는지 모르겠지만 설득 할 수 없기 때문에 대안이 있습니까?

( chsh이 컴퓨터에 설치되어 있지만 로그인을 위해 공개 / 개인 키 쌍을 사용하는데 비밀번호가 없으므로 비밀번호를 chsh묻는 메시지가 표시 되면 아무 것도 제공하지 않습니다.)



답변

~/.profile로그인하면 로그인 쉘 (ksh) 이 파일 을 읽습니다. 해당 로그인 쉘이 bash로 대체되도록 지시 할 수 있습니다. 몇 가지 예방 조치를 취해야합니다.

  • 대화식 인 경우 로그인 쉘만 교체하십시오. 이것은 중요합니다. 그렇지 않으면 그래픽 모드로 로그인하는 것이 작동하지 않을 수 있습니다 (시스템에 따라 다름 : 일부 시스템 ~/.profile은 xdm 또는 이와 유사한 방식으로 로그인 할 때 일부 시스템을 읽지 못함 ) ssh foo '. ~/.profile; mycommand'.
  • bash가 사용 가능한지 확인하여 어떤 이유로 실행 파일이없는 경우에도 로그인 할 수 있습니다.

bash를 로그인 쉘로 실행할지 여부를 선택할 수 있습니다. 로그인 쉘로 만드는 유일한 차이점은로드 ~/.bash_profile또는 ~/.profile입니다. 따라서 bash를 로그인 쉘로 ~/.bash_profile실행하는 경우 bash를 재귀 적으로 실행하지 않도록주의하십시오 ~/.profile. ~/.profileksh가 아닌 bash로 실행하면 실제로 이점이 없으므로 수행하지 않는 것이 좋습니다.

또한 SHELL터미널 변수와 같은 프로그램이 해당 셸을 호출하도록 환경 변수를 bash로 설정하십시오 .

bash로 전환하는 코드는 다음과 같습니다. 끝에 넣습니다 ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

답변

이것은 약간 엉뚱하지만 bash로그인하면 .profile홈 디렉토리에 파일 을 만들어서 사용중인 쉘이 될 수 있습니다.

SHELL=`type -P bash`
exec bash -l

ksh세션 이 세션으로 대체됩니다 bash. 로그인 할 때마다 새 세션 을 수동으로 시작한 것처럼 두 번 입력 exit(또는 ^D) 하지 않아도됩니다 bash.

echo $SHELL

로 경로를 반환합니다 bash.


답변

Giles의 답변에는 bash를 실행할 때 -l 플래그가 추가되어 로그인 프로파일 스크립트가 새 bash 셸에서 제공됩니다. (예를 들어 RHEL의 /etc/profile.d/에있는 항목). 스크립트는 다음과 같아야합니다.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

답변

csh/tcsh@Gilles가 뽑은 상위권 에서 영감 을 얻은 답변 은 다음과 같습니다.

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif