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


1
$ 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
두 명령 모두 예상대로 작동합니다. 출력은 which time무엇입니까? time명령이 설치 되지 않았을 수 있습니다 .
Steven

와우, 당신은 맞습니다, @Steven. 대신 큰 따옴표 여야한다고 생각했지만 실제로 작동합니다. 아마도 $ PATH 문제 일 것입니다!
jvb

timebash의 일부이며 time바이너리가 설치되어 있지 않습니다 .
ACK_stoverflow 19

2
확장 후 쉘 키워드는 평가되지 않습니다. / bin / time을 사용하거나 그 주위에 eval을 사용해야합니다.
eckes 2016 년

1
@eckes 당신이 이깁니다. 이 얼마나 이상한 작은 걸까 귀하의 의견을 답변으로 쓰시면 동의하겠습니다.
ACK_stoverflow 19

답변:


2

timeA와 GNU 배쉬 키워드가 접수되는 매우 특별한 위치에있다, 예를 들어 명령 파이프 라인 구조의 구문을 참조하십시오

파이프 라인의 형식은 [time [-p]] [!] command1 [| command2 ...]

이것은 확장 외부의 키워드 위치를 하드 코딩합니다 ( commandN 이 매개 변수와 변수가 확장되는 위치). 실제로 시맨틱은 명령이 아닌 전체 파이프 라인에 적용되므로 이것이 키워드 여야하는 이유 일 수 있습니다.

쉘 내장 times(POSIX에는 특수 내장 )이 있습니다. 첫 번째 단어는 실행 파일이거나 내장 쉘일 수 있기 때문에 확장이 작동합니다.

또는 GNU coreutils 에는 /bin/time실행 파일이 포함되어 있습니다 .

사실 time더없는 예약어POSIX 쉘 (bash는이 그것을 인식하고 있지만 POSIX 모드 A는하지 않는 한 (어쨌든 -)이 아닌 분명한 이유 다음).

eval표현식 키워드 안에서 bash 는 키워드를 인식 하므로 시간 프로파일 링으로 명령을 동적으로 향상시키는 데 사용할 수 있습니다. (그러나 다른 인용은 추가 인용이 필요합니다)


0

cmd = 'time sleep 2'대신 실시간 명령을 얻기 위해 cmd = '/ usr / bin / time sleep 2'로 사용하십시오.

맨 시간에 다음을 읽을 수 있습니다.

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


예, 솔루션을 위해이 경로를 갔지만 데비안 8 서버 시스템에는 / usr / bin / time이 기본적으로 설치되어 있지 않으므로 종속성을 설치하는 대신 평가하기가 더 쉽습니다.
ACK_stoverflow 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.