의 모든 명령에 타이밍 별칭을 더 잘 추가 할 수 bash
있습니까?
예를 들어, 명령을 실행할 때마다 항상 date
전후에 또는로 래핑되는 특정 사용자를 원합니다 time
.
이것이 가능합니까? 그렇다면 가능합니까?
preexec()
함수를 사용하여 실제로 명령을 가져 와서 함수 내부에서 직접 실행 한 다음 쉘이 명령 자체를 실행하지 않도록 일종의 오류를 반환하여 실행중인 모든 것을 래퍼 링 할 수 있다고 생각합니다 .
의 모든 명령에 타이밍 별칭을 더 잘 추가 할 수 bash
있습니까?
예를 들어, 명령을 실행할 때마다 항상 date
전후에 또는로 래핑되는 특정 사용자를 원합니다 time
.
이것이 가능합니까? 그렇다면 가능합니까?
preexec()
함수를 사용하여 실제로 명령을 가져 와서 함수 내부에서 직접 실행 한 다음 쉘이 명령 자체를 실행하지 않도록 일종의 오류를 반환하여 실행중인 모든 것을 래퍼 링 할 수 있다고 생각합니다 .
답변:
명령 행이 시작된 시간과 프롬프트가 표시되는 시간을 기록 할 수 있습니다. Bash는 이미 각 명령 줄의 시작 날짜를 기록에서 확인하고 다음 프롬프트를 표시 할 시간을 확인할 수 있습니다.
print_command_wall_clock_time () {
echo Wall clock time: \
$(($(date +%s) - $(HISTTIMEFORMAT="%s ";
set -o noglob;
set $(history 1); echo $2)))
}
PROMPT_COMMAND=print_command_wall_clock_time$'\n'"$PROMPT_COMMAND"
이것은 두 번째 해상도 만 제공하고 벽시계 시간 만 제공합니다. 더 나은 해상도를 원하면 나노초 형식을 date
지원 하는 외부 명령 %N
과 명령을 제 시간에 실행하기 전에 DEBUG
호출 하는 트랩을 사용해야합니다 date
.
call_date_before_command () {
date_before=$(date +%s.%N)
}
print_wall_clock_time () {
echo Wall clock time: \
$((date +"$date_before - %s.%N" | bc))
}
trap call_date_before_command DEBUG
PROMPT_COMMAND=print_command_wall_clock_time
DEBUG
트랩을 사용 하더라도 각 명령에 대해 프로세서 시간을 자동으로 표시하거나 프롬프트하라는 것보다 더 구별하는 방법이 없다고 생각합니다.
다른 쉘을 사용하려는 경우 zsh의 모든 명령에 대한 시간 보고서를 얻는 방법은 다음과 같습니다 (다른 작업으로 일반화되지는 않음).
REPORTTIME=0
REPORTTIME
정수 값으로 설정할 수 있으며 , 타이밍 정보는 몇 초 이상의 프로세서 시간을 사용한 명령에 대해서만 표시됩니다.
Zsh는 변수가 호출되는 csh에서이 기능을 사용했습니다 time
.
여기서 당신의 선택은 쉘에 달려 있습니다. 에 zsh
있다라는 편리한 후크 함수 preexec()
대화식 쉘 명령 전에 바로 실행됩니다. 이 이름으로 함수를 작성하면 사물이 실행될 수 있습니다. 또한라는 함수와 함께 따를 수 있습니다 precmd()
직후됩니다 다음 프롬프트가 그려지기 전에 바로 실행됩니다, 당신의 명령이 완료.
이 기능 쌍을 작성하면 프롬프트에서 실행 된 명령 전후에 임의의 명령을 실행할 수 있습니다. 이것을 사용하여 쉘 사용을 기록하고, 잠금을 작성하고, 환경을 테스트하거나, 예에서와 같이 명령 실행 중에 소비 된 시간 또는 자원을 계산할 수 있습니다.
이 예에서는 명령을 사용하여 실행하기 전에 벤치 마크 타임 스탬프를 생성 preexec()
한 다음 명령을 사용하여 명령을 실행하는 데 소요 된 시간을 계산 precmd()
하고 프롬프트 전에 출력하거나 로그 아웃합니다. 예:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
참고 : 이 특정 예의 경우 훨씬 쉬운 내장 기능이 있습니다. ZSH에서 런타임보고를 설정하기 만하면 자동으로 수행됩니다.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
보다 실제 구현에서 preexec()
, 나는 쉘 내부 실행중인 경우 참조 사용 tmux
또는 screen
탭 이름에 표시 할 현재 실행중인 명령의 상류에 대한 정보를 보내, 그렇다면합니다.
불행히도 bash에는이 작은 메커니즘이 존재하지 않습니다. 한 사람이 그것을 복제하려는 시도가 있습니다 . 또한 유사한 멋진 해킹에 대한 Gilles의 답변 을 참조하십시오 .
가장 쉬운 방법은 아마 설정하는 것입니다 PROMPT_COMMAND
. 배쉬 변수 참조 :
PROMPT_COMMAND
설정되면 값은 각 기본 프롬프트 ($PS1
)를 인쇄하기 전에 실행할 명령으로 해석됩니다 .
예를 들어 기존 프롬프트 명령을 덮어 쓰지 않으려면 다음을 수행하십시오.
PROMPT_COMMAND="date ; ${PROMPT_COMMAND}"
csh
/ tcsh
는이 기능을 가장 잘 지원합니다.
The `time` shell variable can be set to execute the time builtin command after the completion of any process that takes more than a given number of CPU seconds.
즉, set time=1
CPU 시간이 1 초 이상 걸린 명령에 의해 소비 된 시간 (시스템, 사용자, 경과 시간)을 인쇄합니다. 일반 set time
은 모든 명령에 대한 시간을 인쇄 할 수있게합니다.
preexec
있지만 쉘이 반환 후에도 여전히 실행하기 때문에preexec
(예 :) 내에서 실행하고 싶지 않습니다 . 우리가 할 수있는 최선은 비슷한 것입니다.preexec() { time $1; }
preexec