`.bashrc`を更新してリロードする

`.bashrc`を更新してリロードする

の下部にいくつかの行を挿入するスクリプトがありますが.bashrc、スクリプト内から を取得して、スクリプトが終了した後もこれらの変更が残るようにする方法はありますか.bashrc? 同様のスクリプトの MWE を次に示します。

#!/bin/bash

echo "export MyDir='MyAnalysis'" >> ~/.bashrc
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc

source ~/.bashrc

スクリプトが実行されると、ファイルを手動で取得しない限り、MyDirllA利用できなくなります。.bashrc

答え1

直接ではありません。

スクリプトは対話型シェルとは別のプロセスで実行されます。スクリプトのシェルが環境に加えた変更は、そのシェルが終了すると消えてしまいます。子プロセスは親プロセスの環境を変更することはできません。

できること:

  • スクリプトは.bashrcを更新し、それ以外は何もしません。スクリプトが正常に完了したら、bashrcをsourceします。

    bash yourScript.bash && source .bashrc
    
  • スクリプトは.bashrcを更新し、プリントソース コマンド: 他に何も出力されないことを確認します。次に、evalスクリプトを実行します。

    eval "$(bash yourScript.bash)"
    
  • スクリプトは.bashrcを更新し、また何をするかを出力します。これを評価します。これがスクリプトです

    #!/bin/bash
    exec > >(tee -a "$HOME/.bashrc")
    
    echo "export MyDir='MyAnalysis'"
    echo "alias llA='ll MyAnalysis'"
    

    そして、次のように実行します

    eval "$(bash yourScript.bash)"
    
  • 更新しないでくださいシェルではなく、bashrcを読み込む新しい対話型シェルを起動します

    #!/bin/bash
    {
        echo "export MyDir='MyAnalysis'"
        echo "alias llA='ll MyAnalysis'"
    } >> ~/.bashrc
    exec bash -i
    

    親シェルは更新されません。


.bashrcを更新するコードを関数関数は現在のシェルで実行されるため(デフォルト)、期待どおりに動作します。

addMyAnalysis() {
    echo "export MyDir='MyAnalysis'" >> ~/.bashrc
    echo "alias llA='ll MyAnalysis'" >> ~/.bashrc
    source ~/.bashrc
}

別の方法:「conf」ディレクトリを作成します$HOME/.bash.d。そこにbashファイルを書きます。

# this is "~/.bash.d/some_file.bash"
export MyDir='MyAnalysis'
alias llA='ll MyAnalysis'

そして、.bashrc はそのディレクトリ内のすべての bash ファイルをソースします。

if [[ -d ~/.bash.d ]]; then
    shopt -s nullglob
    for f in ~/.bash.d/*.bash; do
        source "$f"
    done
    shopt -u nullglob
fi

答え2

@glenn-jackman が指摘したように、ソース指定はスクリプトが実行されるサブシェルで行われ、スクリプトの最後にはソース指定が行われなかった親シェルに戻り、.bashrc も新たに実行されません。親シェルとサブシェルを分離するのは、一般的なセキュリティ上の考慮事項によるものです。

あなたが探しているのは ですexec bashが、スクリプト内ではなく、それとグループ化されています。

bash your-script.sh && exec bash

これはかのようにあなたは情報源を探し、そのシェルに留まります。確かにそれは置き換える現在のシェルが新しいシェルに切り替わり、この新しいシェルは、すべての (対話型) シェルと同様に、変更を加えた .bashrc を実行して起動します。起動するすべての新しいシェル/ターミナルも同様に変更が反映されます。

スクリプト内で「exec bash」を実行すると、スクリプトが実行されるサブシェルが置き換えられますが、それでもサブシェルのままであることに注意してください。

.bashrcを動的かつ一時的に操作することが目的の場合は、@glenn-jackmanの提案に従って、変更を別のファイルで行い、いつでも簡単に削除できるようにしてください。そのためには、永続的な行を追加することもできます。

[ -f ~/.bashrc-temporary-addons ] && source ~/.bashrc-temporary-addons

.bashrcの最後に(!のみを実行してください1つ新しいファイルを作成するには、最初の行に「>」を追加します)

echo "" > ~/.bashrc-temporary-addons
echo "export MyDir='MyAnalysis'" >> ~/.bashrc-temporary-addons
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc-temporary-addons

そして、あなたが選んだ時点で、

rm ~/.bashrc-temporary-addons

(「-f」テストのため、「~/.bashrc-temporary-addons」が存在しなくてもエラーは発生しません)。

.bashrc の操作がセッションと同じ期間、つまりログアウトするまで存続する必要がある場合 (ただし、次回のログイン時には再表示されない)、.bash_logout「bash.d/」内の一時ファイルまたは「bash.d/」のすべての内容、または「~/.bashrc-temporary-addons」を消去するファイルを作成できます。

関連情報