คำสั่ง Bash ภายใน vi


33

เป็นไปได้ไหมที่จะพิมพ์คำสั่ง bash ภายใน vi และรับ stdout?

ฉันพบว่ามันน่าเบื่อที่จะปิดและเปิดใหม่อีกครั้งเพียงเพราะฉันต้องการค้นหาบางอย่างในเปลือก

คำตอบ:


45

ใช่เช่นถ้าคุณต้องการlsลอง:

:!ls

เพื่อวางไข่เปลือกหอยใช้

:shell


ยอดเยี่ยมฉันจะอยู่ได้โดยปราศจากสิ่งนี้ได้อย่างไร
พิณ

3
อันที่จริงสิ่งที่ฉันมักจะทำคือลืมรัน vi เป็น root เมื่อแก้ไขบางอย่าง คำสั่งนี้ช่วยฉันจากการเขียนซ้ำเป็นระยะเวลานานกว่าที่ฉันจำได้ :w !sudo tee %
Mark D

1
ฉันหวังว่าจะมีวิธีการทำเช่นนี้ใน gnunano
ixtmixilix

1
แล้วคุณจะกลับไปที่เครื่องมือแก้ไขหลังจากใช้งานได้อย่างไร: shell
VaTo

@VaTo: หากต้องการย้อนกลับไปคุณสามารถพิมพ์: exit
Raman Kathpalia

12

ฉันมักจะใช้ctrl+zในการ sleep vi รันสิ่งที่ฉันต้องการในเชลล์จากนั้นfgกลับมาทำงานต่อ vi ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ฉันคิดว่ามันเป็นวิธีการทำงานที่รวดเร็วมาก

หากคุณลืมว่าคุณเปิด vi ไว้ในพื้นหลัง (อาจเกิดขึ้นเมื่อคุณไม่ว่าง) เมื่อคุณพยายามออกจากระบบโดยใช้เชลล์ctrl+dคุณจะได้รับการเตือนว่าคุณมีงานแบ็คกราวน์ทำงานอยู่และคุณสามารถปิดได้ หรือกด ctrl + d อีกครั้งเพื่อออกจากระบบ นอกจากนี้หากคุณพยายามเปิดไฟล์เดียวกันสองครั้งคุณจะได้รับคำเตือนการกู้คืนดังนั้นคุณสามารถกดaเพื่อยกเลิกและเรียกใช้ fg เพื่อกลับไปที่ vi


1
สิ่งนี้อาจทำให้ติดขัดได้หากคุณจมอยู่กับสิ่งที่คุณทำในบรรทัดคำสั่งและลืมว่าคุณมีพื้นหลังเป็นกลุ่ม
Eliot Ball

1
ใช่เป็นไปได้ฉันทำเอง สำหรับฉันมันคุ้มค่าที่จะมีความมั่นคงของเปลือก ฉันจะอัปเดตคำตอบเพื่อนำความคิดเห็นของคุณมาพิจารณา
Rqomey

1
ฉันคิดว่าคุณน่าจะใช้จอ gnu ดีกว่า
user606723

1
ฉันใช้ tmux ด้วยตัวเอง ... แต่เพื่อความเร็วและถ้าลงชื่อเข้าใช้เซิร์ฟเวอร์ที่ไม่มี tmux หรือหน้าจอมันก็มีประโยชน์
Rqomey

11

เมื่อคุณพูดถึง "รับ stdout" โปรดทราบว่าคุณสามารถทำได้

:r! command

และผลลัพธ์ของคำสั่งจะถูกเพิ่มลงในไฟล์หรือ

:<range>!command

เพื่อให้เนื้อหาของช่วงกรองผ่านคำสั่ง [เช่น:1,$!wc]


:%!commandดูมีประโยชน์ทีเดียว
Eliot Ball

ฉันใช้สิ่งนี้บ่อยครั้งสำหรับการเรียงลำดับบรรทัด [เช่น:.,+20 !sort]
วอลเตอร์ A

5

สำนวนที่ฉันต้องการคือ

!!command

ซึ่งจดชวเลข

:.!command

ซึ่งไพพ์บรรทัดปัจจุบันผ่านคำสั่งและแทรกเอาต์พุตลงในไฟล์ กรณีที่พบบ่อยที่สุดสำหรับฉันคือการแก้ไขคำสั่งด้วย vi และเรียกใช้:

!!sh

หรือ

!<motion>command

เช่น (ตัวอย่าง)

!apsh

เพื่อเรียกใช้ย่อหน้าทั้งหมดผ่านเชลล์


2
หมายเหตุสำหรับคุณจะต้องมีการวางตำแหน่งในช่วงเริ่มต้นของย่อหน้าลอง!} !ap(ฉันไม่ทราบว่านี่เป็นในทุก vi หรือเป็นกลุ่มเท่านั้น)
สุ่ม 832

4

ด้วยการใช้เครื่องหมายจุดคู่และเครื่องหมายอัศเจรีย์คุณสามารถเรียกใช้คำสั่งใด ๆ ในเชลล์พา ธ และเชลล์สคริปต์ได้โปรดจำไว้ว่าคำสั่งนั้นทำงานภายใต้ผู้ใช้ที่รันโปรแกรม vi / vim และใช้สภาพแวดล้อมของมัน

:!<command>

เนื่องจาก vi ใช้สภาพแวดล้อมที่มีผลบังคับใช้เมื่อมีการเรียกใช้จึงใช้เส้นทางเดียวกับที่อยู่ในคำสั่งพาเรนต์ โปรดจำไว้ว่าเชลล์บางตัวเก็บแคชของโปรแกรมไว้ในพา ธ และ vi อาจไม่ทำงานกับแคชนี้ (ขึ้นอยู่กับเชลล์ที่ใช้และเป็นเวอร์ชัน) ดังนั้นคุณอาจจบการทำงานด้วยไบนารี่ที่ไม่ถูกต้องในกรณีที่คุณมีมากกว่า มากกว่าหนึ่งไบนารีที่มีชื่อเดียวกัน


4

คุณสามารถเห็นผลลัพธ์ของคำสั่งโดยพิมพ์ตัวอย่างเช่น:!ls -lhในโหมดคำสั่ง

rหากคุณต้องการที่จะแทรกผลลัพธ์ของคำสั่งลงในไฟล์ที่คุณกำลังแก้ไขเพียงเพิ่ม ตัวอย่างเช่น:r!which perl.


1

!เห็นได้ชัดว่าการใช้เป็นคำตอบที่ถูกต้อง แต่หากคุณสลับไปมาบ่อยๆสิ่งที่คล้ายกับหน้าจอหรือ tmux อาจมีประโยชน์เช่นกัน


0

ฉันมีสิ่งนี้ใน. 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>

0

ฉันจะทำอย่างนั้นได้อย่างง่ายดายในลีนุกซ์โดยการเปิดหน้าต่างบรรทัดคำสั่งของเทอร์มินัลสองหน้าต่าง, เรียกใช้ vi ในที่หนึ่งและอีกอันที่มีให้สำหรับงานอื่น ๆ ในเวลาเดียวกัน

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