In tcsh bewirkt der integrierte sched
Befehl, dass ein Befehl zu einem bestimmten Zeitpunkt von der aktuellen Shell ausgeführt wird.
Ich habe die folgende $HOME/.sched
Datei (dies ist eine vereinfachte Version davon):
setenv today `date +%F`
sched +00:01 sched 00:00 source $HOME/.sched
Ich dann source $HOME/.sched
in meinem $HOME/.cshrc
.
Dadurch wird die Umgebungsvariable $today
beispielsweise auf gesetzt "2012-06-25"
und jede Nacht um Mitternacht automatisch auf das aktuelle Datum aktualisiert. Der Job plant sich bei jeder Ausführung automatisch neu.
Beachten Sie, dass der date
Befehl nur einmal am Tag und nur bei Bedarf aufgerufen wird.
Gibt es eine Möglichkeit, dies in Bash zu tun? Beachten Sie, dass der at
Befehl nicht funktioniert. Er ruft einen Befehl extern auf und kann die Umgebung der aktuellen Shell nicht beeinflussen.
(Ich weiß, dass ich $(date +%F)
statt tippen kann $today
, aber da ich dies interaktiv verwende, stellt das zusätzliche Tippen eine erhebliche Belastung dar.)
tcsh verfügt außerdem über eine Reihe spezieller Aliase, die unter bestimmten Umständen automatisch ausgeführt werden:
Derbeepcmd,cwdcmd,periodisch,voreingestellt,postcmd, UndJobcmd Spezielle Aliasekann so eingestellt werden, dass Befehle ausgeführt werden, wenn die Shell klingeln möchte, wenn sich das Arbeitsverzeichnis ändert, jedes tZeitraumMinuten, vor jeder Eingabeaufforderung, vor der Ausführung jedes Befehls, nach der Ausführung jedes Befehls und wenn ein Job gestartet oder in den Vordergrund gebracht wird.
Gibt es so etwas in der Bash?
Antwort1
Haben Sie es versucht $PROMPT_COMMAND
? Es wird häufig verwendet, um den xterm-Titel so einzustellen, dass beispielsweise CWD angezeigt wird. Es wird ausgeführt, wenn die Eingabeaufforderung angezeigt wird. Möglicherweise können Sie Ihre Variable damit einstellen. Der erste Nachteil wäre, dass Ihr Befehl jedes Mal ausgeführt wird, wenn Sie in der Shell die Eingabetaste drücken. Der zweite wäre, dass es nicht automatisch eingestellt wird, wenn Sie längere Zeit nicht auf Ihrem Terminal aktiv sind und der Tag vergeht. Es wird nach der nächsten Eingabe auf dem Terminal eingestellt.
# 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
Antwort2
Wenn Sie bereit sind, zwei Backquotes gegen einen Dollar einzutauschen:
alias today='date +%F'
echo `today`
Wenn Sie das Datum in einer Variablen haben möchten, dannAktualisierung inPROMPT_COMMAND
ist die einzige Möglichkeit, die mir einfällt. Sie können das Aufspalten eines Prozesses bei jeder Eingabeaufforderung vermeiden, indem Sie die integrierte Variable verwenden 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"
Ein anderer Ansatz besteht darin, Ihren Text über eine Tastenkombination einzufügen.
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)"'
Antwort3
Für mich klingt es so, als ob Sie Folgendes suchen at
:
~$ jetzt + 1 Minute Warnung: Befehle werden mit /bin/sh ausgeführt at> echo "test" | Wand um> Job 2 am Montag, 25. Juni 2012, 17:51:00 Uhr Broadcast-Nachricht von Benutzer@Host (irgendwo) um 17:51 ... prüfen
Allerdings habe ich Ihre Frage gerade noch einmal gelesen und Sie suchen nach etwas, das sich selbst neu plant. Das wäre ziemlich einfach, indem man at
ein Shell-Skript aufruft, das tut, was es tun muss, und dann einen neuen Job einrichtet . Es läuft at
jedoch in seiner eigenen Subshell; nicht als die Shell, aus der Sie es aufrufen.at
Antwort4
Dies könnte Ihnen eine Idee für eine Lösung geben:
$ trap 'today=$(date)' 10
$ echo $today
$ sleep 8
$ kill -10 $$
$ echo $today
Jetzt können Sie at verwenden, um sich selbst zum Tageswechsel ein Signal ($$) zu senden.