Эквивалент переменной времени csh в bash [duplicate]

Блоки инициализации выполняются всякий раз, когда класс инициализируется и перед вызовом конструкторов. Они обычно размещаются над конструкторами в фигурных скобках. Не обязательно включать их в свои классы.

Они обычно используются для инициализации ссылочных переменных. Эта страница дает хорошее объяснение

54
задан Mr Fooz 18 February 2013 в 21:55
поделиться

8 ответов

Вы можете использовать этот zsh-заимствованный крючок для bash: http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

Сроки выполнения с помощью этот крюк (Mac OS X): Используйте Growl для отслеживания длинных команд оболочки

10
ответ дан kennytm 28 August 2018 в 04:49
поделиться

Поместит ли \ t в PS1 для вас?

Это не дает прошедшего времени, но должно быть достаточно легко вычесть время, когда это необходимо.

$ export PS1='[\t] [\w]\$ '
[14:22:30] [/bin]$ sleep 10
[14:22:42] [/bin]$

Следуя комментарию OP, он уже использует \ t. Если вы можете использовать tcsh вместо bash, вы можете установить временную переменную.

/bin 1 > set time = 0
/bin 2 > sleep 10
0.015u 0.046s 0:10.09 0.4%      0+0k 0+0io 2570pf+0w
/bin 3 >

Вы можете изменить формат печати как менее уродливый (на странице man tcsh).

/bin 4 > set time = ( 0 "last: %E" )
/bin 5 > sleep 10
last: 0:10.09
/bin 6 >

Я не знаю подобного объекта в bash

0
ответ дан Andrew Stein 28 August 2018 в 04:49
поделиться

Используя ваши ответы и некоторые другие потоки, я написал это приглашение, которое хочу поделиться с вами. Я сделал снимок экрана, в котором вы можете увидеть:

  • Белый: код последнего возврата
  • Зеленый и отметка метки означают успех (код возврата равен 0)
  • Красная и поперечная отметка означает ошибку (код возврата был> 0)
  • (зеленый или красный): время выполнения последней команды в скобках
  • (зеленый или красный): текущая дата ( \ t)
  • (зеленый, если не root, красный, если корень): зарегистрированное имя пользователя
  • (зеленый): имя сервера
  • (синий): pwd и обычный $

Вот код, который нужно вставить в файл ~ / .bashrc:

function timer_now {
    date +%s%N
}

function timer_start {
    timer_start=${timer_start:-$(timer_now)}
}

function timer_stop {
    local delta_us=$((($(timer_now) - $timer_start) / 1000))
    local us=$((delta_us % 1000))
    local ms=$(((delta_us / 1000) % 1000))
    local s=$(((delta_us / 1000000) % 60))
    local m=$(((delta_us / 60000000) % 60))
    local h=$((delta_us / 3600000000))
    # Goal: always show around 3 digits of accuracy
    if ((h > 0)); then timer_show=${h}h${m}m
    elif ((m > 0)); then timer_show=${m}m${s}s
    elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
    elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
    elif ((ms >= 100)); then timer_show=${ms}ms
    elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
    else timer_show=${us}us
    fi
    unset timer_start
}


set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'


    # Add a bright white exit status for the last command
    PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi

    # Add the ellapsed time and current date
    timer_stop
    PS1+="($timer_show) \t "

    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\u$Green@\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}

trap 'timer_start' DEBUG
PROMPT_COMMAND='set_prompt'
15
ответ дан Nicolas Thery 28 August 2018 в 04:49
поделиться

Если вы еще не установили какие-либо другие ответы перед тем, как начать свою долговременную работу, и вам просто нужно знать, как долго выполнялась работа, вы можете сделать простой

$ HISTTIMEFORMAT="%s " history 2

, и он ответит чем-то вроде

  654  1278611022 gvn up
  655  1278611714 HISTTIMEFORMAT="%s " history 2

, и тогда вы можете просто визуально вычесть две метки времени (кто-нибудь знает, как захватить вывод команды history builtin history?)

6
ответ дан philsnow 28 August 2018 в 04:49
поделиться

Я обнаружил, что trap ... DEBUG запускался каждый раз, когда вызывался $PROMPT_COMMAND, сброс таймера и, следовательно, всегда возвращал 0.

Однако я обнаружил, что history записывает время, и я прослушивал (g4)

  • Если history не регистрирует команду (например, повторяющиеся или проигнорированные команды), то вы можете получить ответ:

    HISTTIMEFORMAT='%s '
    PROMPT_COMMAND="
      START=\$(history 1 | cut -f5 -d' ');
      NOW=\$(date +%s);
      ELAPSED=\$[NOW-START];
      $PROMPT_COMMAND"
    PS1="\$ELAPSED $PS1"
    

    время начала будет неправильным.

  • Многострочные команды не получают корректно выбранную дату с history.
3
ответ дан PJSCopeland 28 August 2018 в 04:49
поделиться

Я взял ответ от Ville Laurikari и улучшил его с помощью команды time, чтобы показать точность второй секунды:

function timer_now {
  date +%s%N
}

function timer_start {
  timer_start=${timer_start:-$(timer_now)}
}

function timer_stop {
  local delta_us=$((($(timer_now) - $timer_start) / 1000))
  local us=$((delta_us % 1000))
  local ms=$(((delta_us / 1000) % 1000))
  local s=$(((delta_us / 1000000) % 60))
  local m=$(((delta_us / 60000000) % 60))
  local h=$((delta_us / 3600000000))
  # Goal: always show around 3 digits of accuracy
  if ((h > 0)); then timer_show=${h}h${m}m
  elif ((m > 0)); then timer_show=${m}m${s}s
  elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
  elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
  elif ((ms >= 100)); then timer_show=${ms}ms
  elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
  else timer_show=${us}us
  fi
  unset timer_start
}

trap 'timer_start' DEBUG
PROMPT_COMMAND=timer_stop

PS1='[last: ${timer_show}][\w]$ '

Конечно, для этого требуется запуск процесса, поэтому он менее эффективен , но все же достаточно быстро, чтобы вы не заметили.

4
ответ дан Thomas 28 August 2018 в 04:49
поделиться

Это минимальный автономный код для достижения желаемого:

function timer_start {
  timer=${timer:-$SECONDS}
}

function timer_stop {
  timer_show=$(($SECONDS - $timer))
  unset timer
}

trap 'timer_start' DEBUG
PROMPT_COMMAND=timer_stop

PS1='[last: ${timer_show}s][\w]$ '
81
ответ дан Ville Laurikari 28 August 2018 в 04:49
поделиться

Еще один очень минимальный подход:

trap 'SECONDS=0' DEBUG
export PS1='your_normal_prompt_here ($SECONDS) # '

Показывает количество секунд с момента запуска последней простой команды. Счетчик не сбрасывается, если вы просто нажмете Enter, не вводя команду, что может быть удобно, когда вы просто хотите узнать, сколько времени прошло с тех пор, как вы в последний раз что-то делали в нем. Он отлично работает для меня в Red Hat и Ubuntu. Это не работало для меня под Cygwin, но я не уверен, что это ошибка или просто ограничение на попытку запустить Bash под Windows.

. Один из возможных недостатков этого подхода заключается в том, что вы сохраняете сброс SECONDS , но если вам действительно нужно сохранить SECONDS в качестве количества секунд с момента вызова оболочки, вы можете создать свою собственную переменную для счетчика PS1 вместо прямого использования SECONDS. Другим возможным недостатком является то, что значительная секундная величина, такая как «999999», может быть лучше показана как дни + часы + минуты + секунды, но легко добавить простой фильтр, такой как:

seconds2days() { # convert integer seconds to Ddays,HH:MM:SS
  printf "%ddays,%02d:%02d:%02d" $(((($1/60)/60)/24)) \
  $(((($1/60)/60)%24)) $((($1/60)%60)) $(($1%60)) |
  sed 's/^1days/1day/;s/^0days,\(00:\)*//;s/^0//' ; }
trap 'SECONDS=0' DEBUG
PS1='other_prompt_stuff_here ($(seconds2days $SECONDS)) # '

переводит «999999» в «11days, 13: 46: 39». Сед в конце меняет «1days» на «1day» и отбрасывает пустые начальные значения, такие как «0days, 00:». Отрегулируйте вкус.

10
ответ дан willdye 28 August 2018 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: