ฉันจะแก้ไขคำสั่งเชลล์ปัจจุบันโดยไม่ต้องดำเนินการได้อย่างไร


13

ดูเหมือนว่าจะมีข้อมูลจำนวนมากเกี่ยวกับวิธีการแก้ไขและดำเนินการคำสั่งโดยใช้โปรแกรมแก้ไขของคุณโดยใช้ "edit-and-execute-command (Cx Ce)" แต่สิ่งที่ฉันต้องการบรรลุคือใช้คำสั่งเชลล์ปัจจุบันใช้ การกรองบางอย่าง (ใช้สคริปต์) จากนั้นส่งคืนเพื่อให้พร้อมท์เพื่อขออนุมัติ / เปลี่ยนแปลงด้วยตนเองก่อนดำเนินการ เป็นไปได้ด้วยการทุบตี?


นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม แต่ลองใช้เทอร์มินัลZSHแทน Native Bash มีการทำให้สมบูรณ์อัตโนมัติดังนั้นอย่าเรียกใช้คำสั่งทันที edit-and-execute-commandฉันได้พยายามส่วนตัวสถานการณ์นี้โดยเฉพาะและมันก็ต้องการให้ฉันกดทุกครั้งที่ผมทำ
Praveen Premaratne

1
ทางลัดที่ใช้งานได้สำหรับฉันคือEscape+ Vแต่มันจะยังคงรันคำสั่ง เพื่อแก้ไขปัญหาฉันจะเพิ่มechoด้านหน้าเพื่อดำเนินการโดยพิมพ์คำสั่งไปยังคอนโซลเพื่อตรวจสอบ
kenorb

2
คุณช่วยยกตัวอย่างที่เป็นรูปธรรมได้ไหม ฉันไม่เข้าใจ "ใช้การกรองบางอย่าง (ใช้สคริปต์) จากนั้นส่งคืนเพื่อแจ้งให้"
Kent

3
@PraveenPremaratne: zsh ไม่ได้เป็นขั้วมันของเปลือก
Arkadiusz Drabczyk

คำตอบ:


7

อัพเดทล่าสุดเกี่ยวกับประสบการณ์ของฉัน

ส่วนหนึ่ง0"+y$ddในการทำแผนที่ต่อไปนี้เป็นสิ่งที่คุณควรพิจารณาอย่างรอบคอบและปรับให้เข้ากับรสนิยม / เวิร์กโฟลว์ / ประสบการณ์ของคุณ

ยกตัวอย่างเช่นบ่อยครั้งที่ฉันพบว่าตัวเองลงท้ายด้วยหลายบรรทัดในบัฟเฟอร์ที่ฉันเพียงต้องการเรียกใช้เคอร์เซอร์ที่เปิดอยู่ ในกรณีนี้ผมสามารถใช้แทน0"+y$dd:%d<CR>0"+y$dd

และนี่เป็นเพียงหนึ่งในสถานการณ์ที่เป็นไปได้

คำตอบสุดท้ายสำหรับผู้ที่ชอบ vim

คำตอบเดิม

ฉันมักจะต้องทำเช่นเดียวกันและฉันทำมันดังต่อไปนี้ (ปกติฉันใช้set -o viอินbashดังนั้นคะแนน 1 และ 2 ในต่อไปนี้จะแตกต่างกันถ้าคุณใช้set -o emacsค่าเริ่มต้นตามคำถามของคุณดูเหมือนว่าจุด 1 และ 2 จะรวมเป็นหนึ่งในCtrl+ xตามด้วยCtrl+ eซึ่งยากต่อการพิมพ์ imho .)

  1. ตีEscapeให้อยู่ในโหมดปกติ
  2. กดปุ่มvเพื่อเข้าสู่ตัวแก้ไขเพื่อแก้ไขคำสั่ง
  3. แก้ไขคำสั่งตามที่ฉันชอบ

(นี่คือที่ที่คุณถามคำถาม)

  1. ตีEscape0"+y$dd:wq,
    • หมายเหตุ: 0"+y$ไม่ใช่เพียงแค่"+yyตอนหลังจะคัดลอกบรรทัดใหม่ด้วยและสิ่งนี้จะส่งผลในการดำเนินการคำสั่งเมื่อวางมันในบรรทัดคำสั่ง
  2. วางคลิปบอร์ดบนบรรทัดคำสั่ง
    • วิธีการทำเช่นนี้ขึ้นอยู่กับเทอร์มินัลที่คุณใช้ฉันเดา ผมตีCtrl+ Alt+ ในvURxvt
  3. ดำเนินการอนุมัติ / แก้ไขด้วยตนเอง

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

ปรับปรุง

ในฐานะที่เป็นของฉันEDITOR(และVISUAL) มีค่าเท่ากับเมื่อฉันแก้ไขคำสั่งฉันแก้ไขในvimvim

ในแง่นี้ฉันได้สังเกตเห็นว่าบัฟเฟอร์ตั้งชื่อ/tmp/bash-fc.randomโดยที่randomเป็นสตริงสุ่มตัวอักษรและตัวเลข 6 ตัว

นี้จะช่วยให้พื้นที่จำนวนมาก possiblities ถ้าคุณใช้vimเป็นบรรณาธิการของคุณที่คุณสามารถกำหนดการทำแผนที่ของคุณบางอย่างในการดำเนินการทั้งลำดับ.vimrc Escape0"+y$dd:wqตัวอย่างเช่นคำสั่งเดียวที่คุณไม่ค่อยใช้เมื่อแก้ไขบรรทัดคำสั่งคือLeaderd; ดังนั้นคุณสามารถใส่mapping ต่อไปนี้ใน.vimrcไฟล์ของคุณ

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

ดังนั้นขั้นตอนที่ 4 ในสูตรด้านบนจึงกลายเป็น

  1. ตี EscapeLeaderd

สำหรับฉันนี่เป็นวิธีที่ดีที่สุดในการแก้ไขคำสั่ง
A.Villegas

2

ไม่สามารถทำได้ใน Bash / readline แต่เป็นไปได้ใน zsh โดยใช้edit-command-lineคำสั่ง:

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

ตอนนี้กดControl- x Control- eเพื่อเปิดโปรแกรมแก้ไข, แก้ไขบรรทัด, ออกจากโปรแกรมแก้ไข - คุณจะเห็นบรรทัดคำสั่งที่ได้รับการอัพเดท แต่มันจะไม่ถูกดำเนินการโดยอัตโนมัติ


1

ตอนนี้ที่ผมคิดเกี่ยวกับมันอาจจะเป็นรูปแบบของสิ่งที่ @kenorb ปัญหาในความคิดเห็นเป็นวิธีแก้ปัญหาที่ดีที่สุด (ที่ดูเหมือนว่าไม่มีวิธีแก้ปัญหา) bashถ้าเราต้องการที่จะติด

สิ่งที่คุณสามารถทำได้คือย่อหน้า#(แสดงความคิดเห็นตัวละครในbash) echoกับคำสั่งมากกว่า จากนั้นเมื่อคุณออกจากผู้ตรวจสอบคำสั่งจะไม่มีประสิทธิภาพและคุณจะต้องกดarrow up(หรือkหากคุณใช้set -o vi) ให้ลบ#และยืนยัน

โปรดทราบว่ากลยุทธ์นี้เพิ่มการกดแป้นพิมพ์เพียงไม่กี่ครั้งดังนั้นจึงสามารถมีประสิทธิภาพพอสมควรขึ้นอยู่กับระดับการพิมพ์ของคุณ


1

ชิ้นส่วนเหล่านี้อาจทำให้คุณเข้าใกล้:

a) แทนที่การเชื่อมปกติสำหรับ newline newline (ctrl-M) bind -x '"\C-M":date"

b) คว้าบรรทัดปัจจุบันจากการใช้ประวัติ !#

แทนที่วันที่ด้วยสคริปต์ที่คุณต้องการ

c) แก้ไขด้วยตนเอง

d) หากจำเป็นให้ผูก!!:pที่พิมพ์คำสั่งใหม่ไปยังบรรทัดคำสั่งอย่างใดอย่างหนึ่งแต่ไม่ได้ดำเนินการดังนั้นให้คุณแก้ไขด้วยตนเอง

e) ใช้ ctrl-J ส่งคำสั่งแก้ไขแทนการขึ้นบรรทัดใหม่

หรือพวกเขาอาจจะไม่ ....


1

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

  1. เปิดใช้งานตัวเลือก histverify เพื่อป้องกันการดำเนินการของคำสั่งแก้ไข
  2. ใช้เชนตัวดัดแปลงเพื่อเปลี่ยนคำสั่งสุดท้าย
  3. ใช้ "!!" เพื่อใส่ผลลัพธ์ของคุณในบรรทัดคำสั่งสำหรับการแก้ไขขั้นสุดท้าย

นี่คือลักษณะ:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

ฉันอยากจะนำคุณไปสู่กรอบความสงบนิ่งของ Bash (ฉันไม่ได้มีส่วนเกี่ยวข้องกับมัน): https://github.com/erichs/composure

มันให้draftและreviseฟังก์ชั่นที่ดูเหมือนว่าพวกเขาสามารถช่วยในสิ่งที่คุณพยายามจะทำ นี่คือคำพูด (ยาว) จากไฟล์ readme ของโครงการ:

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

ร่างก่อนถามคำถามในภายหลัง

เมื่อคุณสร้างอัญมณีของคำสั่งแล้วอย่าโยนมันทิ้ง! ใช้ draft ()และตั้งชื่อให้ดี นี้เก็บคำสั่งสุดท้ายของคุณเป็นฟังก์ชั่นที่คุณสามารถนำมาใช้ใหม่ในภายหลัง คิดเหมือนร่างคร่าวๆ

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

แก้ไขทบทวนแก้ไข!

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

  • ฟังก์ชั่นพูดคุยกับพารามิเตอร์อินพุต
  • เพิ่มหรือลบฟังก์ชั่น
  • เพิ่มข้อมูลเมตาที่รองรับสำหรับเอกสาร

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

ดูเหมือนจะไม่สามารถทำได้ด้วยแป้นพิมพ์ลัดอย่างน้อย:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.