実行中のシェルで変数を編集するにはどうすればよいですか?


8

PS1プロンプトを編集していますが、bashrcを更新して更新する必要はありません(bashrcによって他の設定もリセットされるため)。また、何度もコピーして貼り付けたくありません。nano(私のデフォルトのエディター)を使用するように、変数をインタラクティブに編集する方法はありますか?

PS1はほとんどの例です。他の変数でも同じことをしたいからです。インタラクティブに実行したいのは、変数がすでにかなり長く、その中のいくつかの文字を編集する必要があるだけだからです。現在のシェルで変更するだけです。

回答:


8

これは可能です。入力var=$varし、展開して編集します。展開するには、Esc+ Ctrle(デフォルトのショートカット、出力bind -p | grep shell-expand-lineを確認して確認)を使用します。

そう:

muru@muru-1604:~$ PS1=$PS1

となります:

muru@muru-1604:~$ PS1=${debian_chroot:+($debian_chroot)}\u@\h:\w\$

エディターで編集できますCtrlx Ctrleedit-and-execute-commandreadline用語)。保存して終了すると、保存されたコンテンツはシェルによって実行されます。

すでにPS1=...履歴にある場合は、その履歴に戻ることができますCtrlx Ctrle

bashマニュアルから:

shell-expand-line (M-C-e)

シェルと同じように行を展開します。これは、エイリアスと履歴の拡張、およびすべてのシェルワードの拡張を実行します。

edit-and-execute-command (C-xC-e)

現在のコマンドラインでエディターを起動し、結果をシェルコマンドとして実行します。Bashは、$ VISUAL、$ EDITOR、emacsをこの順序でエディターとして起動しようとします。


いいね!ちょうどEsc、Ctrl + Eはまさに私が探していたものです。と入力PS1='$PS1'しても、引用符は削除されましたが、入力PS1=\'$PS1\'は完全に機能します。
wjandrea 2017

またbind -p、を読んで、グロブ、チルド、履歴行を拡張できることもわかりました。きちんと!
wjandrea

1

bashrcを調達する代わりに、変数のみを含む別のファイルを入手します。

  1. 作成:

    echo "PS1='$PS1'" > /tmp/PS1
    • 注:変数に単一引用符が含まれている場合は、それらをエスケープできるコマンドを使用する必要があります。例:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. エディタなどで開きnano /tmp/PS1ます。

    • 実行しないようにnano何度も繰り返して、あなたは他の端末/ TTYでそれを実行することができ、またはグラフィカルエディタを使用します。
  3. 変更を加えて保存します。

  4. ソース:

    source /tmp/PS1
  5. 必要に応じて手順3と4を繰り返します。


1

Zshには、vared変数をインラインで編集できるというが組み込まれています。私は自分のバージョンを書いて、もともとスーパーユーザーに投稿しました

vared(){
    # Based on the zsh builtin of the same name.
    IFS= read -rei "${!1}" "$1"
}

これはZshビルトインとは微妙な違いがあることに注意してください。例:

  • 変数が設定されていなくてもエラーになりません
  • 値を出力する前に変数名の有効性をチェックします(例vared $
  • 複数行の変数を切り捨てます。

次に、PS1を編集するには、を実行しvared PS1ます。


この回答を受け入れると、それが私が日常的に使用するものになります
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.