tcsh の「sched」コマンドのこの使用法に相当するものは bash にありますか?

tcsh の「sched」コマンドのこの使用法に相当するものは bash にありますか?

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"、毎晩午前 0 時に現在の日付に自動的に更新されます。ジョブは実行されるたびに自動的に再スケジュールされます。

このdateコマンドは、必要な場合にのみ 1 日に 1 回だけ呼び出されることに注意してください。

これを bash で実行する方法はありますか?atコマンドは機能しないことに注意してください。このコマンドは外部でコマンドを呼び出し、現在のシェルの環境に影響を与えることはできません。

$(date +%F)(ではなく入力できることはわかっています$todayが、これを対話的に使用するため、余分な入力は大きな負担になります。)

tcsh には、特定の状況で自動的に実行される特別なエイリアスもいくつかあります。

ビープ音cwdcmd定期的なプレコマンドポストコマンド、 そしてジョブコマンド 特別なエイリアスシェルがベルを鳴らしたいとき、作業ディレクトリが変更されたとき、 期間分、各プロンプトの前、各コマンドの実行前、各コマンドの実行後、およびジョブが開始されたときまたはフォアグラウンドに移動されたときに発生します。

bash にはこのような機能がありますか?

答え1

試しましたか$PROMPT_COMMAND? これは、たとえば xterm タイトルに CWD を表示するように設定するためによく使用されます。プロンプトが表示されると実行されます。これで変数を設定できる可能性があります。最初の欠点は、シェルで Enter キーを押すたびにコマンドが実行されることです。2 つ目は、ターミナルで長時間アクティブにならずに 1 日が経過すると、自動的に設定されないことです。ターミナルで次に 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

2 つのバッククォートを 1 ドルと交換してもよい場合は、次の操作を行います。

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 を使用して実行されます
at> echo "テスト" | wall
で>
2012 年 6 月 25 日月曜日 17:51:00 のジョブ 2

user@host からのブロードキャストメッセージ                                              
        (どこかで)17:51に…                                               

テスト                                                                           

しかし、あなたの質問をもう一度読み返したところ、あなたは自分自身で再スケジュールするものを探しているようです。それは、at必要なことを実行してから新しいatジョブを設定するシェル スクリプトを呼び出すことで簡単に実行できます。ただし、atこれは、呼び出したシェルとしてではなく、独自のサブシェルで実行されます。

答え4

次のようなことが解決策のヒントになるかもしれません:

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

これで、一日の変わり目に at を使用して自分自身 ($$) に信号を送信できるようになりました。

関連情報