문자열에 내장된 Bash "시간"이 실행되지 않습니다.

문자열에 내장된 Bash "시간"이 실행되지 않습니다.
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

여기서 무슨 일이 일어나고 있는 걸까요? 쉘 내장 기능이 작동하지 않는 것은 문제가 아닙니다. 왜냐하면 이것이 작동하기 때문입니다:

$ cmd2='echo wef'
$ $cmd2
wef

어떤 아이디어가 있나요?

편집: 차이점을 발견했습니다.

$ type time
time is a shell keyword

대:

$ type echo
echo is a shell builtin

이제 질문은 - 왜 내장은 문자열에서 작동하고 키워드는 작동하지 않습니까?

답변1

time로서GNU 배쉬키워드에는 is가 허용되는 매우 구체적인 위치가 있습니다. 예를 들어 명령 파이프라인 구성 구문을 참조하세요.

파이프라인의 형식은 다음과 같습니다. [time [-p]] [!] command1 [| command2 ...]

이는 확장 외부의 키워드 위치를 하드코딩합니다(예:명령N매개변수와 변수가 확장되는 위치입니다). 실제로 의미 체계는 명령이 아닌 전체 파이프라인에 적용되므로 아마도 이것이 키워드여야 하는 이유일 것입니다.

쉘이 내장되어 있습니다 times(POSIX에는특수 내장), 첫 번째 단어가 실행 파일이거나 내장된 쉘일 수 있으므로 확장이 작동합니다.

대안으로GNU 코어 유틸리티 실행 파일이 포함되어 있습니다 /bin/time.

사실 time은 아니다예약어~에POSIX 쉘(bash는 그것을 인식하지만POSIX 모드어쨌든 ( -명백하지 않은 이유로 다음을 따르지 않는 한)).

표현식 내부 eval키워드는 다음으로 인식됩니다.세게 때리다, 따라서 이는 시간 프로파일링을 통해 명령을 동적으로 향상시키는 데 사용될 수 있습니다. (그러나 반면에 추가 인용 라운드가 필요합니다)

답변2

cmd='time sleep 2'를 사용하는 대신 cmd='/usr/bin/time sleep 2'로 사용하여 실시간 명령을 얻으십시오.

맨타임에서는 다음을 읽을 수 있습니다.

bash 쉘 사용자는 쉘 내장 변형이 아닌 외부 시간 명령을 실행하기 위해 명시적 경로를 사용해야 합니다. /usr/bin에 시간이 설치된 시스템에서 첫 번째 예는 /usr/bin/time wc /etc/hosts가 됩니다.

관련 정보