ฉันจะแก้ไขตัวแปรในเชลล์ที่ทำงานอยู่ได้อย่างไร?


8

ฉันกำลังแก้ไขพรอมต์ PS1 ของฉันและฉันไม่ต้องการให้ bashrc ของฉันทำการอัปเดตต่อไป (เนื่องจาก bashrc ของฉันรีเซ็ตสิ่งอื่นด้วยเช่นกัน) ฉันไม่ต้องการคัดลอกและวางมันซ้ำแล้วซ้ำอีก มีวิธีแก้ไขตัวแปรแบบโต้ตอบเช่นใช้nano(แก้ไขเริ่มต้นของฉัน) หรือไม่

PS1 ส่วนใหญ่เป็นตัวอย่างเพราะฉันต้องการทำสิ่งเดียวกันกับ vars อื่น ๆ เหตุผลที่ฉันต้องการทำแบบโต้ตอบก็คือตัวแปรนั้นมีความยาวและฉันต้องแก้ไขตัวละครสองสามตัวในนั้น และฉันแค่ต้องการเปลี่ยนมันในเปลือกปัจจุบัน

คำตอบ:


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 Ctrle( edit-and-execute-commandในเงื่อนไข Readline) เมื่อคุณบันทึกและออกเนื้อหาที่บันทึกไว้จะถูกดำเนินการโดยเชลล์

หากคุณมีอยู่แล้วในประวัติศาสตร์ของคุณคุณก็สามารถกลับไปที่และPS1=...Ctrlx Ctrle

จากคู่มือทุบตี :

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

และจากการอ่านผ่านbind -pฉันพบว่าคุณสามารถขยาย globs tildes และบรรทัดประวัติศาสตร์ได้ เรียบร้อย!
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 มี builtin ที่เรียกvaredว่าให้คุณแก้ไขตัวแปรอินไลน์ ฉันเขียนเวอร์ชันของฉันเองโพสต์ครั้งแรกบน Super User :

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

โปรดทราบว่านี่มีความแตกต่างเล็กน้อยจาก Zsh builtin เช่น:

  • จะไม่เกิดข้อผิดพลาดหากตัวแปรไม่ได้ถูกตั้งค่า
  • ตรวจสอบความถูกต้องของชื่อตัวแปรก่อนพิมพ์ค่า (เช่นvared $)
  • ตัดตัวแปรหลายบรรทัด

จากนั้นก็ให้แก้ไข PS1 vared PS1เรียกเพียง


การยอมรับคำตอบนี้ทำให้มันเป็นสิ่งที่ฉันใช้มากที่สุดต่อวัน
wjandrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.