모든 명령에 '추가 된'별칭 적용


11

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

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

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


나는 전에 보았고 정확하게 이것을 할 수있는 방법을 찾지 못했습니다. Caleb이 말했듯이을 사용할 수는 preexec있지만 쉘이 반환 후에도 여전히 실행하기 때문에 preexec(예 :) 내에서 실행하고 싶지 않습니다 . 우리가 할 수있는 최선은 비슷한 것입니다. preexec() { time $1; }preexec
Mikel

@Mikel preexec()함수를 사용하여 실제로 명령을 가져 와서 함수 내부에서 직접 실행 한 다음 쉘이 명령 자체를 실행하지 않도록 일종의 오류를 반환하여 실행중인 모든 것을 래퍼 링 할 수 있다고 생각합니다 .
Caleb

답변:


10

명령 행이 시작된 시간과 프롬프트가 표시되는 시간을 기록 할 수 있습니다. 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.


3

여기서 당신의 선택은 쉘에 달려 있습니다. 에 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의 답변 을 참조하십시오 .




이것이 bash에서 가능했으면 좋겠다!
warren

참고 의 및 기타 링크, 그것은 약간의 추가 손보는과 떠들썩한 파티에서 구현 가능하다. 다시, 왜 그냥 zsh를 실행하지 않습니까? 이것보다 더 좋은 이유가있는 흔들리는 껍질입니다!
Caleb

2
zsh를 사용하는 경우 더 나은 방법이 있습니다. 설정된 REPORTTIME 환경 변수는 $ REPORTTIME 초보다 긴 명령에 대해 실행 시간 정보를 출력합니다 ( 'time'앞에 명령을 실행 한 것처럼). 그냥 0으로 설정하면 모든 명령의 시간과 user / sys 분석이 부팅되는 시간을 알려줍니다.
Joseph Garvin

1

가장 쉬운 방법은 아마 설정하는 것입니다 PROMPT_COMMAND. 배쉬 변수 참조 :

PROMPT_COMMAND
설정되면 값은 각 기본 프롬프트 ( $PS1)를 인쇄하기 전에 실행할 명령으로 해석됩니다 .

예를 들어 기존 프롬프트 명령을 덮어 쓰지 않으려면 다음을 수행하십시오.

PROMPT_COMMAND="date ; ${PROMPT_COMMAND}"

그에 대해 몰랐다
warren

1
시작이지만 명령 실행시기를 아는 문제를 해결하지 못합니다. 명령이 입력되고 실행되기 몇 분 또는 몇 시간 또는 며칠 전에 프롬프트 자체가 작성 될 수 있습니다.
Caleb

0

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은 모든 명령에 대한 시간을 인쇄 할 수있게합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.