`\ time`,`t \ ime` 및`\ cd`는 실제로 무엇을합니까? (쉘에 백 ​​슬래시가있는 재미)


9

/usr/bin/time셸과 내장 된 bash (bash 및 zsh) 의 차이점에 대해 논의하는 동안 time누군가 \time가 단축형으로 사용할 수 있다고 언급했습니다 /usr/bin/time.

먼저 멋진 무고한 지름길처럼 보였지만 몇 가지 질문이 나왔습니다.

  • 왜 그렇게 t\ime작동합니까?
  • ¹가 \cd없어도 왜 디렉토리 가 변경 /usr/bin/cd됩니까?

따라서 분명히와 \foo같지 않습니다 $(which foo). 문제는 지금 :

\foobash와 zsh에서 관찰 된 동작이 어떤 방식으로 쉘의 POSIX 정의에 포함되어 있습니까? 그렇다면 왜 그렇게 동작합니까?


각주 1 : /usr/bin/cd내 시스템에

#!/bin/sh
builtin cd "$@"

unix.stackexchange.com/questions/12762/… 도 참조하십시오. \ command는 명령의 별명을 무시하라는 tcsh 기능에 대해 구체적으로 설명되어 있습니다.
simpleuser

답변:


14

t\ime또는 \cd(또는 "tim"e또는 'cd'또는 ${-##*}time또는 ${-+time}및 인용하고 당신이 생각할 수있는 확장은 결국에 해결하는 것이 다른 모든 조합 time또는 cd쓰기에 또 다른 방법 :), 즉 cdtime.

그러나, 결국에 해결하는 것 cd또는 time쉘 문법 구문 분석 및 해석 나중에. 특히, 쉘 키워드 인식 및 별명 대체가 발생한 후 오래 지속 됩니다.

따라서 쉘이 언어로 키워드를 찾을 ti\metime쉘 키워드 로 인식하지 않습니다 . 그래서 :

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... 패밀리 의 특수 내장 동작에 영향을 줄 수 있습니다 . 로컬 변수 할당에 따옴표가 필요합니까?를 참조하십시오 . 자세한 내용은.


따라서, 차이는 사이 timecd그 관찰 된 행동의 차이에있는 리드 인 timeA는 키워드cdA는 내장 명령은 ?
Jonas Schäfer

1
@JonasWielicki, 그것은 time키워드이고 cd그렇지 않습니다. cd또는에 대한 별칭 time이 있으면 다른 문제가 될 수 있습니다. 그것은 cd인용에 영향을 미치는 한이 시점에 내장되거나 발생률이 없습니다. 그러나 일부 쉘에는 구문 분석이 다른 내장과 다르게 수행되므로 키워드와 내장 사이의 중간에 몇 개의 내장이 있습니다. export/ typeset/ 의 경우입니다 declare. 이 답변에 약간의 메모를 추가해야 할 것입니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.