저는 매우 기본적인 Linux 기술을 보유하고 있으며 현재 일부 쉘 스크립트를 구문 분석하려고 합니다. 스크립트 중 하나에서 다음 줄을 보았습니다.
if [ -n "$(which voltdb 2> /dev/null)" ];
나는 /dev/null이 비트 버킷이라는 것을 알고 있으며 명령줄에서 voltdb를 실행하면 실행할 경로가 인쇄됩니다. 또한 전체 줄은 분명히 if 문입니다. 그러나 나는 여기서 다른 많은 것들에 대해 혼란스러워합니다.
- 2가 /dev/null과 비교되는 이유는 무엇입니까? 호환되지 않는 유형인 것 같습니다.
- 스위치 -n은 무엇을 합니까? rm -r filename과 같은 스위치를 사용하는 데 익숙하지만 -n은 어떤 명령과도 쌍을 이루지 않는 것 같습니다.
- 괄호는 무엇을 하는가? 여기서는 이 표현이 아닌 다른 의미를 갖는 것 같습니다.이 테스트 표현식 []은(는) 무엇을 의미하나요?
기본적으로 이 줄의 역할은 무엇인가요? 나에게는 알려지지 않은 것이 너무 많기 때문에 외국 문장을 듣고 너무 많은 단어를 누락하여 기본 구조를 이해하지 못하는 것과 비슷합니다.
답변1
이 코드 조각에는 많은 내용이 담겨 있습니다. 내부에서 외부로 작업:
which voltdb 2> /dev/null
- 여기서 실행되는 명령은 입니다 which
. 호출되면 환경 변수의 모든 항목에서 "voltdb"라는 명령을 which
찾습니다 . PATH
에 지정된 디렉터리 중 하나에서 "voltdb"라는 실행 파일을 찾으면 PATH
실행 파일의 정규화된 이름을 인쇄합니다.voltdb
첫 번째 질문에 대답하려면 "2>"가 리디렉션의 예입니다. 각 Unix/Linux/*BSD 프로세스에는 3개의 표준 입력 및 출력이 있으며, 0은 stdin, 1은 stdout, 2는 stderr입니다. 명령줄에서 실행되는 프로그램은 일반적으로 stderr에 오류 메시지를 인쇄합니다. 따라서 2를 "/dev/null"과 수치적으로 비교하는 대신 "2 > /dev/null"은 입력을 허용하지 않고 0바이트의 출력을 반환하는 특수 파일에 which
오류 출력을 보냅니다 /dev/null
.
무엇보다도 이 $(...)
구성은 "포함된 명령을 실행하고 여기에서 '$(' 및 ')' 사이의 모든 출력을 어휘적으로 대체합니다"를 의미합니다. 이것이 쉘 프로그램이 수행하는 출력 대체입니다.
if [ -n "something" ];
출력 대체 외부에서 "무언가"가 which
인쇄될 위치에서 조각이 실행됩니다 . "if"는 "if" 다음에 나오는 명령 파이프라인이 "성공" 상태로 종료될 때 코드 블록이 실행되도록 하는 셸 제어 흐름 구조입니다.
실제로 "-n" 플래그는 "0이 아닌 문자열 길이의 다음 인수에 대해 true"를 의미합니다 [
. ]
두 번째, 세 번째 질문에 대한 답변입니다. 이 [ ... ]
구성은 일부 논리적 조건(이 경우 "0이 아닌 문자열 길이")에 대해 true(성공 코드로 종료) 또는 false(실패 코드로 종료) 응답을 제공합니다.
voltdb
궁극적으로 셸의 PATH에 실행 파일이 포함된 디렉터리가 있는 경우 코드 조각은 if-then-fi 또는 if-then-else-fi 제어 흐름의 "true" 절을 실행합니다.
답변2
이 코드는 다음을 수행합니다.
if [ -n "...." ];
큰따옴표로 묶인 코드의 실행 결과가 비어 있으면 if 문은 true입니다.
큰따옴표 안의 코드:
$(which voltdb 2> /dev/null)
명령 을 실행 which voltdb
하고 STDERR(표준 오류)에서 발생하는 명령의 출력을 리디렉션합니다 /dev/null
. 기본적으로 우리는 이에 관심이 없으므로 무시합니다.
결과는 which voltdb
voltdb 문자열과 일치하는 PATH의 실행 파일 경로를 반환합니다.
예
$ which time
/usr/bin/time
$ which time 2> /dev/null
/usr/bin/time
에 대한 2>
?
2>
다음 중 하나의 출력을 리디렉션하기 위한 약식 표기법입니다.개울프로그램 실행 시 자동으로 설정됩니다. 흐름은 다음과 같습니다.
- 0 - 표준 입력(STDIN이라고도 함)
- 1 - 표준 출력(STDOUT이라고도 함)
- 2 - 표준 오류(STDERR라고도 함)
따라서 STDERR의 출력을 가져와 삭제하려면 다음을 수행하십시오.
$ which time 2> /dev/null
STDOUT에서 출력을 가져와 STDERR로 리디렉션하려면 다음을 수행하세요.