วิธีการจัดเก็บและเข้าถึงคำสั่งที่ใช้บ่อยอย่างรวดเร็ว?


37

ฉันมีคำสั่งจำนวนมากที่ฉันต้องเรียกใช้งานเป็นประจำบ่อยครั้งที่มีความแปรปรวนน้อยที่สุด

ตอนนี้ฉันกำลังเก็บพวกมันทั้งหมด.bash_historyและใช้CTRL- Rเพื่อเข้าถึงพวกเขา แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้ไหม สิ่งที่ฉันกำลังมองหา:

  • ง่ายต่อการเพิ่มคำสั่งใหม่
  • ง่ายต่อการค้นหาและดำเนินการคำสั่งที่ต้องการอีกครั้ง
  • หลีกเลี่ยงคำสั่งที่ไม่ต้องการในคำแนะนำ

แต่น่าเสียดายที่ Bash_history ไม่เป็นเช่นนั้นที่แข็งแกร่งในความต้องการที่สาม: ถ้าผมทำไม่กี่cdและlsก็เติมแฟ้มประวัติได้อย่างรวดเร็ว ฉันเพิ่งเรียนรู้เกี่ยวกับHIST_SIZEและคุณสามารถกำหนดค่าประวัติเพื่อหลีกเลี่ยงการทำซ้ำหรือคำสั่งบางอย่าง แต่ก่อนที่จะกำหนดค่าทั้งหมดที่ฉันต้องการเพื่อให้แน่ใจว่ามันเป็นวิธีที่ดีที่สุด


7
สำหรับคำสั่งในชีวิตประจำวันaliasอาจมีประโยชน์มากกว่า เช่น. alias gfc="git fetch origin"
หมายเลข

คำตอบ:


20

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

history-search-backward,
history-search-forward

(จะตระหนักถึงพวกเขาจะแตกต่างจากปกติreverse-search-history, forward-search-historyผูกติดอยู่กับCtrl- R, Ctrl- S)

ฉันมีคำสั่งเหล่านี้เชื่อมโยงกับCtrl- UpและCtrl- Downใส่บรรทัดต่อไปนี้ลงใน~/.inputrc:

"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward

วิธีการทำงาน: เขียนตัวอักษรสองสามตัวของการเริ่มต้นคำสั่งกดCtrl- Upและคำสั่งเก่าถัดไปที่เริ่มต้นด้วยคำนำหน้านั้นจะปรากฏขึ้นกดอีกครั้งเพื่อดูถัดไปและอื่น ๆ เมื่อคุณพอใจหลังจากอาจแก้ไขคำสั่งกดEnterเพื่อดำเนินการ


1
+1 สำหรับสิ่งนี้ฉันทำเช่นเดียวกันแม้ว่าฉันเพิ่งจะผูกไว้กับแป้นลูกศรขึ้นและลูกศรลง (ไม่มีตัวแก้ไข CTRL) ซึ่งเหมาะกับฉัน หากคุณต้องการที่จะทำเช่นเดียวกันเส้นที่คุณต้องมี"\e[B": history-search-forwardและ"\e[A": history-search-backward
ไซมอนวิทเทเกอร์

พิจารณาการเพิ่มHISTFILESIZEและ / หรือHISTSIZE(รองรับ zsh เท่านั้นHISTSIZE, bash รองรับทั้งคู่) เพื่อให้แน่ใจว่าบัฟเฟอร์ของคุณมีขนาดใหญ่พอสมควร ดังนั้นคำถามทุบตี HISTSIZE กับ HISTFILESIZE? สามารถส่องสว่างเพิ่มเติม
Adam Katz

56

เคล็ดลับอื่น: บางครั้งฉันใช้ข้อคิดเห็นเพื่อคั่นหน้า / แท็กคำสั่ง:

my_command #bookmark

แล้ว:

[ctrl-r]#bookmark

รักมัน!
เกร็ก

17
Bashtags! อัจฉริยภาพ :-)
Simon Whitaker

ดีมาก! ฉันจะใช้สิ่งนี้กับ mysql-cli ของฉันด้วย :)
Konerak

ยอดเยี่ยมมาก! น่าเสียดายที่ zshell ไม่ถือว่า # เป็นจุดเริ่มต้นของความคิดเห็นในเซสชันแบบโต้ตอบ รู้เคล็ดลับที่คล้ายกันหรือไม่
Nathan Long

1
$_bookmark@NathanLong: อาจเป็นที่ถกเถียงกันอยู่ว่านี่เป็นแฮ็คที่น่ากลัวที่ใช้ประโยชน์จากความจริงที่ว่าตัวแปรที่ไม่มีอยู่ขยายตัวออกไปเป็นอะไร แต่มันก็ใช้ได้ผลแน่นอนกับข้อแม้ที่ไม่อนุญาตให้เว้นวรรค (ใช้ _ แทน)
kampu

7

แม้ว่าจะมีขอบเขตที่ จำกัด มาก แต่ฉันต้องการจะชี้ให้เห็นถึงตัวแทนที่ขยายได้สองรายการนี้:

!! 

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

!$ 

ทำซ้ำพารามิเตอร์สุดท้าย มีประโยชน์หากคุณต้องการทำซ้ำคำสั่งอื่นด้วยa/very/long/path/name/you/do/not/want/to/type/again


ใช่เคล็ดลับที่ดี ... ถ้าเพียง แต่ผมจำได้จะใช้พวกเขา :)
Jeach

6

ใช้ 'นามแฝง'

alias เป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้

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

เมื่อคุณใช้นามแฝงมันเหมือนกับว่าคุณพิมพ์มันดังนั้นมันจึงค่อนข้างยืดหยุ่น ตัวอย่างเช่นคุณสามารถใช้กับท่อ:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

คุณควรสามารถ "เปลี่ยนแปลงเล็กน้อย" โดยผ่านการตั้งค่าสถานะใด ๆ ที่คุณไม่ได้ระบุ

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches

5

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

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


3
หากคุณต้องการส่งอาร์กิวเมนต์ให้พิจารณากำหนดฟังก์ชั่นแทน หากคุณต้องการสคริปต์นี้เป็นทางออกที่ดี :)
Konerak

@ Konerak ฉันจะต้องลองดู ฉันมักจะเขียนสคริปต์ แต่การกำหนดฟังก์ชั่นน่าจะสะอาดกว่านี้ฉันพนันได้เลย
ixtmixilix

4

ฉันยังคงรักษาสำเนาของ.bash_history ใน Git เพื่อลดความซับซ้อนนี้ฉันได้ตั้ง

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

ใน. bashrcและคำสั่งต่อไปนี้ (แก้ไขเพื่อการใช้งานทั่วไป) ในสคริปต์การล้างข้อมูล

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

git guiซึ่งผมทำงานก่อนที่จะเพิ่มเส้นใน เนื่องจากไฟล์ประวัติถูกแก้ไขด้วยทุกคำสั่งฉันยังมีคำสั่งพิเศษเพื่ออัปเดตที่เก็บเฉพาะนั้น:

git stash && git pull && git stash pop

+1 เป็นหลักสำหรับการกล่าวถึงHISTCONTROL=ignorespaceซึ่งเป็นสิ่งสำคัญที่ไม่ทำให้ยุ่งเหยิงในประวัติศาสตร์บางครั้ง
quodlibetor

2

ในบรรดาคำตอบอื่น ๆ ทั้งหมดที่นี่เกี่ยวข้องกับประวัติศาสตร์

ฉันตั้ง

HISTFILESIZE=2024
HISTSIZE=1024

ใน ~ / .bash_profile

นอกเหนือจากความคิดเห็นอื่น ๆ อีกครั้ง: ประวัติ

อีกคุณสมบัติที่มีประโยชน์ ...

เริ่มต้นด้วยการเรียกคืนประวัติด้วย

!first few letters<ESC>Ctrl-E

จะจำคำสั่งสุดท้ายที่เริ่มต้นด้วยตัวอักษรสองสามตัวแรก

เช่น:

!find<ESC>Ctrl-E

คุณไม่ได้พูดถึงว่าคุณใช้ GUI หรือบรรทัดคำสั่งเท่านั้นหรือไม่ หากคุณใช้ GUI คุณสามารถใช้หนึ่งในผู้จัดการคลิปบอร์ดถาวรเพื่อคัดลอก / วางคำสั่งที่ใช้บ่อยรหัสผู้ใช้รหัสผ่าน URL และอื่น ๆ


ว้าว!find<ESC>CTRL-Eทำงานได้ แต่ฉันสงสัยว่าฉันจะจำได้ในวันพรุ่งนี้ ESC CTRL-E นั้นคืออะไร
Konerak

เป็นเพียงการเชื่อมโยงกับคีย์เพิ่มเติม
bsd

0

เรียนรู้ที่จะใช้Ctrl-RและCtrl-Sอนุญาตให้ค้นหาคำสั่งที่คุณกำลังค้นหาได้อย่างง่ายดายในประวัติและคุณพบตัวแปรสภาพแวดล้อม HISTCONTROL แล้วเพื่อละเว้นรายการที่ซ้ำกันและเปลี่ยนไซต์ของไฟล์ประวัติ bash

ฉันมักจะทำCtrl-RตามมากCtrl-Eและเปลี่ยนพารามิเตอร์บางอย่างถ้าฉันข้ามคำสั่งที่พบโดยการกดปุ่มCtrl-Rหนึ่งครั้งเกินไปCtrl-Sเพื่อช่วยเหลือ


2
บ่อยครั้งที่ tty ถูกตั้งค่าในลักษณะที่ Ctrl-S เป็นลำดับ "หยุด" และไม่ (โดยตรง) พร้อมใช้งานสำหรับการค้นหาไปข้างหน้า
enzotib

ในกรณีเช่นนี้การค้นหาไปข้างหน้าสามารถแมปไปยังสิ่งอื่นที่ไม่ใช่ <kbd> Ctrl-S </kbd>
Evgeny


0

นอกจากคำตอบที่ดีข้างต้นหากคุณใช้ gui จาก kde หรือ gnome AutoKey จะมีประโยชน์อย่างน่าอัศจรรย์

https://code.google.com/p/autokey/

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

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

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

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


0

เช่นเดียวกับคนอื่น ๆ ได้กล่าวนามแฝงว่าเป็นเพื่อนของคุณ สำหรับสิ่งที่ซับซ้อนกว่าเล็กน้อย (เมื่อคุณต้องการมีข้อโต้แย้งระหว่างการสอน) ฉันใช้ฟังก์ชั่นใน. zshrc ของฉันเช่น:

function ff() { find . -iname "*$**" }

ที่ทำงานเหมือนค้นหา (ฉันใช้มันเมื่อด้วยเหตุผลบางอย่าง db ไม่สามารถใช้ได้) หรือ

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

เพื่อทดแทน killall


0

นอกเหนือจากการใช้Cntl-Rในการมองย้อนกลับไป.bash_historyฉันยังมีไฟล์ README ใน~/developไดเรกทอรีที่ฉันใส่คำสั่งแบบยาวสำหรับgit/ svnดังนั้นฉันสามารถกลับมาหาพวกเขาได้ในภายหลังเมื่อฉันต้องการ ในทำนองเดียวกันฉันวางแผนที่จะมี~/install/READMEไฟล์ที่จะใส่ชื่อแพ็คเกจทั้งหมดที่ฉันมักจะติดตั้งหลังจากติดตั้ง Linux / Ubuntu เวอร์ชันใหม่ ดังนั้นความคิดคือการมีไฟล์ README ในทุกไดเรกทอรีเช่นวิดีโอ, เสียง, ... และใส่คำสั่ง / เคล็ดลับทั่วไปไว้ในนั้นเพื่อที่คุณอาจจำเป็นต้องรู้ในภายหลัง

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