모든 명령에 ‘추가 된’별칭 적용 실행할 때마다

의 모든 명령에 타이밍 별칭을 더 잘 추가 할 수 bash있습니까?

예를 들어, 명령을 실행할 때마다 항상 date전후에 또는로 래핑되는 특정 사용자를 원합니다 time.

이것이 가능합니까? 그렇다면 가능합니까?



답변

명령 행이 시작된 시간과 프롬프트가 표시되는 시간을 기록 할 수 있습니다. 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=1CPU 시간이 1 초 이상 걸린 명령에 의해 소비 된 시간 (시스템, 사용자, 경과 시간)을 인쇄합니다. 일반 set time은 모든 명령에 대한 시간을 인쇄 할 수있게합니다.


답변