非対話型、非ログインシェル、およびcronジョブに関連するいくつかの質問があります。
Q1。非対話型、非ログインシェルは$BASH_ENV
のみを「ロード」することを読みました。これは正確にはどういう意味ですか? $BASH_ENV
がファイルを指すことができ、このファイルがソースになるということですか?
Q2:cron
にBashShebangを含むBashスクリプトを指すエントリがあるとすると、Bashスクリプトがロードされていると想定できる環境変数と定義は何ですか?
Q:crontab
の先頭にShell=/bin/bash
を追加した場合、これは正確に何をしますか?それはそれを意味しますか:
cron
自体はBashで実行されますか?crontab
のコマンド指定はBashで解釈されますか?shebangs
が含まれており、$Shell
の下で実行されます。他に何か?
Q4:cronジョブにBASH_ENV
を設定するにはどうすればよいですか?
Q1とQ2については、ここを参照してください。 Q3は、以下の他の3つの質問のディスカッションで回答されます。
WRT $BASH_ENV
、man bash
から:
たとえば、bashが非対話的に開始されると、シェルスクリプトを実行するために、環境内の変数BASH_ENVを検索し、そこに表示されている場合はその値を展開し、展開された値を読み取りおよび実行するファイルの名前として使用します。 。
したがって、これは.profile
タイプのスクリプトである可能性があります。どこで誰が設定したかは、コンテキストによって異なります。通常は設定されていませんが、現在のプロセスの祖先が設定した可能性があります。 cron
はこれを特別に利用していないようで、AFAIKもinitを使用していません。
Cron自体がBashで実行されるということですか?
「in」とは、シェルから開始されることを意味します。これは、initシステムによって異なります。たとえば、SysVはサービスのシェルスクリプトを実行するため、これらのサービスは常にシェルを介して開始されます。
しかし、「in」が「シェルプロセスの子ですか?」という意味の場合、no。他のデーモンと同様に、独自のプロセスグループのリーダーとして実行され、その親プロセスは初期化プロセス(pid1)。
ただし、cron
の環境への影響はおそらく重要ではありません。スタートアップサービスの環境の詳細については、Q1とQ2に関して上記のリンク先の回答を参照してください。特にcronへのWRTは、man 5 crontab
によると、それもsets開始するプロセス($LOGNAME
、$HOME
、および$Shell
)によって継承されるいくつかの環境変数です。
Crontabで指定されたコマンドはBashで解釈されますか?
それらはsh
または$Shell
で解釈されます。再びman 5 crontab
から:
改行または「%」文字までの行のコマンド部分全体は、/ bin/shまたはcronfileのShell変数で指定されたShellによって実行されます。コマンド内の「%」文字は、バックスラッシュ()でエスケープしない限り、改行文字に変更され、最初の%以降のすべてのデータが標準入力としてコマンドに送信されます。
強調された部分はQ3に答えます。
シバンが含まれていないスクリプトは、$ Shellを使用して実行されます
シバンの有無にかかわらず実行可能なスクリプトは、$Shell
(またはsh
)によって開かれます。違いは、シバンを持っているものは適切なインタプリタ(#!/bin/sh
はシェルの別のインスタンスです)に渡されますが、executableスクリプト(実行可能ファイルとして参照される実行可能ビットが設定されているもの) Shebangは、コマンドラインから実行した場合と同じように(sh script.sh
を実行しない限り)単純に失敗します。