bashのスクリプト、test.sh
lang
1# .bashrcを編集 2source .bashrc
を用意して
$ sh ./test.sh
を実行、実行したterminalで.bashrcの変更内容を反映したいのですが、方法はあるでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
ご希望の動作かどうかわかりませんが、test.sh に下記の通り追記すれば .bashrc が反映された状態になります。
lang
1source .bashrc 2exec $SHELL --login
追記 2014/12/21
この方法だと、元のシェルから fork したシェルスクリプトのプロセスを exec でログインシェルに置き換えています。なので、元のシェルはそのまま生きているので、次のようにプロセスが1個増えた状態になります。
元の状態
$ pstree init─┬─... : : └─sshd───sshd───sshd───bash───pstree
シェルスクリプトを実行した後
$ pstree init─┬─... : : └─sshd───sshd───sshd───bash───bash───pstree
この状態からログアウトしようとすると2回 exit する必要があります。
追記2 2014/12/21
といったシェルスクリプトを実行して、元のシェルでnvmがつかいたい、のが目的でした
そういう用途であれば次のようなスクリプトを、
lang
1curl https://raw.githubusercontent.com/creationix/nvm/v0.13.1/install.sh | bash 2exec $SHELL --login
次のように fork せずに実行するのがいいのではないかと思います。
$ . script.sh
投稿2014/12/18 00:25
総合スコア4516
0
親シェルに何かさせたいときは、シグナルを使います。
まず、親シェル側の準備です。~/.bash_login
等で、下記を書いておきます。
lang
1export LOGINSHELLPID=$$ 2trap 'source ~/.bashrc' USR1
~/.bashrc
を書き換えるシェルスクリプトの中で、
lang
1「書き換え処理」 2kill -USR1 $LOGINSHELLPID
そのスクリプトが必ずログインシェルの直下で動くのなら、LOGINSHELLPID
は不要で、$PPID
をkillすればいいです。
他の方法としては、親シェルでシェル変数PROMPT_COMMAND
を設定して、その中で~/.bashrc
のタイムスタンプが新しければ読み込む。
lang
1PROMPT_COMMAND='test ~/.bashrc -nt ~/.bashrc_time && source ~/.bashrc 3> ~/.bashrc_time'
(~/.bashrc
の実行と目印ファイルのタイムスタンプ更新を1コマンドで行っている。3
は使ってないディスクリプタ)
ただ、これだとプロンプトが出る度にこのコマンドが動きます。
投稿2014/12/18 05:37
総合スコア86281
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/12/21 07:29
2014/12/21 08:26