man cron
最初のシンボル処理を完全に理解していません%
。
% in files に関するほとんどの質問とは異なり、crontab
実際には良い改行文字として % を使用します。リテラル「%」記号または標準入力の変更/リダイレクトとして解釈されないように、最初の%として何をすべきですか?私はそれが何をしているのか、必要でなければどうすればいいのかよくわかりません。
crontabラインの例:
0 0 * * * root newline="%" %echo "this${newline}that" %command2 %command3
(セミコロンまたは\ nを使用できることはわかっていますが、この例では%-newlineを使用しました。)
修正する:
コメントが要点を逃しているようで問題は次のとおりです。
人間のクローンタブ(5)
「6番目」フィールド(行の残りの部分)は、実行するコマンドを指定します。行の完全なコマンド部分(改行または「%」文字まで)は、SHELL変数/ bin / shまたはcronfileで指定されたシェルによって実行されます。
...バックスラッシュ()でエスケープしない限り、コマンドの "%"文字は改行文字に変わります...
...最初の%以降のすべてのデータは標準入力としてコマンドに送信されます。
私が書いたように、私が提供したcrontabラインは現在機能していないことは明らかです。エスケープされていない%を理解します。最初の後->改行文字(最初の太字)。私が理解していないのは2番目の太字です。
私がやりたいことが%を使用して改行文字を挿入する場合、これは標準入力がコマンドです。できます。
2から3つのエスケープされていない%sを持つ行のいくつかの例は、cronが最初のエスケープされていない%を解釈する方法とコマンド処理で実行する役割を示すのに理想的です。
また、2番目の太字は文字通り受け入れられるのでしょうか?もしそうなら、2番目の後続のエスケープされていない%を使用して改行として機能することができます。本質的に、私のコマンドは、シェルに渡される前に% - >改行置換の後に複数行のスクリプトを含めることができます。そうですか?
ベストアンサー1
crontabでは、時間指定後の部分とエスケープされていない最初の部分は、シェルに渡されるコードを構成します(および%
次の引数)。次に、標準入力を介してシェルに供給されるラインを最初に形成します。sh
-c
%
実際には、次のcrontabラインを使用してください。
* * * * * shell code%line 1%line 2
cron
次のシェルコードに対応する操作は1分ごとに行われます。
printf '%s\n' 'line 1' 'line 2' | sh -c 'shell code'
したがって、実際にはその変数に改行文字を格納することはできませんshell code
。
ここでこのコードの変数に改行文字を保存するには、次のようにします。
* * * * * eval "$(printf 'nl="\n"')"; echo "blah${nl}blah"
ただし、コードを直接作成してsh
stdinに供給できます。
* * * * * sh%nl='%'%echo "blah${nl}blah"
ここでcron
実行され実行される他のプロセスの標準入力はsh -c sh
次のとおりです。sh
sh
nl='
'
echo "blah${nl}blah"
別のオプションは、cron
ksh93 スタイルの引用形式 ( // など) をサポートするシェルに、次を使用する代わりに実行するように指示することです。$'...'
ksh93
zsh
bash
sh
SHELL=/bin/zsh
* * * * * nl=$'\n'; echo "blah${nl}blah"