/usr/bin/time
내장 쉘(bash 및 zsh) 간의 차이점을 논의하는 동안 time
누군가 \time
get 을 약칭으로 사용할 수 있다고 언급했습니다 /usr/bin/time
.
처음에는 이것이 간단하고 좋은 지름길처럼 보였지만 몇 가지 문제가 발생했습니다.
- 왜
t\ime
작동합니까? \cd
디렉터리를 변경 하지 않는데 왜 디렉터리를 변경합니까/usr/bin/cd
?
분명히 \foo
같지 않습니다 $(which foo)
. 이제 질문은 다음과 같습니다.
bash 및 zsh에서 관찰되는 동작이 \foo
쉘의 POSIX 정의에 포함됩니까? 그렇다면 왜 이런 식으로 동작합니까?
각주 1: /usr/bin/cd
내 시스템에서는
#!/bin/sh
builtin cd "$@"
답변1
t\ime
또는 \cd
(또는 또는 또는 또는 "tim"e
궁극적 으로 또는 로 해결된다고 생각할 수 있는 다른 모든 인용 및 확장 조합 ) 은 바로 합계를 작성하는 또 다른 방법 입니다 .'cd'
${-##*}time
${-+time}
time
cd
cd
time
cd
그러나 이는 결국 쉘 구문 분석 및 해석 중 또는 time
그 이후에 해결됩니다. 특히 이는 쉘 키워드가 인식된 지 오랜 후에 발생하며,별명교체가 발생합니다.
따라서 쉘이 해당 언어에 대한 키워드를 찾을 때 쉘 키워드 ti\me
로 인식되지 않습니다. time
그래서:
ti\me echo test
time
쉘은 키워드 뒤에 간단한 명령이 오는 것이 아니라 간단한 명령으로 인식됩니다 .
그런 다음 인용이 처리됩니다 ti\me
(여기서 백슬래시는 m
어쨌든 인용할 필요가 없는 문자를 인용하고 인용 문자는 제거되어 를 얻습니다 time
).time
주문하다다른 명령처럼 검색됩니다( 의 내장 명령, 함수 및 실행 파일 목록에서 $PATH
. 아마도 /bin/time
여기에 있을 것입니다).
쉘 언어에는 키워드가 없으며 cd
단지 내장된 명령(귀하의 명령보다 우선 적용됨)만 있습니다. 그러나 (예를 들어) 에 대한 별칭을 정의하는 경우에도 마찬가지입니다. 별칭 대체는 매우 초기에 수행되므로 따옴표가 제거되기 전에 별칭 없이 별칭이 있는 경우(백슬래시가 포함된 별칭을 허용하는 쉘은 많지 않습니다) 다음과 같이 작성하십시오.cd
cd
/usr/bin/cd
cd
alias cd=pushd
cd
\cd
\cd dir
cd
별칭이 대체되지 않았는지 확인하려고 합니다 .
간단히 말해서, 명령 이름이나 그 일부를 인용하면 해당 명령이 쉘 키워드로 처리되는 것을 방지합니다( while
, for
, if
, {
... 와 같은 time
키워드 는일부쉘에만 해당) 사용 가능한 별칭을 무시합니다.
$PATH
그러나 명령이 실행 파일로 확인되도록 강제하지는 않습니다.기능(이렇게 하면 해결할 수 있습니다 command time cmd...
) 그리고내장( 내장 명령이 있는 쉘 env time cmd...
은 모르지만 이것을 수행하여 이 문제를 해결할 수 있습니다 .)time
인용은 일부 쉘에서 typeset
// declare
/ export
... 일련의 특수 내장 함수의 동작에도 영향을 미칩니다. local
바라보다지역 변수 할당에는 따옴표가 필요합니까?더 알아보기.