เป็นไปได้ไหมที่จะพิมพ์คำสั่ง bash ภายใน vi และรับ stdout?
ฉันพบว่ามันน่าเบื่อที่จะปิดและเปิดใหม่อีกครั้งเพียงเพราะฉันต้องการค้นหาบางอย่างในเปลือก
เป็นไปได้ไหมที่จะพิมพ์คำสั่ง bash ภายใน vi และรับ stdout?
ฉันพบว่ามันน่าเบื่อที่จะปิดและเปิดใหม่อีกครั้งเพียงเพราะฉันต้องการค้นหาบางอย่างในเปลือก
คำตอบ:
ใช่เช่นถ้าคุณต้องการls
ลอง:
:!ls
เพื่อวางไข่เปลือกหอยใช้
:shell
:w !sudo tee %
nano
ฉันมักจะใช้ctrl+z
ในการ sleep vi รันสิ่งที่ฉันต้องการในเชลล์จากนั้นfg
กลับมาทำงานต่อ vi ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ฉันคิดว่ามันเป็นวิธีการทำงานที่รวดเร็วมาก
หากคุณลืมว่าคุณเปิด vi ไว้ในพื้นหลัง (อาจเกิดขึ้นเมื่อคุณไม่ว่าง) เมื่อคุณพยายามออกจากระบบโดยใช้เชลล์ctrl+d
คุณจะได้รับการเตือนว่าคุณมีงานแบ็คกราวน์ทำงานอยู่และคุณสามารถปิดได้ หรือกด ctrl + d อีกครั้งเพื่อออกจากระบบ นอกจากนี้หากคุณพยายามเปิดไฟล์เดียวกันสองครั้งคุณจะได้รับคำเตือนการกู้คืนดังนั้นคุณสามารถกดa
เพื่อยกเลิกและเรียกใช้ fg เพื่อกลับไปที่ vi
เมื่อคุณพูดถึง "รับ stdout" โปรดทราบว่าคุณสามารถทำได้
:r! command
และผลลัพธ์ของคำสั่งจะถูกเพิ่มลงในไฟล์หรือ
:<range>!command
เพื่อให้เนื้อหาของช่วงกรองผ่านคำสั่ง [เช่น:1,$!wc
]
:%!command
ดูมีประโยชน์ทีเดียว
:.,+20 !sort
]
สำนวนที่ฉันต้องการคือ
!!command
ซึ่งจดชวเลข
:.!command
ซึ่งไพพ์บรรทัดปัจจุบันผ่านคำสั่งและแทรกเอาต์พุตลงในไฟล์ กรณีที่พบบ่อยที่สุดสำหรับฉันคือการแก้ไขคำสั่งด้วย vi และเรียกใช้:
!!sh
หรือ
!<motion>command
เช่น (ตัวอย่าง)
!apsh
เพื่อเรียกใช้ย่อหน้าทั้งหมดผ่านเชลล์
!}
!ap
(ฉันไม่ทราบว่านี่เป็นในทุก vi หรือเป็นกลุ่มเท่านั้น)
ด้วยการใช้เครื่องหมายจุดคู่และเครื่องหมายอัศเจรีย์คุณสามารถเรียกใช้คำสั่งใด ๆ ในเชลล์พา ธ และเชลล์สคริปต์ได้โปรดจำไว้ว่าคำสั่งนั้นทำงานภายใต้ผู้ใช้ที่รันโปรแกรม vi / vim และใช้สภาพแวดล้อมของมัน
:!<command>
เนื่องจาก vi ใช้สภาพแวดล้อมที่มีผลบังคับใช้เมื่อมีการเรียกใช้จึงใช้เส้นทางเดียวกับที่อยู่ในคำสั่งพาเรนต์ โปรดจำไว้ว่าเชลล์บางตัวเก็บแคชของโปรแกรมไว้ในพา ธ และ vi อาจไม่ทำงานกับแคชนี้ (ขึ้นอยู่กับเชลล์ที่ใช้และเป็นเวอร์ชัน) ดังนั้นคุณอาจจบการทำงานด้วยไบนารี่ที่ไม่ถูกต้องในกรณีที่คุณมีมากกว่า มากกว่าหนึ่งไบนารีที่มีชื่อเดียวกัน
คุณสามารถเห็นผลลัพธ์ของคำสั่งโดยพิมพ์ตัวอย่างเช่น:!ls -lh
ในโหมดคำสั่ง
r
หากคุณต้องการที่จะแทรกผลลัพธ์ของคำสั่งลงในไฟล์ที่คุณกำลังแก้ไขเพียงเพิ่ม ตัวอย่างเช่น:r!which perl
.
!
เห็นได้ชัดว่าการใช้เป็นคำตอบที่ถูกต้อง แต่หากคุณสลับไปมาบ่อยๆสิ่งที่คล้ายกับหน้าจอหรือ tmux อาจมีประโยชน์เช่นกัน
ฉันมีสิ่งนี้ใน. vimrc ของฉัน พบได้ใน Stack Overflow สักครู่:
" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
ฉันจะทำอย่างนั้นได้อย่างง่ายดายในลีนุกซ์โดยการเปิดหน้าต่างบรรทัดคำสั่งของเทอร์มินัลสองหน้าต่าง, เรียกใช้ vi ในที่หนึ่งและอีกอันที่มีให้สำหรับงานอื่น ๆ ในเวลาเดียวกัน