.sh 파일의 "hash" 명령을 이해하는 데 문제가 있습니다.

.sh 파일의 "hash" 명령을 이해하는 데 문제가 있습니다.

그래서 Linux 시스템에 Etherpad lite를 설치하고 싶습니다. 실행하려고 하면 오류가 발생합니다.

"node.js를 설치하세요(http://nodejs.org)"

이 명령은 which node노드 js에 대한 올바른 경로를 제공합니다. 그래서 Etherpad Lite의 .sh 파일로 가서 다음을 발견했습니다:

  #Is node installed?
  hash node > /dev/null 2>&1 || { 
  echo "Please install node.js ( http://nodejs.org )" >&2
  exit 1 
}

내 생각에 이것은 다음을 의미한다고 생각합니다. 노드를 확인하고 사용 가능한 인쇄 줄이 없으면 종료하십시오. 그런데 이 코드는 정확히 무엇을 하는 걸까요? 해싱은 무엇을 합니까? 이 금액 &은 다 어떻게 되나요 >?

누구든지 이 세 줄을 나에게 설명해 주실 수 있습니까? 매우 감사하겠습니다.

답변1

Bash 쉘에 명령을 입력하면 쉘은 $PATH 변수 전체에서 해당 명령을 찾습니다. 해시는 단순히 입력한 명령과 해당 명령이 발견된 위치에 대한 색인으로, 다음에 해당 명령을 찾는 속도를 높이는 데 도움이 됩니다.

노트: @Anthon의 답변해시가 무엇인지에 대한 좋은 정의를 제공합니다!

예를 들어, 인수 없이 명령을 실행하면 hash이전에 찾은 명령 목록과 해당 명령이 사용된 횟수(예: 클릭)가 표시됩니다.

% hash
hits    command
   2    /usr/bin/host
   1    /bin/more
   1    /home/saml/bin/autossh_mail.sh
   3    /usr/bin/zip
   2    /bin/rm
   2    /bin/date
   2    /usr/bin/vim
   1    /usr/bin/htop
   2    /bin/mv
   3    /bin/ps
   8    /usr/bin/ssh
   1    /usr/bin/yum
   1    /usr/bin/xfreerdp
   1    /bin/cp
   2    /bin/mkdir
   4    /usr/bin/man
   1    /usr/bin/gvim
   1    /usr/bin/unzip
   1    /usr/bin/w
   5    /usr/bin/nslookup
  51    /bin/ls
  15    /usr/bin/find

이 명령은 hash node값이 해시 목록에 존재하는지 여부에 따라 상태 값(0 또는 1)을 반환합니다.

hash node내 목록에 없어

% hash node
bash: hash: node: not found
% echo $?
1

노트:이전에 실행한 명령의 상태는 환경 변수에 임시로 저장됩니다.$?. 각 명령이 실행된 후 상태(0 = 성공, 1 = 실패)가 배치되는 위치입니다.

"cmd1" || { "cmd2" ... } 구문은 or 문입니다. 여기에서 생각하고/또는 논리로 시작하세요. 즉, 첫 번째 작업을 수행하고, 실패하면 두 번째 작업을 수행하고, 그렇지 않으면 두 번째 작업을 수행하지 않는다는 의미입니다.

더 자세한 예:

% true && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 1

% false && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 0

1을 반환하면 명령이 실패했음을 의미하고 0을 반환하면 명령이 성공적으로 실행되었음을 의미하기 때문에 논리는 항상 혼란스럽습니다(적어도 나에게는).

답변2

이전에 게시한 답변 외에 "2>&1" 부분에 대한 설명을 추가하고 싶습니다.

> /dev/null

출력 파일 설명자(파일 설명자는 파일, 파이프 및 터미널을 읽고 쓰는 프로세스에서 사용하는 번호임)를 /dev/null 파일로 리디렉션합니다. 이 파일은 기록된 모든 콘텐츠를 읽기 때문에 시스템의 "쓰레기통"입니다. 그리고 데이터는 폐기됩니다.

2>&1

stderr 번호 2(잘못된 출력 "파일") 파일 설명자를 파일 설명자 1로 리디렉션합니다. 이는 방금 /dev/null로 리디렉션되었습니다. 즉, 무시되었습니다.

따라서 이 두 부분을 함께 사용하면 hash 명령에 어떤 출력도 표시되지 않습니다.

답변3

Bash 매뉴얼에서:

Each time hash is invoked, the full pathname of the command name
is  determined  by searching the directories in $PATH and remembered.  
Any previously-remembered pathname is discarded.

hashbash해시 테이블을 사용하여 입력한 명령의 전체 경로를 찾는 bash의 내부 명령입니다 .

스크립트는 이를 사용하여 node경로에서 실행 파일을 검색하는지 확인합니다.

답변4

hash nodePATH에서 node라는 첫 번째 명령을 검색하고 기억된 위치 목록에 노드 위치를 추가 또는 업데이트하거나, 노드를 찾을 수 없으면 1을 반환합니다.

다음과 같은 이유로 which 대신 해시를 사용하십시오.

  • 이는 POSIX에서 정의되지 않습니다.
  • 일부 환경에서는 PATH를 변경할 수 있는 csh 스크립트입니다.
  • 예를 들어, bash에는 해싱이 내장되어 있지만 그렇지 않으며 일반적으로 해싱이 더 빠릅니다.

주석에서 언급했듯이 문제는 스크립트를 실행할 때 실제로 PATH에서 노드가 누락된다는 것입니다. 따라서 which node동일한 결과를 얻습니다.

관련 정보