Bash-Äquivalent dieser Verwendung des Tcsh-Befehls „sched“?

Bash-Äquivalent dieser Verwendung des Tcsh-Befehls „sched“?

In tcsh bewirkt der integrierte schedBefehl, dass ein Befehl zu einem bestimmten Zeitpunkt von der aktuellen Shell ausgeführt wird.

Ich habe die folgende $HOME/.schedDatei (dies ist eine vereinfachte Version davon):

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

Ich dann source $HOME/.schedin meinem $HOME/.cshrc.

Dadurch wird die Umgebungsvariable $todaybeispielsweise 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 dateBefehl nur einmal am Tag und nur bei Bedarf aufgerufen wird.

Gibt es eine Möglichkeit, dies in Bash zu tun? Beachten Sie, dass der atBefehl 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_COMMANDist 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 atein Shell-Skript aufruft, das tut, was es tun muss, und dann einen neuen Job einrichtet . Es läuft atjedoch 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.

verwandte Informationen