Làm thế nào tôi có thể chỉnh sửa một biến trong một vỏ đang chạy?


8

Tôi đang chỉnh sửa lời nhắc PS1 của mình và tôi không muốn tiếp tục tìm nguồn cung cấp bashrc của mình để cập nhật nó (vì bashrc của tôi cũng thiết lập lại những thứ khác). Tôi cũng không muốn sao chép và dán nó nhiều lần. Có cách nào để chỉnh sửa biến tương tác, như sử dụng nano(trình chỉnh sửa mặc định của tôi) không?

PS1 chủ yếu là một ví dụ, bởi vì tôi muốn làm điều tương tự với các lọ khác. Lý do tôi muốn thực hiện nó một cách tương tác là biến đã khá dài và tôi chỉ cần chỉnh sửa một vài ký tự trong đó. Và tôi chỉ cần thay đổi nó trong shell hiện tại.

Câu trả lời:


8

Điều này có thể thực hiện được. Nhập var=$varvà sau đó mở rộng và chỉnh sửa nó. Để mở rộng, sử dụng Esc+ Ctrle(phím tắt mặc định, kiểm tra đầu ra của bind -p | grep shell-expand-lineđể xác nhận).

Vì thế:

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

sẽ trở thành:

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

Mà sau đó bạn có thể chỉnh sửa trong một trình soạn thảo với Ctrlx Ctrle( edit-and-execute-commandtheo thuật ngữ đọc). Khi bạn lưu và thoát, nội dung đã lưu sẽ được shell thực thi.

Nếu bạn đã có PS1=...trong lịch sử của mình, bạn có thể quay lại đó và Ctrlx Ctrle.

Từ hướng dẫn bash :

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

Mở rộng dòng như vỏ làm. Điều này thực hiện mở rộng bí danh và lịch sử cũng như tất cả các mở rộng từ vỏ.

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

Gọi một trình soạn thảo trên dòng lệnh hiện tại và thực hiện kết quả dưới dạng các lệnh shell. Bash cố gắng gọi $ VISUAL, $ EDITOR và emacs làm biên tập viên, theo thứ tự đó.


Đẹp! Chỉ cần Esc, Ctrl + E chính xác là những gì tôi đang tìm kiếm. Mặc dù khi tôi gõ PS1='$PS1', nó đã xóa các trích dẫn, nhưng gõ PS1=\'$PS1\'hoạt động hoàn hảo.
wjandrea

Và đọc qua bind -p, tôi cũng phát hiện ra bạn có thể mở rộng các khối, dấu ngã và dòng lịch sử. Khéo léo!
wjandrea

1

Thay vì tìm nguồn bashrc, hãy tìm một tệp khác, chỉ chứa biến.

  1. Tạo ra nó:

    echo "PS1='$PS1'" > /tmp/PS1
    • Lưu ý: Nếu biến chứa dấu ngoặc đơn, bạn sẽ cần sử dụng lệnh có thể thoát chúng, ví dụ:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Mở nó trong một trình soạn thảo, ví dụ nano /tmp/PS1.

    • Để tránh chạy đi chạy nanolại, bạn có thể chạy nó trong một thiết bị đầu cuối / TTY khác hoặc sử dụng trình chỉnh sửa đồ họa.
  3. Thực hiện thay đổi của bạn và tiết kiệm.

  4. Nguồn nó:

    source /tmp/PS1
  5. Lặp lại bước 3 và 4 khi cần thiết.


1

Zsh có một nội dung được gọi là varedcho phép bạn chỉnh sửa một dòng nội tuyến. Tôi đã viết phiên bản của riêng mình, ban đầu được đăng trên Super User :

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

Lưu ý rằng điều này có một số khác biệt tinh tế từ nội dung Zsh, ví dụ:

  • Sẽ không có lỗi nếu biến không được đặt
  • Kiểm tra tính hợp lệ của tên biến trước khi in giá trị của nó (ví dụ vared $)
  • Cắt ngắn các biến đa dòng.

Sau đó, để chỉnh sửa PS1, chỉ cần chạy vared PS1.


Chấp nhận câu trả lời này vì đó là điều tôi sử dụng hàng ngày
wjandrea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.