"time" 명령은 단독으로 작동하지만 파이프라인에서는 작동하지 않습니다.

"time" 명령은 단독으로 작동하지만 파이프라인에서는 작동하지 않습니다.

다음을 고려하세요:

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found

음...어?

알았어, 그러니까분명히파이프라인으로 실행하면 Bash는 다소 다른 방식으로 명령을 검색합니다. 차이점이 무엇인지 설명해 줄 수 있는 사람이 있나요? 파이핑이 쉘 내장 기능 등을 비활성화합니까? (그렇지 않을 것 같지만... 하지만... 이것이 어떻게 깨지는지 모르겠습니다.)

답변1

쉘은 bash키워드로 구현됩니다. time키워드는 파이프라인 구문의 일부입니다.

파이프의 구문 bash은 (제목에서 "관로bash매뉴얼에 있음):

[time [-p]] [!] command1 [ | or |& command2 ] …

왜냐하면 time그것은 일부이기 때문이다파이프 구문는 쉘 내장 유틸리티가 아니므로 유틸리티로 작동하지 않습니다. 예를 들어 추가 트릭 없이 일반 쉘 리디렉션을 사용하여 출력을 리디렉션하는 것은 불가능합니다(예:"시간" 출력과 명령 출력을 동일한 파이프로 리디렉션하는 방법은 무엇입니까?).

이 단어가 time파이프의 시작 부분이 아닌 쉘의 다른 곳에 나타나면 bash동일한 이름을 가진 외부 명령이 호출됩니다. time예를 들어 파이프 기호 뒤에 놓으면 이런 일이 발생합니다. 쉘이 외부 time명령을 찾을 수 없으면 "명령을 찾을 수 없음" 오류가 생성됩니다.

sleep 1키워드를 사용하여 파이프라인에서 셸 시간 전용 명령을 만들려면 다음을 사용할 수 있습니다.

echo foo | (time sleep 1)

파이프 오른쪽에 있는 서브쉘에서 time키워드는 파이프의 시작 부분에 있습니다(그러나 여전히 단일 단순 명령의 파이프입니다).

또한 관련:

답변2

또한 이를 사용하여 /usr/bin/time자세한 내용을 제공할 수도 있습니다.

echo foo | /usr/bin/time sleep 1

관련 정보