그래서 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.
hash
bash
해시 테이블을 사용하여 입력한 명령의 전체 경로를 찾는 bash의 내부 명령입니다 .
스크립트는 이를 사용하여 node
경로에서 실행 파일을 검색하는지 확인합니다.
답변4
hash node
PATH에서 node라는 첫 번째 명령을 검색하고 기억된 위치 목록에 노드 위치를 추가 또는 업데이트하거나, 노드를 찾을 수 없으면 1을 반환합니다.
다음과 같은 이유로 which 대신 해시를 사용하십시오.
- 이는 POSIX에서 정의되지 않습니다.
- 일부 환경에서는 PATH를 변경할 수 있는 csh 스크립트입니다.
- 예를 들어, bash에는 해싱이 내장되어 있지만 그렇지 않으며 일반적으로 해싱이 더 빠릅니다.
주석에서 언급했듯이 문제는 스크립트를 실행할 때 실제로 PATH에서 노드가 누락된다는 것입니다. 따라서 which node
동일한 결과를 얻습니다.