эквивалент bash этого использования команды tcsh "sched"?

эквивалент bash этого использования команды tcsh "sched"?

В tcsh встроенная schedкоманда вызывает выполнение команды текущей оболочкой в ​​указанное время.

У меня есть следующий $HOME/.schedфайл (это его упрощенная версия):

setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched

Я тогда source $HOME/.schedв своем $HOME/.cshrc.

Это устанавливает переменную окружения $today, например, "2012-06-25"и автоматически обновляет ее на текущую дату каждую ночь в полночь. Задание автоматически перепланирует себя каждый раз, когда оно запускается.

Обратите внимание, что dateкоманда вызывается только один раз в день и только тогда, когда это необходимо.

Есть ли способ сделать это в bash? Обратите внимание, что atкоманда не будет работать; она вызывает внешнюю команду и не может повлиять на текущую среду оболочки.

(Я знаю, что могу печатать $(date +%F)вместо этого $today, но поскольку я использую это в интерактивном режиме, дополнительный набор текста становится значительной нагрузкой.)

tcsh также имеет ряд специальных псевдонимов, которые автоматически выполняются при определенных обстоятельствах:

Thebeepcmd,cwdcmd,периодический,прекоммд,посткоммд, иjobcmd Специальные псевдонимыможно настроить, соответственно, на выполнение команд, когда оболочка хочет позвонить в звонок, когда изменяется рабочий каталог, каждый tпериодминут, перед каждым запросом, перед выполнением каждой команды, после выполнения каждой команды и при запуске задания или его выводе на передний план.

Есть ли в bash что-то подобное?

решение1

Вы пробовали $PROMPT_COMMAND? Обычно это используется для установки заголовка xterm для отображения CWD, например. Он выполняется при отображении приглашения. Возможно, с его помощью можно установить переменную. Первым недостатком будет то, что ваша команда будет выполняться каждый раз, когда вы нажимаете Enter в оболочке. Вторым недостатком будет то, что если вы не активны на своем терминале в течение длительного времени и день прошел, он не будет установлен автоматически. Он будет установлен после следующего входа в терминал.

# export PROMPT_COMMAND="export today=\`date\`"
# echo $today
Tue Jun 26 01:07:19 EEST 2012
# echo $today
Tue Jun 26 01:07:21 EEST 2012
# echo $today
Tue Jun 26 01:07:22 EEST 2012

решение2

Если вы готовы обменять две обратные котировки на доллар:

alias today='date +%F'
echo `today`

Если вам нужна дата в переменной, тообновление его вPROMPT_COMMANDэто единственный способ, который я могу придумать. Вы можете избежать разветвления процесса при каждом запросе, используя встроенную переменную SECONDS.

update_today () {
  if ((SECONDS/86400 > __last_today_update)); then
    ((__last_today_update = SECONDS/86400))
    today=$(date +%F)
  fi
}
PROMPT_COMMAND="update_today; $PROMPT_COMMAND"

Другой подход — вставить текст с помощью сочетания клавиш.

rl_insert () {
  READLINE_LINE=${READLINE_LINE:0:$READLINE_POINT}$1${READLINE_LINE:$READLINE_POINT}
  ((READLINE_POINT+=${#1}))
}
bind -x '"\C-xt":rl_insert "$(date +%F)"'

решение3

Мне кажется, что вы ищете at:

~$ сейчас + 1 минута
предупреждение: команды будут выполняться с использованием /bin/sh
в> эхо "тест" | стена
в>
работа 2 в Пн Июн 25 17:51:00 2012

Трансляция сообщения от пользователя@хоста                                              
        (где-то) в 17:51 ...                                               

тест                                                                           

Хотя я только что перечитал ваш вопрос, и вы ищете что-то, что будет перепланировать себя. Это было бы довольно легко сделать, atвызвав скрипт оболочки, который делает то, что ему нужно, а затем настраивает новое atзадание. Однако atон запускается в своей собственной подоболочке; не как оболочка, из которой вы его вызываете.

решение4

Это может дать вам идею для решения:

$ trap 'today=$(date)' 10
$ echo $today
$ sleep 8
$ kill -10 $$
$ echo $today

Теперь вы можете использовать at, чтобы послать себе ($$) сигнал на смену дня.

Связанный контент