cronでSHELLに2つのシェルを割り当てても大丈夫ですか?

cronでSHELLに2つのシェルを割り当てても大丈夫ですか?

最近、私は徐々にシェルを次に切り替え始めました。怒っている このため、cronからSHELLにパスを割り当てることを検討しました。

ほとんどのマニュアルを読んだ後、man 5 crontabPATHを見て:SHELLに値を割り当てたい2つのシェルの間で使用されているルールをコピーしました。

SHELL=/bin/bash:/home/jerzy/.cargo/bin/nu

動作しません。私のcrontabのスクリプトは正しく動作しません。そして両方ともうまくSHELL=/bin/bashいきます SHELL=/home/jerzy/.cargo/bin/nu

SHELLに2つのシェルを割り当てることはできますか?これは言う?

答え1

いいえ、2つのシェルを割り当てることはできませんSHELLcron起動するシェルを知っておく必要があり、1つしか存在できません。変数が指定されSHELLていません。crontab可能指定するシェルこれ使用するシェル。 (存在する場合)cron値を読み取り、SHELLそれを実行コマンドとして使用します。解釈し:たり、他の記号は使用しません。

フォールバックも機能しません。何らかの理由で失敗した場合は、理由のために失敗したのか、nu他の理由で失敗したのかをcron知る方法はありません。nuほとんどのスクリプトは特定のインタプリタ(shebangで指定)用に作成され、1つのインタプリタを使用してスクリプトを実行し、別のインタプリタを使用して実行することはできません。同様に、エントリは指定された(デフォルト以外の場合)念頭に置いてcrontab作成されます。SHELL/bin/sh

答え2

いいえ、SHELL次の理由で複数のシェルを持つことは意味がありません。@Stephenは答えで説明されています。。ただし、この変数は、少なくともLinuxシステムで一般的に使用されるVixie cronで行の即時コマンド部分を実行するためにSHELLシェルが使用する項目のみを制御します。 。croncrontabSHELLcrontabDebian のマニュアルページ説明するcrontab(5)

crontabファイルは上から下に解析されるため、すべての設定はファイルの下にあるcronコマンドにのみ影響します。

この文は Debian で追加したようですが、私が使った CentOS システムでも同じ効果を発揮するようです。しかし、Toby Speightが彼の意見で指摘したように、環境変数の割り当てはcrontabPOSIX機能がまったくないのでYMMVです。


したがって、cronに関係なく、次のことができる必要があります。

* * * * * /path/to/somescript.py maybe 
* * * * * /path/to/otherscript.pl some
* * * * * /path/to/thirdscript.sh args

スクリプトに正しいhashbang行がある場合(たとえば#!/usr/bin/python3#!/usr/bin/perlなど#!/bin/bash)をコマンドとして渡すことができるようにSHELL設定し、引数を使用してスクリプトを実行します。/path/to/somescript.py maybeほとんどのシェルはマイナーなアイテムを同じようにサポートしているため、複雑なアイテムを別のスクリプトに入れて行を単純crontabに保つことで、スクリプト自体ですべてのシェルまたはスクリプト言語を使用できます。


直接crontabコマンドで別のシェルを使用する必要がある場合は、少なくともVixie cronでこれを実行できます。

SHELL=/bin/bash
* * 8-14 * * if test "$(date +\%w)" = 0; then echo $BASH_VERSION > /tmp/bashtest; fi
SHELL=/usr/bin/fish
* * 8-14 * * if test (date +\%w) = 0; echo $FISH_VERSION > /tmp/fishtest; end

どちらも日付が日曜日であることを確認し、そうであれば、Bashを使用するシェルバージョンとFishを使用するシェルバージョンを印刷します。 (もちろんこれは単なる例ですが、cron timeの設定がどのように機能するかによって毎月最初/2番目/最後の特定の作業日に実行されるのは、crontabでシェルコードを使用する一般的な状況の1つです。)

また、コメントでは、Nuは複数行のコマンドをサポートしておらず、\そこでBashを使用できることを望んだと述べました。 crontab 行に複数行のコマンドを使用することはできません。コマンド自体はファイル内の1行にする必要があり、crontabシンボルを改行文字としてcron使用すると、%最初の行から次の行がコマンドに送信されます。 。 (これが上記の%形式文字列で使用したものをエスケープする必要がある理由ですdate。)

関連情報