bashrcファイルを編集して保存するたびに、「source .bashrc」を自動的に実行できますか?
答え1
同じ方法もう一つの答え.bashrcへのエディタの呼び出しを2段階のプロセスに置き換える関数が作成されることを明記してください。
- .bashrcでエディタを開きます。
- ソース.bashrc
たとえば、
vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }
これにはいくつかの欠点があります。
vibashrc
これにより、購入するたびに入力する必要があることを覚えておく必要があります。- 現在のbashウィンドウでのみ発生します。
- 変更するかどうかにかかわらず.bashrcを取得しようとします。
別のオプションはbashに接続することです。プロンプトコマンド.bashrcファイルが更新されたことを確認するたびに(そして次のプロンプトが表示される前に)、すべての/すべてのbashシェルから.bashrc機能をインポートします。
.bashrc ファイルに次のコードを追加するか、既存の PROMPT_COMMAND 関数を拡張できます。
prompt_command() {
# initialize the timestamp, if it isn't already
_bashrc_timestamp=${_bashrc_timestamp:-$(stat -c %Y "$HOME/.bashrc")}
# if it's been modified, test and load it
if [[ $(stat -c %Y "$HOME/.bashrc") -gt $_bashrc_timestamp ]]
then
# only load it if `-n` succeeds ...
if $BASH -n "$HOME/.bashrc" >& /dev/null
then
source "$HOME/.bashrc"
else
printf "Error in $HOME/.bashrc; not sourcing it\n" >&2
fi
# ... but update the timestamp regardless
_bashrc_timestamp=$(stat -c %Y "$HOME/.bashrc")
fi
}
PROMPT_COMMAND='prompt_command'
次に、次回ログインすると、bashはこの関数とプロンプトフックをロードし、プロンプトが表示されるたびに$ HOME / .bashrcが更新されたことを確認します。存在する場合は、構文エラーがあるかどうかをすばやく確認します(set -n
オプション)、ファイルがきれいになるとインポートされます。
構文チェックに関係なく、内部タイムスタンプ変数を更新してファイルを再保存/更新する前にファイルをロードしようとしません。
答え2
おそらく、次のシェル機能があります。
nano .bashrc ; source .bashrc
それとも単にコマンドを実行しますか?
答え3
.bashrc
bashにメッセージを受信するのを待つように指示できます。シグナル。次の行を次の行に入れます.bashrc
。
trap '. ~/.bashrc' USR1
その後、編集が完了するたびにを送信.bashrc
してください。インタラクティブBash信号の例。 (スクリプトに送信しないでください。これを行うとスクリプトが終了します。)これを行うための完璧な方法はないため、無関係なプロセスが終了する危険があります。次のbashスニペットは近いです。引数なしで端末(または他の文字デバイス、しかし実際には問題ではない)の標準入力を使用して呼び出されたbashを見つけます。
ps -u "$(id -u)" -o pid= -o args= | while read -r pid args; do
if [[ $args = bash || $args = */bin/bash ]]; then
stdin="$(lsof -p"$pid" | sed -n '/^f0$/ { n; s/^n//p; q; }')"
if [ -c "$stdin" ]; then
kill -USR1 "$pid"
fi
fi
done
あるいは、シグナリング方法の不安定性を防ぐために、bashに.bashrc
独自の違反を再度読み込むようにしてもよい。この方法の欠点は、ファイルを保存したときに構文エラーや論理エラー(無限ループなど)があってもファイルを読み直すことです。PROMPT_COMMAND
この変数の内容は、bashがプロンプトを表示するたびに実行されます。これを次の項目に入力してください.bashrc
。
reread_bashrc () {
if ((SECONDS > bashrc_last_read)); then
. ~/.bashrc
bashrc_last_read=$SECONDS
fi
}
bashrc_last_read=$SECONDS
PROMPT_COMMAND="$PROMPT_COMMAND
reread_bashrc"
このアプローチの1つの利点は、コマンドを入力しても実行されないことです。少なくともを押す必要がありますEnter。
答え4
edit_and_source () {
local tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT RETURN
cp -p "$1" "$tmpfile"
while true; do
command "${EDITOR:-vi}" "$tmpfile"
bash -n "$tmpfile" && break
echo 'There were errors. Re-edit?' >&2
read -p 'Yes/No/Force: '
case "$REPLY" in
[Yy]*) continue ;;
[Ff]*) break ;;
*) return ;;
esac
done
mv "$tmpfile" "$1"
}
この機能により、定義されたエディタを使用して(または設定されていない場合)、指定されたファイルを編集してbash
インポートできます。$EDITOR
vi
$ edit_and_source ~/.bashrc
編集後にファイルにエラーがある場合、関数はファイルを再編集するかどうかを尋ねます。
/tmp/tmp.ETdo10orcg: line 4: syntax error near unexpected token `('
/tmp/tmp.ETdo10orcg: line 4: ` nt hn thnt();0'
There were errors. Re-edit?
Yes/No/Force: n
「いいえ」と答えると、元のファイルは変更されません。 「force」(または「f」で始まる単語)を選択すると、そのファイルが強制的にインストールされます。