เรียกใช้เชลล์ย่อยจากตรงกลางของคำสั่งปัจจุบัน


16

ฉันพบตัวเองบ่อยครั้งในสถานการณ์นี้ ฉันกำลังพิมพ์คำสั่งและฉันต้องตรวจสอบอย่างอื่นก่อนที่จะทำให้เสร็จ

มีวิธีการเปิด subshell บางอย่างของการป้อนข้อมูลปัจจุบันของฉันจนถูกจำได้แล้วเมื่อฉันออกจาก subshell นี้ฉันกลับไปที่ที่ฉันเคย?

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

ฉันกำลังใช้ zsh


2
ทำไมไม่เพียงเปิดหน้าต่างเทอร์มินัลอื่น
Barmar

@ บาร์มาร์สำหรับฉันฉันไม่ได้ใช้ GUI บนระบบ Linux ส่วนใหญ่ของฉันดังนั้นฉันจะต้องเปลี่ยน TTY ซึ่งหมายความว่าฉันต้องรับรองความถูกต้องอีกครั้ง ตัวเลือกด้านล่างมีประสิทธิภาพมากขึ้น
Zachary Brady

3
คุณสามารถใช้screenหรือtmuxเพื่อรับเทอร์มินัลเสมือนหลายตัวบนคอนโซล
Barmar

คำตอบ:


16

มีคีย์ผสมEscQที่บันทึกบัฟเฟอร์คำสั่งและอนุญาตให้ป้อนคำสั่งใหม่ หลังจากรันคำสั่งบัฟเฟอร์จะมีสิ่งที่คุณพิมพ์มาก่อน หากคุณต้องเรียกใช้คำสั่งอื่นก่อนที่จะเสร็จสิ้นคุณสามารถพิมพ์EscQอีกครั้ง

(ฉันไม่ได้พยายามเปิด subshell หลังจากกดEscQ)

ดูhttp://zsh.sourceforge.net/Intro/intro_10.htmlและค้นหา "esc-q"


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

19

ฉันมักจะใช้Ctrl+ Uซึ่งจะลบบรรทัดปัจจุบันและบันทึกลงในบัฟเฟอร์ mylongcommandจากนั้นฉันทำในสิ่งที่เคยเป็นผมต้องก่อน จากนั้นเมื่อฉันพร้อมฉันใช้Ctrl+ Yเพื่อวางmylongcommandกลับในพรอมต์ของฉัน

จำคำสั่งแบบครึ่งหนึ่งขณะที่ฉันตรวจสอบบางอย่าง


7

วิธีการแก้ปัญหาของฉันในเรื่องนี้ค่อนข้างต่ำเทคโนโลยีและ clunky แต่อาศัยลำดับสำคัญที่คุณอาจคุ้นเคยกับ: Ctrl + Aแล้วแล้ว#ENTER

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


คุณควรกดปุ่ม "บ้าน" บนแป้นพิมพ์ของคุณจะช่วยประหยัด 1 ปุ่มกดและพลังงานที่จำเป็นในการกดจริง
Ferrybig

@Ferrybig - ใช่มันดี แต่สำหรับแป้นพิมพ์ประจำวันของฉันคือ MacBook Pro ซึ่งไม่มีปุ่มหน้าแรก หน้าแรกเทียบเท่าFN + ลูกศรซ้ายแต่ที่เลื่อนขึ้นไปด้านบนของเครื่อง
บาดเจ็บทางดิจิตอล

2

ฉันพิมพ์Ctrl+ Zเพื่อ“ ระงับ” คำสั่งที่ฉันพิมพ์และพิมพ์คำสั่งอื่น หลังจากที่ฉันเรียกใช้คำสั่งนั้น (หรือยกเลิกด้วยCtrl+ C) คำสั่งที่ถูกระงับจะกลับมาอีกครั้งสำหรับรุ่น (แม้จะจำตำแหน่งเคอร์เซอร์) เพื่อความสะดวกเพิ่มเติมหากบรรทัดคำสั่งว่างเปล่าเมื่อฉันพิมพ์Ctrl+ Zคีย์จะเรียกใช้bgบิวด์อินแทน (ดังนั้น double Ctrl+ Zจะส่งคำสั่งที่รันโดยตรงไปยังพื้นหลัง)

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(โพสต์ก่อนหน้านี้ที่จำคำสั่งครึ่งพิมพ์ในขณะที่ฉันตรวจสอบบางสิ่งบางอย่างซึ่งส่วนใหญ่มีโซลูชั่นสำหรับทุบตีที่คุณไม่สามารถทำอะไรได้สะดวกนี่คือรุ่นผูกพันของบิวด์อินเล็กน้อยM-qการpush-line .)

สิ่งนี้ไม่ได้เรียกใช้เชลล์ย่อย: คำสั่งที่คุณพิมพ์หลังจาก“ หยุดชั่วคราว” คำสั่งก่อนหน้านี้จะรันในเชลล์เดียวกัน สิ่งนี้จะช่วยให้คุณทำสิ่งต่าง ๆ เช่นการเปลี่ยนไดเรกทอรีปัจจุบันถ้าคุณรู้หลังจากพิมพ์คำสั่งที่คุณต้องการเรียกใช้ในไดเรกทอรีอื่น หากคุณต้องการเรียกใช้อินสแตนซ์เชลล์ใหม่คุณสามารถเรียกใช้zshจากการเชื่อมโยงคีย์ แต่ฉันไม่คิดว่ามันมีประโยชน์เป็นพิเศษ

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