`.bashrc`を更新して再ロードしてください。

`.bashrc`を更新して再ロードしてください。

スクリプトの下部にいくつかの行を挿入するスクリプトがあります。スクリプトが完了した後もこれらの変更を維持できるように、スクリプトからこれらの行をインポートする.bashrc方法はありますか?.bashrcMWEなどのスクリプトは次のとおりです。

#!/bin/bash

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

source ~/.bashrc

スクリプトの実行後に手動でインポートしない限り、ファイルは使用できませMyDirん。llA.bashrc

答え1

間接的。

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

あなたができること:

  • このスクリプトは.bashrcを更新し、他の操作は実行しません。スクリプトが正常に完了すると、bashrcを受け取ります。

    bash yourScript.bash && source .bashrc
    
  • このスクリプトは.bashrcを更新し、印刷sourceコマンド:他の内容が印刷されないことを確認してください。次に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の末尾に次のことを行います(!のみ一つ最初の行の"">"には新しいファイルがあります)

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/」から一時ファイルを削除するファイルを作成するできます。 。 d/"または"~/.bashrc-temporary-addons"。

関連情報