다음을 고려하세요:
# 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