"echo $SHELL"과 "which bash"의 차이점

"echo $SHELL"과 "which bash"의 차이점

Solaris 시스템에서 bash 인터프리터가 어디에 있는지 확인하려고 하는데 약간 혼란스럽습니다. 내가 입력할 때:

echo $SHELL

결과 경로는 다음과 같습니다.

/bin/bash

내가 입력할 때:

which bash

나는 얻다:

/usr/bin/bash

누구든지 이 차이점을 설명할 수 있나요?

답변1

시스템에는 다른 버전 이나 기호 링크 등 bash여러 위치에 설치 되어 있을 수 있습니다.bash

which그다지 유용한 명령은 아닙니다.대부분의 경우 실제로 이식성이 없거나 스크립트에서 매우 유용하지 않습니다. 일반적으로 말하면 type비교적 좋습니다. 뒤에 숨은 아이디어 는 인수로 제공하는 명령을 which검색하는 것입니다 .PATH

$SHELL현재 실행 중인 쉘을 반드시 반영하지는 않습니다. 대신에,$SHELL사용자가 선호하는 쉘인가, 일반적으로 로 설정됩니다 /etc/passwd. 로그인 후 다른 쉘을 시작하면 $SHELL더 이상 현재 쉘과 일치 하지 않을 수도 있습니다 .

보시다시피 $SHELLwhich전혀 관련이 없습니다. 이 중 어느 것도 실제로 어떤 쉘이 실행되고 있는지 알려주지 않습니다.

참고 사항: 불행하게도 현재 실행 중인 셸을 파일 시스템의 위치와 일치시키는 것은 생각보다 어렵습니다. 이는 바이너리가 실행되기 위해 메모리에 로드되고 대부분의 시스템에서 원본 파일이 디스크에서 제거된 후에도 메모리 내 복사본이 계속 정상적으로 실행되기 때문입니다(커널은 디스크 복사본을 "지옥" Edge에 남겨둘 수 있음). "가 삭제될 때까지). 실제로 더 이상 필요하지 않습니다). 나는 이 문제를 해결할 수 있는 이식 가능한 방법이 없다고 생각합니다. 플랫폼별 방법을 사용해야 합니다. 예를 들어 Linux에서는 링크를 검사하면 /proc/$$/exe무엇을 의미하는지 명확하게 알 수 있습니다.문서실행 중(여기서 $$실행 중인 셸의 프로세스 ID는 무엇입니까?) 안타깝게도 저는 Solaris에 익숙하지 않아서 도움을 드릴 수 없습니다.

답변2

다른 답변은 모두 좋지만 시연하고 싶습니다.

% echo $SHELL
/bin/zsh
% which bash
/bin/bash
  • login첫 번째 명령은 로그인할 때 어떤 쉘이 실행될지 알려줍니다. 나의 경우에는, /bin/zsh.
  • $PATH두 번째 명령은 해당 명령에서 첫 번째 일치 항목을 찾을 수 있음 을 알려줍니다 .bash

첫 번째는 두 번째를 의미하지 않으며 그 반대도 마찬가지입니다.

나는 다른 사람들의 답변을 다시 언급하지는 않겠지만 그 외에도 몇 가지 사항을 지적하고 싶습니다.

  • Solaris의 기본 쉘은 다음과 같습니다./bin/bash
  • 솔라리스에서는 /bin심볼릭 링크입니다../usr/bin
  • $PATH솔라리스의 기본값은 다음과 같습니다./usr/bin:/bin

이것이 바로 이 동작을 보는 이유입니다.

답변3

echo $SHELL표시된 값SHELL환경 변수. 이는 즐겨 사용하는 대화형 셸의 경로로 설정할 수 있는 사용자 구성입니다. 많은 프로그램은 $SHELL요청이 있을 때 쉘을 호출합니다.

시작 시 설정하지 않는 한 모든 쉘은 이 변수를 유지한다고 생각합니다. SHELL이 변수가 시작 시 설정되지 않으면 Bash는 이를 자체 경로로 설정합니다. 설정되지 않은 경우 ATT ksh93이 설정됩니다 SHELL( 관련되지 않은 일부 쉘의 경우 /bin/sh에도 /bin/sh). Ksh(모든 버전)는 SHELL시작되었는지 확인합니다 rsh. 그렇다면 다음과 같이 시작됩니다.제한된 껍질.

which bashbash 실행 파일의 경로를 표시합니다(아니요- )을 사용해야 합니다 type bash. 보다 정확하게는 디렉터리 $PATH에서 bash.

echo $0대화형 셸에서 셸을 호출하는 데 사용되는 명령 이름을 표시합니다.

ps $$(셸에서 입력) 셸 프로세스에 대한 정보를 표시합니다( $$셸의 ​​프로세스 ID로 확장됨).

ls -l /proc/$$/exe쉘 실행 파일의 전체 경로를 표시합니다.

예를 들어, 제가 가장 좋아하는 쉘은 zsh이지만 여기서는 $PATH.

% ./bash
$ echo $SHELL
/bin/zsh4
$ type bash
bash is /usr/bin/bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash
$ pwd
/home/gilles/src/bash-git
$ rm bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash (deleted)

답변4

$SHELL현재 로그인 셸(이 경우 bash)에 대한 경로를 설정하는 환경 변수입니다. 해당 명령을 사용하여 chsh다른 셸(예: zsh)로 전환하려는 /bin/zsh경우 echo $SHELL.

which명령은 실제로 특정 셸과 관련이 없지만 직접 호출할 때 어떤 프로그램이 실행될지 결정하는 역할을 합니다. $PATH 변수의 경로에서 실행 중인 프로그램의 여러 버전이 있을 수 있습니다. /bin/bash런타임 시 이를 보는 이유 which bashbash시스템이 계층 구조에서 프로그램을 처음 찾는 위치이기 때문입니다 $PATH.

당신은 which실행할 수 있습니다어느단순한 쉘이 아닌 명령.

관련 정보