私は、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
を更新し、同じスクリプトで更新を実行できますか?
どんな助けも大歓迎です。
実際、.bashrc
はソースされます。ただし、.bashrc
は、対話型シェルによって読み取られることを目的としています。スクリプトを実行するシェルはインタラクティブではありません。
Ubuntuでは、.bashrc
は、ソースとなるシェルが対話型であることを確認し、そうでない場合は実行を停止します。最初の方にこの行があるはずです:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
これにより、スクリプトは関数を読み取る前にファイルのソースを停止します。
関数を.bashrc
以外のファイルに添付するだけで、正常に機能するはずです。 .bashrc
を使用する場合は、PS1
を取得する前に、スクリプトで変数.bashrc
をダミー値に設定するだけで済みます。