if [ -n "$(which voltdb 2> /dev/null)" ];의 의미는 무엇입니까?

if [ -n "$(which voltdb 2> /dev/null)" ];의 의미는 무엇입니까?

저는 매우 기본적인 Linux 기술을 갖고 있으며 이제 일부 쉘 스크립트를 구문 분석하려고 합니다. 스크립트 중 하나에 다음 줄이 표시됩니다.

if [ -n "$(which voltdb 2> /dev/null)" ];

나는 /dev/null이 비트 버킷이고 명령줄에서 voltdb를 실행했다면 실행되었을 경로를 인쇄한다는 것을 알고 있습니다. 또한 전체 줄은 분명히 if 문입니다. 그러나 나는 여기서 다른 많은 것들에 대해 혼란스러워합니다.

  1. 2가 /dev/null과 비교되는 이유는 무엇입니까? 호환되지 않는 유형인 것 같습니다.
  2. -n 스위치는 무엇을 합니까? rm -r filename과 같은 스위치를 사용하는 데 익숙하지만 -n이 어떤 명령과도 쌍을 이루지 않는 것 같습니다.
  3. 괄호는 무엇을 합니까? 여기서는 이 표현이 아닌 다른 의미를 갖는 것 같습니다.이 테스트 표현 []의 의미는 무엇입니까?

기본적으로 이 줄의 역할은 무엇인가요? 제게는 알려지지 않은 내용이 너무 많습니다. 따라서 마치 외국어로 된 문장을 듣는데 너무 많은 단어가 누락되어 기본 구조를 파악할 수 없는 것과 같습니다.

답변1

해당 코드 조각에는 많은 일이 일어나고 있습니다. 내부에서 외부로 작업:

which voltdb 2> /dev/null- 여기서 실행되는 명령은 입니다 which. which호출되면 PATH환경 변수의 모든 항목을 조사하여 "voltdb"라는 명령을 찾습니다. 에 명명된 디렉터리 중 하나에서 "voltdb"라는 실행 파일을 찾으면 실행 파일 PATH의 전체 이름을 인쇄합니다 voltdb.

#1에 답하기 위해 "2>"는 리디렉션의 예입니다. 모든 Unix/Linux/*BSD 프로세스에는 3개의 표준 입력 및 출력이 있습니다. 0은 stdin, 1은 stdout, 2는 stderr입니다. 명령줄에서 실행되는 프로그램은 일반적으로 stderr에 오류 메시지를 인쇄합니다. 따라서 "2> /dev/null"은 2를 "/dev/null"과 수치적으로 비교하는 것이 아니라 모든 which오류 출력을 /dev/null입력을 먹는 특수 파일인 로 보내고 0바이트의 출력을 반환합니다.

그 밖의 $(...)구성은 "동봉된 명령을 실행하고 바로 여기 '$(' 및 ')' 사이의 모든 출력을 어휘적으로 대체"를 의미합니다. 이는 쉘 프로그램이 수행하는 출력 대체입니다.

출력 대체 외부에서는 조각이 수행됩니다 if [ -n "something" ];. 여기서 "무언가"는 which인쇄되었을 것입니다. "if"는 쉘 제어 흐름 구성으로, "if" 뒤의 명령 파이프라인이 "성공" 상태로 종료될 때 코드 블록이 실행되도록 합니다.

[실제로 실행 파일이며 ]. "-n" 플래그는 일반적으로 "0이 아닌 문자열 길이의 다음 인수에서 true"를 의미합니다. 이것이 #2 및 #3 질문에 대한 답변입니다. 이 [ ... ]구성은 일부 논리적 조건(이 경우 "0이 아닌 문자열 길이")에 대해 true(성공 코드로 종료) 또는 false(실패 코드로 종료) 응답을 제공합니다.

궁극적으로 해당 조각은 해당 셸의 PATH에 실행 파일이 있는 디렉터리가 있는 경우 if-then-fi 또는 if-then-else-fi 제어 흐름의 "true" 절을 실행합니다 voltdb.

답변2

해당 코드는 다음을 수행합니다.

if [ -n "...." ];

큰따옴표 안에 실행된 코드의 결과가 비어 있으면 if 문은 true입니다.

큰따옴표 안의 코드는 다음과 같습니다.

$(which voltdb 2> /dev/null)

명령 을 실행 which voltdb하고 STDERR(표준 오류)에서 발생하는 이 명령의 모든 출력을 로 리디렉션합니다 /dev/null. 기본적으로 우리는 그것에 관심이 없기 때문에 무시하고 있습니다.

결과는 which voltdbvoltdb 문자열과 일치하는 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로 리디렉션하려면 다음을 수행하세요.

관련 정보