非対話型、非ログインシェル、クローン操作に関するいくつかの質問があります。
Q1.非対話型、非ログインのシェルは「load」のみ可能であることを読みました$BASH_ENV
。これは正確に何を意味しますか?これは、私が$BASH_ENV
ファイルを指すときにファイルをインポートできることを意味しますか?
第2四半期cron
:Bash shebangを使用してBashスクリプトを指すエントリがあると仮定すると、Bashスクリプトがロードされると仮定できる環境変数と定義は何ですか?
第3四半期SHELL=/bin/bash
:私の上部に追加すると、crontab
正確に何をしますか?これは次の意味ですか?
cron
Bashでそれ自体で実行されますか?- 注文する指定済み
crontab
Bashと解釈されますか? - 以下を実行するスクリプトいいえそのうち、
shebangs
以下を実行してみてください。$SHELL
他に何かありますか?
第4四半期BASH_ENV
:クローンジョブを設定する方法は?
答え1
Q1とQ2については、以下を参照してください。ここ。 Q3は、他の3つの質問について以下の議論で回答されます。
WRT $BASH_ENV
、ソースman bash
:
たとえば、bashが非対話型で始まる場合は、シェルスクリプトを実行するために環境でBASH_ENV変数を探し、その値がある場合は展開し、拡張値をファイル名として読み込み実行します。
したがって、これはおそらく.profile
タイプライターで書かれたスクリプトです。どこで、または誰が設定するかは状況によって異なります。通常は設定されていませんが、現在のプロセスの先祖によって設定できます。 cron
これに対する特別な用途はないようで、AFAIKはinitを使用しません。
これはcron自体がBashで実行されることを意味しますか?
「in」がシェルから始まるという意味であれば、initシステムによって異なります。たとえば、SysV はサービスに対してシェルスクリプトを実行するため、そのサービスは常にシェルを介して起動されます。
しかし、「in」が「シェルプロセスの子プロセスですか?」を意味する場合、いいえ。 他のデーモンと同様に、独自のプロセスグループのリーダーとして実行され、親プロセスはinitプロセス(pid 1)です。
cron
ただし、環境への影響は大きくない可能性があります。スタートアップサービス環境の詳細については、上記のQ1、Q2の回答を参照してください。 WRTは特にcronを対象としており、これによるman 5 crontab
とセット複数の環境変数(および$LOGNAME
)が開始されたプロセスから継承されます。$HOME
$SHELL
crontabで指定されたコマンドはBashで解釈されますか?
sh
以下で、またはを使用して$SHELL
もう一度説明しますman 5 crontab
。
改行または "%"文字までの行の完全なコマンド部分を/ bin / shまたはから読み込みます。cronfileのSHELL変数で指定されたシェルによって実行されます。 バックスラッシュ()でエスケープしない限り、コマンドの「%」文字は改行文字に変更され、最初の%以降のすべてのデータは標準入力としてコマンドに送信されます。
強調表示された部分はQ3への答えです。
Shebangのないスクリプトは$ SHELLを使用して実行されます。
$SHELL
shebangの有無にかかわらず実行可能なスクリプトは(または)で開きますsh
。違いは、shebangを使用すると、適切な通訳者(#!/bin/sh
シェルの別のインスタンスに)に渡されることです。実行可能ファイルshebangを持たないスクリプト(実行ファイルで参照される実行可能ビットセットを含むスクリプト)は、コマンドラインで実行したときと同じように失敗します(実行しない限りsh script.sh
)。