web-dev-qa-db-ja.com

スクリプトの〜/ .bashrcファイルを更新する

私は、ubuntu-desktop環境を構成およびセットアップするスクリプトを開発しています。変更の1つは、~/.bashrcファイルに関数などを追加することです。スクリプトの後半で、~/.bashrcに追加された関数の1つを呼び出す必要がありますが、command not foundエラーが発生します。スクリプトの例を次に示します。

# t.sh
#!/bin/bash

text='test-func() { echo It works!; }'
echo "$text" >> ~/.bashrc

source ~/.bashrc
test-func

echo checkpoint

出力:

./t.sh: line 10: test-func: command not found
checkpoint

~/.bashrcを調達するとシェルが更新され、test-funcを呼び出すことができると想定しましたが、そうではありません。周りをうろついて、exec bashを置き換えるsource ~/.bashrcを見つけました。

新しい出力:

./t.sh: line 10: test-func: command not found

execの理解から、スクリプトを切断する新しいシェルが作成されるだけです。したがって、「チェックポイント」は出力されません。

どのようにして~/.bashrcを更新し、同じスクリプトで更新を実行できますか?

どんな助けも大歓迎です。

4
Nelson

実際、.bashrcはソースされます。ただし、.bashrcは、対話型シェルによって読み取られることを目的としています。スクリプトを実行するシェルはインタラクティブではありません。

Ubuntuでは、.bashrcは、ソースとなるシェルが対話型であることを確認し、そうでない場合は実行を停止します。最初の方にこの行があるはずです:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

これにより、スクリプトは関数を読み取る前にファイルのソースを停止します。

関数を.bashrc以外のファイルに添付するだけで、正常に機能するはずです。 .bashrcを使用する場合は、PS1を取得する前に、スクリプトで変数.bashrcをダミー値に設定するだけで済みます。

4
Malte Skoruppa