วิธีการพิมพ์พารามิเตอร์ใน bash console ซ้ำในปัจจุบัน?


23

ฉันแค่พิมพ์บางอย่างตามแนวของ:

mv foo/bar/poit/zoid/narf.txt

และทันใดนั้นเองฉันก็ต้องพิมพ์พารามิเตอร์ส่วนใหญ่อีกครั้ง

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

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

ดังนั้นมีวิธีการคัดลอกวางพารามิเตอร์ปัจจุบันของบรรทัดโดยใช้แป้นพิมพ์หรือไม่


3
คำแนะนำของฉันไม่ตอบคำถามของคุณ แต่เป็นคำแนะนำเล็กน้อย ในตัวอย่างของคุณคุณสามารถใช้สิ่งปลูกสร้างถัดไปmv foo/bar/poit/zoid/{narf.txt,troz.txt}แทนการพิมพ์ / คัดลอกที่อยู่ยาวสองครั้ง
เร่ง

2
สั้นกว่าเล็กน้อย @ mv foo/bar/poit/zoid/{narf,troz}.txtการแก้ปัญหาเร่งด่วนของ: มันใช้งานได้ดีโดยเฉพาะถ้าเรามีสิ่งที่ชอบ.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann

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

คำตอบ:


15

ถ้าผมได้วางแผนไปข้างหน้าผมใช้การขยายตัวรั้ง ในกรณีนี้:

mv foo/bar/poit/zoid/{narf,troz}.txt

นี่เป็นอีกวิธีหนึ่งในการใช้readlineแป้นพิมพ์ลัดเริ่มต้น:

  • mv foo/bar/poit/soid/narf.txt: เริ่ม
  • Ctrl- w: unix-word-ruboutเพื่อลบfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yankพื้นที่yankอีกครั้งที่จะได้รับmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-wordสองครั้งเพื่อลบรายการสุดท้ายnarf.txt
  • troz.txt: พิมพ์ส่วนหางที่แตกต่างกัน

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


เรียบร้อย! ในกรณีของฉันฉันต้องกด Alt + Backspace แทน Meta + Backspace
k0pernikus

3
@ k0pernikus ใช่บนคีย์บอร์ดส่วนใหญ่ปุ่ม Alt คือคีย์ Meta
jw013

1
ในการบันทึกการพิมพ์ดีดครั้งใหม่.txtคุณสามารถกด Ctrl + ซ้าย (หรือทางลัดอื่น ๆ ที่โทรbackward-word) แล้วซ้ายตัวละครตัวหนึ่งแล้ว Alt + Backspace trozและประเภท
wjandrea

24

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

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname

มีประโยชน์มาก! ใช้ได้ดีกับmagic-spaceตัวเลือกของ bash ใน inputrc เพื่อขยายการขยายประวัติโดยอัตโนมัติ (ฉันไม่สามารถใช้คำตอบที่ได้รับคะแนนสูงสุดเพราะฉันได้ตั้งค่า ^ W เพื่อหยุดที่เครื่องหมายทับเนื่องจากปกติแล้วจะมีประโยชน์มากกว่า)
Soren Bjornstad

@SorenBjornstad alt+backspaceโดยปกติแล้วจะหยุดที่ตัวคั่นคำเช่นเครื่องหมายทับดังนั้นคุณไม่จำเป็นต้องเปลี่ยนวิธี^Wการใช้งานฟังก์ชั่นนั้นคุณสามารถลบทั้งคำที่ไม่ใช่ตัวอักษรหรือคำที่คั่นด้วยช่องว่าง
Eric Renouf

14

ในตัวอย่างของคุณคุณสามารถใช้สิ่งก่อสร้างต่อไป:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

หรือแม้กระทั่ง (ตามที่แนะนำAnsgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

แทนที่จะพิมพ์ / คัดลอกที่อยู่ยาวสองครั้งแทน


2
นี้เรียกว่าการขยายตัวรั้ง
CodeGnome

6

เล่นรอบฉันได้งานนี้:

mv foo/bar/poit/zoid/narf.txt

กดEnter
เพื่อจัดเก็บพารามิเตอร์สุดท้าย

ตอนนี้ใช้เพื่อรับการพิมพ์ครั้งล่าสุดในบรรทัดกลับ ป้อนช่องว่างและเพื่อใช้พารามิเตอร์ที่ใช้ล่าสุด:

Alt + .

ฉันเกลียดการยั่วยุข้อผิดพลาด แต่มันทำให้งานเสร็จสิ้นในกรณีใช้


เด็ดอีกเคล็ดลับที่ดีเรียนรู้!
Bram

<kbd> Esc </kbd> + <kbd>. </kbd> คือ (มัน?) เหมือนกับ <kbd> Alt </kbd> + <kbd>. </kbd>
Nikos Alexandris

2

คุณสามารถใช้ตัวแปรได้ง่าย:

a=test.csv ; cp $a $a.bak

หรือในกรณีที่คุณ (การแข่งขันแท็บบันทึกการทำงานสำหรับบางส่วน):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt

2

ฉันมีสิ่งนี้ใน~/.inputrc:

"\ej":"!#:$\e^"

!#เป็นบรรทัดปัจจุบัน:$เป็นคำสุดท้ายและเป็น\e^history-expand-line


ควรทำเครื่องหมายเป็นคำตอบ กด 'alt / option + j' ตอนนี้คัดลอกคำสุดท้าย
mpprdev

2

สำหรับzshฉันพบว่าการโยงคีย์ดังต่อไปนี้มีประโยชน์

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

ดังนั้นฉันจึงกดAlt- Mเพื่อทำซ้ำอาร์กิวเมนต์สุดท้ายแล้วAlt- Kถ้าฉันต้องการลบส่วนนอกจุดสิ้นสุดของเส้นทาง

นี่คือการอ้างอิงที่มีประโยชน์สำหรับพฤติกรรมบางอย่างที่คุณสามารถจับคู่ได้


2

โซลูชันสองขั้นตอนแบบโต้ตอบสั้น ๆ

  1. พิมพ์: echo foo/bar/poit/zoid/narf.txt

    ทำให้foo/bar/poit/zoid/narf.txtพร้อมใช้งานสำหรับAlt- .ทางลัดใน bash

  2. พิมพ์: mvและตีAlt- ., Space, Alt-.

    mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txtคุณจะได้รับ ตอนนี้คุณสามารถแก้ไขคำสุดท้ายได้อย่างง่ายดาย

ผู้บัญชาการเที่ยงคืน

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

คำแนะนำฉบับย่อ:

  • Up/ Downปุ่มลูกศรเลือกไฟล์ต่าง ๆ ในพาเนลปัจจุบัน
  • Tab สลับระหว่างแผงด้านซ้ายและขวา
  • Ctrl- Shift- Enterคัดลอกไฟล์ที่เลือกในปัจจุบันไปยังบรรทัดคำสั่ง (รวมถึงเส้นทางแบบเต็ม)
  • Alt- oเปิดไดเรกทอรีที่เลือกในปัจจุบันในแผงอื่น ๆ
  • Ctrl- oให้คุณเห็นคอนโซลแบบเต็มหน้าจอ
  • Ctrl- x, pคัดลอกพา ธ ของพาเนลที่ใช้งานอยู่ในคอนโซล
  • Ctrl- x, Ctrl- pคัดลอกพา ธ ของพาเนลที่ไม่ได้ใช้งานลงในคอนโซล
  • Esc- Tabกำลังดำเนินการให้เสร็จสมบูรณ์โดยอัตโนมัติ

นี่เป็นวิธีที่เร็วที่สุดที่ฉันพบจนถึงตอนนี้หลังจากที่ฉันคุ้นเคยกับทางลัดแล้ว


0

ใช้สิ่งเดียวกันใน {,} "โรเนียว" เช่น:

git tag -m {v,v}1.0.1

# same as 

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