Bagaimana saya bisa mengedit variabel di shell yang sedang berjalan?

8

Saya mengedit prompt PS1 saya dan saya tidak ingin terus mencari bashrc saya untuk memperbaruinya (karena bashrc saya mengatur ulang hal-hal lain juga). Saya juga tidak ingin menyalin dan menempelnya berulang-ulang. Apakah ada cara untuk mengedit variabel secara interaktif, seperti menggunakan nano(editor default saya)?

PS1 sebagian besar adalah contoh, karena saya ingin melakukan hal yang sama dengan vars lainnya. Alasan saya ingin melakukannya secara interaktif adalah karena variabel sudah cukup lama, dan saya hanya perlu mengedit beberapa karakter di dalamnya. Dan saya hanya perlu mengubahnya di shell saat ini.

wjandrea
sumber

Jawaban:

8

Ini bisa dilakukan. Ketik var=$varlalu perluas dan edit. Untuk memperluas, gunakan Esc+ Ctrle(pintasan default, periksa output bind -p | grep shell-expand-lineuntuk mengonfirmasi).

Begitu:

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

akan menjadi:

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

Yang kemudian dapat Anda edit di editor dengan Ctrlx Ctrle( edit-and-execute-commanddalam istilah readline). Saat Anda menyimpan dan keluar, konten yang disimpan akan dieksekusi oleh shell.

Jika Anda sudah memiliki PS1=...dalam sejarah Anda, Anda bisa kembali ke sana dan Ctrlx Ctrle.

Dari manual bash :

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

Perluas garis seperti halnya shell. Ini melakukan ekspansi alias dan riwayat serta semua perluasan kata shell.

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

Aktifkan editor pada baris perintah saat ini, dan jalankan hasilnya sebagai perintah shell. Bash mencoba memanggil $ VISUAL, $ EDITOR, dan emacs sebagai editor, dalam urutan itu.

muru
sumber
Bagus! Hanya Esc, Ctrl + E adalah persis apa yang saya cari. Meskipun ketika saya mengetik PS1='$PS1', itu menghapus tanda kutip, tetapi mengetik PS1=\'$PS1\'berfungsi dengan baik.
wjandrea
Dan membaca bind -p, saya juga menemukan Anda dapat memperluas gumpalan, tildes, dan garis sejarah. Rapi!
wjandrea
1

Alih-alih sumber bashrc, sumber file lain, yang hanya berisi variabel.

  1. Menciptakannya:

    echo "PS1='$PS1'" > /tmp/PS1
    • Catatan: Jika variabel berisi tanda kutip tunggal, Anda harus menggunakan perintah yang dapat menghindarinya, misalnya:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Buka di editor, mis nano /tmp/PS1.

    • Untuk menghindari berlari nanoberulang-ulang, Anda bisa menjalankannya di terminal lain / TTY, atau menggunakan editor grafis.
  3. Lakukan perubahan dan simpan.

  4. Sumbernya:

    source /tmp/PS1
  5. Ulangi langkah 3 dan 4 sesuai kebutuhan.

wjandrea
sumber
1

Zsh memiliki nama bawaan varedyang memungkinkan Anda mengedit sebaris variabel. Saya menulis versi saya sendiri, awalnya diposting di Super User :

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

Perhatikan ini memiliki beberapa perbedaan halus dari Zsh builtin, misalnya:

  • Tidak akan kesalahan jika variabel tidak disetel
  • Periksa validitas nama variabel sebelum mencetak nilainya (mis. vared $)
  • Memotong variabel multi-line.

Kemudian untuk mengedit PS1, jalankan vared PS1.

wjandrea
sumber
Menerima jawaban ini karena itulah yang paling saya gunakan sehari-hari
wjandrea