なぜ.bashrc / .bash_profileにシバンがないのですか?


22

簡単な問い合わせ:スクリプトの上にシバンを見たことがないことに気付いた.bashrcので、ログイン時にシステムがデフォルトのシェルを使用してソースを取得すると考えるようになります(${SHELL})。それがなぜなのか、つまり、ログインスクリプトを実行するためにデフォルトのシェル以外のものを使用するのは悪い習慣であると考えられるのか、私は理由を熟考しています。


1
bash rc と呼ばれる理由があります
...-Ajedi32

回答:


28

.bashrcスクリプトで.bash_profileはありません。これらはbash、次の2つの方法のいずれかで実行されるたびに取得される構成ファイルです。

  • インタラクティブ
  • ログイン

bashのmanページのINVOCATIONセクションが関連しています。

ログインシェルは、その最初の引数がゼロの文字であるものである-と開始、または1つ--loginのオプション。

インタラクティブシェルは、一つには、非オプションの引数なしとせずに開始され-c、その標準入力と誤差によって決定されるように、両方の(端子に接続されるオプションisatty(3))、または一方がで開始します-i オプション。PS1が設定され、 $-含まれiている場合bash、対話型であり、シェル・スクリプトを可能にしますまたは、この状態をテストするためのスタートアップファイル。

次の段落でbashは、スタートアップファイルの実行方法について説明します。いずれかのファイルが存在するが読み取ることができない場合、bashはエラーを報告します。下後述のようにチルダは、ファイル名に展開されている チルダ展開EXPANSIONの セクション。

bashが対話型ログインシェルまたは--loginオプション付きの非対話型シェルとして呼び出された/etc/profile場合、ファイルが存在する場合、最初にfileからコマンドを読み取って実行します 。そのファイルを読んだ後、それは探し~/.bash_profile~/.bash_login、および ~/.profile、そのためには、および読み込み、存在し、読み取り可能である最初のものから実行するコマンドを。 --noprofileシェルは、この動作を抑制するために開始されたときにオプションを使用することができます。

ログインシェルが終了すると、bashはfileからコマンドを読み取り、実行します(~/.bash_logout存在する場合)。

場合は、対話型ログインシェルではありませんシェルが起動され、bashはからコマンドを読み込み、実行し~/.bashrc、そのファイルが存在する場合は、。--norcオプションを使用すると、これを禁止できます。この--rcfile file オプションは、bashにの代わりにファイルからコマンドを強制的に読み取り、実行させます~/.bashrc

あなたは彼らがコマンドラインスイッチを介してロードされるときに制御、できる--norc--noprofile。また、--rcfileスイッチを使用してロードされる場所をオーバーライドすることもできます。

他の人が述べたように、source <file>コマンドの使用またはコマンドの使用により、これらのファイルがどのようにロードされるかを模倣できます. <file>

この機能を次のように考えるのが最善です。

  1. bashは裸の環境で起動します
  2. 次に、bashはこれらのファイルの1つを開きます(対話型またはログインとして起動された方法に応じて、...
  3. ...ファイル内の各コマンドを1行ずつ実行します...
  4. 完了したら、プロンプトの形で制御を与え、入力を待機します

呼び出す方法

このトピックはたまに出てくるように見えるので、呼び出すさまざまな方法とbashその結果のチートシートを以下に示します。注:「sourced $ HOME / .bashrc」および「sourced」というメッセージを追加しました。 $ HOME / .bash_profile "をそれぞれのファイルに追加します。

基本的な呼び出し

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -or- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    注:-cスイッチがどちらのファイルもソースしていないことに注意してください!

設定ファイルの読み取りを無効にする

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i-または-bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

bashを呼び出すより難解な方法

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

これらは失敗しました

  1. bash -i -rcfile〜/ .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

おそらく他にもありますが、ポイントを得ることができれば幸いです...

ほかに何か?

最後に、このトピックに夢中になっていて、このトピックの詳細を読んだり調べたりしたい場合は、Bash初心者ガイド、特にセクション1.2をご覧になることを強くお勧めしますボーンアゲインシェルの利点。その下の「1.2.2.1。呼び出し」から「1.2.2.3.3。対話型シェルの動作」までのさまざまなサブセクションでは、呼び出すことができるさまざまな方法の低レベルの違いについて説明していますbash


@amphibient-申し訳ありませんが、少し手に負えませんでした。願わくば、人々はその価値を高く評価し、ダウンボットで罰しないでください。ここで、これを他の回答で参照することができます。8-)。私はこれを示すためにテーブルを作ることを考えていましたが、それは夢中になっていたでしょう8)。
slm

これらを実際にテストしましたか?私はかつて私のbashがsqueezeで何をするのかを追おうとしましたが、マニュアルが示唆したように動作し
ませんでした

@Bananguin-これらのコマンドはすべて私が実行したもので、コマンドの下で生成された出力です。私のセットアップの唯一の潜在的な「もの」.bash_profileは、をソースするための行を含むこと.bashrcです。しかし、私はそれがセットアップの非常に典型的なものであると信じています。
slm

これは主観的かもしれませんが、私はそれを言わず、スクリプト.bashrc.bash_profileはありません。私見は、bashの初期化中、または変更を適用する必要がある場合に明示的にソースされる特定の目的のスクリプトです。構成ファイルから期待どおりにbash環境(変数、関数、エイリアスなど)を構成するだけではありません。一般的なスクリプトのように、あらゆるアクションを実行できます。たとえば、バックグラウンドタスクなどのさまざまなアクションを開始したり、ログレコードを書き込んだり、いくつかのプログラムを初期化したりできます。
パブーク

この回答は、ここでの回答よりも優れています。stackoverflow.com/questions/415403/ …!
ジェイコブトムリンソン

13

.bashrcスクリプトはbash単独でのみ実行されます。それらは自立型ではなくexec、システムによって使用されることも意図していません。(実際、それらは一般的に実行可能とマークされておらず、あなたが言うように、それらにはシバンラインがありません。)

このようなスクリプトはsource、通常、環境変数の変更($PATHなど)を行うため、dであることが意図されています。環境変数は、スクリプトの終了後も持続すると予想されます。そのため、サブシェルで実行しようとしても意味がありません。


5

他の応答に加えて、必要な場合、これらの構成ファイルの先頭にシバンを置くことを禁止するものはないことに注意してください。

シバンは通常のコメントと同じように処理されるため、シェルを調達しても問題はありません。つまり無視されます。

これは、構文の強調表示を使用して、ファイルで使用されているプログラミング言語を把握しているエディターに役立ちます。

ただし、一部のエディターvimは、後者のモードラインのような代替方法を提供します。つまり、あなたはいつもの末尾にモードラインを置くことができます~/.bashrcし、~/.bash_profileそうのように:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
上記の@slmから受け入れられた答えは素晴らしいですが、これは私が探していたもので、.bash_profileShellCheckからの推奨事項の最初にシバンを追加することに関してです。
jlucktay

1

私はこれをどこでも正確に知りませんが、それは本当です

Bashのマニュアルはこの領域では少しわかりにくいですが、Bashはシェルスクリプトのように〜/ .bash_profileを実行しません。ファイルを読み取ってから、その中のコマンドを実行します(source〜/ .bash_profileを実行すると同様のことができます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.