Bash에서 `SHELL=/bin/sh lesspipe"` 구문이 올바른 이유는 무엇입니까? [복제]

Bash에서 `SHELL=/bin/sh lesspipe"` 구문이 올바른 이유는 무엇입니까? [복제]

Ubuntu와 같은 Linux에서는 기본 .bashrc파일에 다음 한 줄이 포함됩니다.

[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

그렇다면 왜 SHELL=/bin/sh lesspipe문법적으로 정확합니까? man bash이 문장의 의미를 어느 페이지에서 확인할 수 있나요 ? 나에게 이 진술은 예를 들어 다음과 밀접하게 연관되어 있는 것 같습니다.

ls echo

, 이는 유효하지 않습니다. 반품,

abc=hello echo $abc

오류는 없지만 null 출력입니다.

man bash몇 가지 검색 명령을 시도했지만 /<expression>관련 정보를 찾을 수 없습니다 less. 누구든지 이 명령에 대한 설명을 말해 줄 수 있습니까?


참고: "라는 게시물을 읽었습니다.기본 .bashrc의 평가 표현식을 설명할 수 있나요?"하지만 얻은 것은 아무것도 없었습니다.

답변1

스틸 드라이버가 말했듯이, SHELL=/bin/sh lesspipe그래간단한 명령, 이는 다음 순서로 정의됩니다.

  • 선택적 변수 할당(여기서는 SHELL=/bin/sh), 이어서...
  • 공백- 구분된 단어 및 리디렉션(여기 lesspipe), 다음으로 끝남
  • 제어 연산자, 개행 문자 포함.

첫 번째 예:

ls echo

실제로 유효한 명령입니다. 첫 번째 단어만 실행할 명령으로 간주되고 나머지는 명령에 대한 인수로 제공됩니다.

명령의 경우 ls현재 디렉터리에 지정된 하위 디렉터리가 있으면 해당 내용이 나열됩니다. echo디렉터리가 아닌 경우 echo해당 이름²이 표시됩니다. 둘 다 참이 아닐 경우 명령은 오류를 반환하고 No such file or directory오류 메시지를 표시합니다.

두 번째 예:

abc=hello echo $abc

역시 변수 할당이 포함된 간단한 명령이지만 변수 확장( $abc)도 포함됩니다. 이것확장각 장에서는 man bash다양한 확장 기능과 작동 순서를 정의합니다.

명령줄이 단어로 분할된 후 쉘은 확장을 확인합니다.

  • 교정기 확장: 해당 없음
  • 물결표 확장: 해당 사항 없음
  • 매개변수 및 변수 확장: $abc여기를 명명된 쉘 또는 환경 변수의 현재 값으로 바꿉니다 abc. 그러나 명령줄이 아직 실행되지 않았으므로 abc=hello해당 줄 앞의 변수 할당( )은 아직 적용되지 않습니다. 결과는 이전 값으로 대체되거나, 설정되지 않은 경우 빈 문자열로 대체됩니다 $abc. abc그러면 빈 문자열은 인용되지 않았으므로 완전히 제거됩니다.
  • 명령 대체: 해당 없음
  • 산술 확장: 해당 없음
  • 토큰화: 유일한 후보는 $abc변수 확장의 결과이지만 빈 문자열에는 분할할 내용이 없습니다.
  • 경로명 확장: 적용 없음

확장이 완료되면 abc실행할 유틸리티 환경의 변수를 "hello" 값으로 설정하고 echo명령을 실행합니다. 그냥 빈 줄만 출력합니다.


엄밀히 말하면 ls인수로도 전달됩니다 argv[0]. ls해당 인수를 사용하여 호출 방법을 이해하고 출력되는 오류 메시지에도 사용하지만 작업을 수행하기 위한 옵션이나 파일로는 사용하지 않습니다.

² 심볼릭 링크이지만 대상을 확인할 수 없는 경우 일부 ls구현에서는 파일이 존재하지 않는 것처럼 오류 메시지를 출력합니다.

관련 정보