В 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, чтобы послать себе ($$) сигнал на смену дня.