`\time`, `t\ime`, `\cd`는 실제로 무엇을 합니까? (셸에서 백슬래시의 장점)

`\time`, `t\ime`, `\cd`는 실제로 무엇을 합니까? (셸에서 백슬래시의 장점)

/usr/bin/time내장 쉘(bash 및 zsh) 간의 차이점을 논의하는 동안 time누군가 \timeget 을 약칭으로 사용할 수 있다고 언급했습니다 /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}timecdcdtime

cd그러나 이는 결국 쉘 구문 분석 및 해석 중 또는 time그 이후에 해결됩니다. 특히 이는 쉘 키워드가 인식된 지 오랜 후에 발생하며,별명교체가 발생합니다.

따라서 쉘이 해당 언어에 대한 키워드를 찾을 때 쉘 키워드 ti\me로 인식되지 않습니다. time그래서:

ti\me echo test

time쉘은 키워드 뒤에 간단한 명령이 오는 것이 아니라 간단한 명령으로 인식됩니다 .

그런 다음 인용이 처리됩니다 ti\me(여기서 백슬래시는 m어쨌든 인용할 필요가 없는 문자를 인용하고 인용 문자는 제거되어 를 얻습니다 time).time 주문하다다른 명령처럼 검색됩니다( 의 내장 명령, 함수 및 실행 파일 목록에서 $PATH. 아마도 /bin/time여기에 있을 것입니다).

쉘 언어에는 키워드가 없으며 cd단지 내장된 명령(귀하의 명령보다 우선 적용됨)만 있습니다. 그러나 (예를 들어) 에 대한 별칭을 정의하는 경우에도 마찬가지입니다. 별칭 대체는 매우 초기에 수행되므로 따옴표가 제거되기 전에 별칭 없이 별칭이 있는 경우(백슬래시가 포함된 별칭을 허용하는 쉘은 많지 않습니다) 다음과 같이 작성하십시오.cdcd/usr/bin/cdcdalias cd=pushdcd\cd

\cd dir

cd별칭이 대체되지 않았는지 확인하려고 합니다 .

간단히 말해서, 명령 이름이나 그 일부를 인용하면 해당 명령이 쉘 키워드로 처리되는 것을 방지합니다( while, for, if, {... 와 같은 time키워드 는일부쉘에만 해당) 사용 가능한 별칭을 무시합니다.

$PATH그러나 명령이 실행 파일로 확인되도록 강제하지는 않습니다.기능(이렇게 하면 해결할 수 있습니다 command time cmd...) 그리고내장( 내장 명령이 있는 쉘 env time cmd...은 모르지만 이것을 수행하여 이 문제를 해결할 수 있습니다 .)time

인용은 일부 쉘에서 typeset// declare/ export... 일련의 특수 내장 함수의 동작에도 영향을 미칩니다. local바라보다지역 변수 할당에는 따옴표가 필요합니까?더 알아보기.

관련 정보