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
구현에서는 파일이 존재하지 않는 것처럼 오류 메시지를 출력합니다.