コマンドプレフィックスツールを使用してバッチジョブをより簡単に指定できる方法は何ですか?

コマンドプレフィックスツールを使用してバッチジョブをより簡単に指定できる方法は何ですか?

batchデーモンに付属のツールは、atd原則として、システム使用率が特定のレベル(デフォルトでは1.5)未満に低下した場合にのみコマンドを実行するのに役立ちます。しかし、それを使用することはat現代の標準に従って非常に見苦しいです。で実行できるスクリプトを提供するか、/bin/sh完了、カラーコーディングなどなしで、メインプロンプトでインタラクティブにコマンドを入力する必要があります。

本当に良いことは、niceコマンドの前に配置してバッチキューに追加できるコマンドプレフィックスツールです(at私の質問の焦点では​​ありませんが、同様のユーティリティが役に立ちます)。 。たとえば、次のように動作します。

my-batchifying-command python some_longrunning_computational_script.py

そんなことがありますか?そうでなければ、どのように作成されましたか?私はこれをzshメインシェルに使用しますが、bash答えは同じようにうまく機能し、より広い適用範囲を持つことができます。

答え1

zsh単純なコマンドの場合:

my-batch() {print -r -- ${(qq)@} | batch}

my-batch python some_longrunning_computational_script.sh

そうするでしょう。

ループやリダイレクトなど、より複雑なものが必要な場合は、次のことができます。

my-batch eval 'for i in ...; done'

my-batch eval 'echo test > /some/file'

しかし、構文shではなく使用法を覚えてくださいzsh

これを防ぐには、eval次のトリックを使用できます。

alias my-batch=':||'
preexec()
  if [[ $1 = my-batch\ * ]]; then
    print -r -- "${1#my-batch }" | batch
  fi

今回も構文を使用する必要がありますsh

のみ可能なので参考にしてください一つコマンド(実際にはパイプ)です。中かっこが複数必要な場合は、中かっこを使用してください。

my-batch { ls > /tmp/a; date > /tmp/b; }

上記のアイデアは、my-batchコマンドが何も実行せず、コマンドの引数も評価しないことです(たとえば、my-batch echo $(date)拡張されています):|| echo $(date)preexecタスクを実行するためにコマンドラインが承認されるたびに、コマンドが実行されます。

の場合、preexecコマンド$1ライン全体は変更されません。で始まっていることを確認して削除し、"my-batch "残りをに送信しますbatch

my-batchこれが行の先頭にあるべき理由を説明します。たとえば、うまくいかず、実際には解釈されているため、cmd && my-batch ...そのようなことはできません。my-batch foo || bar:|| foo || bar

関連情報