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