「source .bashrc」を編集して保存した後、どのように自動的に実行できますか?

「source .bashrc」を編集して保存した後、どのように自動的に実行できますか?

bashrcファイルを編集して保存するたびに、「source .bashrc」を自動的に実行できますか?

答え1

同じ方法もう一つの答え.bashrcへのエディタの呼び出しを2段階のプロセスに置き換える関数が作成されることを明記してください。

  1. .bashrcでエディタを開きます。
  2. ソース.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

.bashrcbashにメッセージを受信するのを待つように指示できます。シグナル。次の行を次の行に入れます.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インポートできます。$EDITORvi

$ 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」で始まる単語)を選択すると、そのファイルが強制的にインストールされます。

関連情報