Làm thế nào để nhanh chóng lưu trữ và truy cập các lệnh thường được sử dụng?


37

Tôi có rất nhiều lệnh tôi thường xuyên cần thực hiện, thường là với sự thay đổi nhỏ nhất.

Ngay bây giờ tôi đang lưu trữ tất cả chúng vào .bash_historyvà sử dụng CTRL- Rđể truy cập chúng, nhưng tôi tự hỏi liệu có cách nào tốt hơn không. Thứ tôi đang tìm kiếm:

  • Dễ dàng thêm một lệnh mới
  • Dễ dàng tìm kiếm và thực hiện lại lệnh mong muốn
  • Tránh các lệnh không mong muốn trong đề xuất

Thật không may, bash_history không quá mạnh đối với yêu cầu thứ ba: nếu tôi làm một vài cdls, nó sẽ lấp đầy tệp lịch sử một cách nhanh chóng. Gần đây tôi đã biết HIST_SIZEvà bạn có thể định cấu hình lịch sử để tránh trùng lặp hoặc một số lệnh nhất định, nhưng trước khi định cấu hình tất cả, tôi muốn chắc chắn rằng đó là cách tốt nhất.


7
cho các lệnh hàng ngày, aliascó thể hữu ích hơn. ví dụ. alias gfc="git fetch origin"
5

Câu trả lời:


20

Tôi thấy rất hữu ích các lệnh readline sau đây

history-search-backward,
history-search-forward

(lưu ý rằng các khác biệt so với thông thường reverse-search-history, forward-search-history, gắn với Ctrl- R, Ctrl- S).

Tôi có các lệnh này liên quan đến Ctrl- UpCtrl- Downđặt các dòng sau vào ~/.inputrc:

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

Cách chúng hoạt động: viết một vài ký tự bắt đầu của lệnh, nhấn Ctrl- Upvà lệnh cũ hơn tiếp theo bắt đầu bằng tiền tố đó sẽ được hiển thị, nhấn một lần nữa để xem tiếp theo, v.v. Khi bạn hài lòng, sau khi có thể sửa đổi lệnh, nhấn Enterđể thực thi.


1
+1 cho điều này, tôi cũng làm như vậy mặc dù tôi chỉ có chúng bị ràng buộc với các phím Mũi tên Lên và Mũi tên Xuống (không có công cụ sửa đổi CTRL), hoạt động với tôi. Nếu bạn muốn thực hiện tương tự các dòng bạn cần là "\e[B": history-search-forward"\e[A": history-search-backward
Simon Whitaker

Cũng xem xét việc phát triển HISTFILESIZEvà / hoặc HISTSIZE(chỉ hỗ trợ zsh HISTSIZE, bash hỗ trợ cả hai) để đảm bảo bộ đệm của bạn đủ lớn. Câu hỏi SO bash HISTSIZE so với HISTFILESIZE? có thể chiếu sáng hơn nữa.
Adam Katz

56

Một mẹo khác: Đôi khi tôi sử dụng các bình luận để đánh dấu / gắn thẻ một lệnh:

my_command #bookmark

sau đó:

[ctrl-r]#bookmark

thích nó! - tốt đẹp
Greg

17
Bashtags! Thiên tài. :-)
Simon Whitaker

Rất đẹp! Tôi cũng sẽ sử dụng cái này cho mysql-cli của mình :)
Konerak

Thật tuyệt vời! Thật không may, zshell không coi # là bắt đầu nhận xét trong phiên tương tác. Biết một mẹo tương tự cho nó?
Nathan Long

1
@NathanLong : $_bookmark. Có thể lập luận rằng đây là một vụ hack khủng khiếp khai thác thực tế là các biến không tồn tại mở rộng thành không có gì, nhưng nó chắc chắn hoạt động, với lời cảnh báo rằng không gian không được phép (thay vào đó sử dụng _).
kampu

7

Mặc dù phạm vi rất hạn chế, tôi muốn chỉ ra hai trình giữ chỗ mở rộng này:

!! 

là một mở rộng giữ chỗ cho lệnh cuối cùng. Hữu ích nếu bạn quên đặt sudotrước lệnh.

!$ 

lặp lại tham số cuối cùng. Hữu ích nếu bạn muốn lặp lại một lệnh khác vớia/very/long/path/name/you/do/not/want/to/type/again


Vâng, mẹo tuyệt vời ... nếu tôi chỉ nhớ sử dụng chúng :)
Jeach

6

Sử dụng 'bí danh'

alias là một công cụ tuyệt vời cho việc này.

  • Bạn có thể dễ dàng khai báo một dòng trên dòng lệnh sẽ được sử dụng trong phiên shell hiện tại.
  • Nếu bạn sẽ sử dụng nó trong tương lai, bạn có thể thêm nó vào cấu hình shell của mình.

Khi bạn sử dụng bí danh, chính xác như thể bạn đã gõ nó, vì vậy nó khá linh hoạt. Chẳng hạn, bạn có thể sử dụng nó với các đường ống:

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

Bạn sẽ có thể thực hiện "các biến thể nhỏ" bằng cách chuyển bất kỳ cờ nào bạn chưa chỉ định.

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

5

Tôi tạo các kịch bản shell tối thiểu cho các lệnh thường xuyên của mình và đặt cho chúng các tên ngắn. Tất cả đều được lưu trữ ở cùng một nơi, được thêm vào PATH.

Bằng cách đó, tôi có quyền truy cập lối tắt vào các lệnh rất phức tạp và không giống như aliastôi có thể biến các phần có thể thay đổi của tác vụ thành đối số dòng lệnh của phím tắt.


3
Nếu bạn chỉ muốn truyền đối số, hãy xem xét việc xác định hàm thay thế. Nếu bạn cần tập lệnh đầy đủ, đây là một giải pháp tốt :)
Konerak

@Konerak Tôi sẽ phải thử nó. Tôi thường chỉ tạo một kịch bản, nhưng việc xác định các chức năng sẽ sạch hơn rất nhiều, tôi cá là vậy.
ixtmixilix

4

Tôi đang duy trì một bản sao .bash_history trong Git . Để đơn giản hóa điều này, tôi đã thiết lập

# 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

trong .bashrc và các lệnh sau (được sửa đổi để sử dụng chung) trong tập lệnh dọn dẹp

# 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"

mà tôi chạy trước khi thêm dòng vào git gui. Vì tệp lịch sử được sửa đổi với mỗi lệnh, tôi cũng có một lệnh đặc biệt để cập nhật kho lưu trữ cụ thể đó:

git stash && git pull && git stash pop

+1 chủ yếu để đề cập HISTCONTROL=ignorespace, đôi khi rất quan trọng để không làm lộn xộn lịch sử.
quodlibetor

2

Trong số tất cả các câu trả lời khác ở đây liên quan đến lịch sử.

Tôi đặt

HISTFILESIZE=2024
HISTSIZE=1024

trong ~ / .bash_profile

Ngoài các ý kiến ​​khác: lịch sử

Một tính năng hữu ích khác ...

Bắt đầu thu hồi lịch sử với

!first few letters<ESC>Ctrl-E

sẽ nhớ lại lệnh cuối cùng bắt đầu bằng vài chữ cái đầu tiên

ví dụ:

!find<ESC>Ctrl-E

Bạn đã không đề cập đến việc bạn đang sử dụng GUI hay chỉ dòng lệnh. Nếu bạn đang sử dụng GUI, bạn có thể sử dụng một trong những trình quản lý clipboard liên tục để sao chép / dán các lệnh, userids, mật khẩu, url, v.v.


Wow, !find<ESC>CTRL-Ehoạt động, nhưng tôi nghi ngờ tôi sẽ có thể nhớ nó vào ngày mai. ESC CTRL-E đó là gì?
Konerak

chỉ là một ràng buộc với một khóa mở rộng
bsd

0

Học cách sử dụng Ctrl-RCtrl-Scho phép dễ dàng tìm kiếm các lệnh bạn đang tìm kiếm trong lịch sử và bạn đã tìm thấy biến môi trường HISTCONTROL để bỏ qua các bản sao và thay đổi trang web của tệp lịch sử bash.

Tôi thường thực hiện nhiều thao tác Ctrl-Rtheo sau Ctrl-Evà thay đổi một số tham số, nếu tôi bỏ qua một lệnh được tìm thấy bằng cách nhấn Ctrl-Rquá nhiều lần, Ctrl-Sđể giải cứu.


2
Thông thường tty được thiết lập theo cách mà Ctrl-S là chuỗi "dừng" và không (trực tiếp) có sẵn cho tìm kiếm chuyển tiếp.
enzotib

Trong những trường hợp như vậy, tìm kiếm chuyển tiếp có thể được ánh xạ lại thành một cái gì đó ngoài <kbd> Ctrl-S </ kbd>.
Evgeny


0

Ngoài các câu trả lời hay ở trên, nếu bạn tình cờ sử dụng gui dựa trên kde hoặc gnome, thì AutoKey có thể hữu ích đáng kinh ngạc.

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

Nó cho phép bạn tạo các cụm từ được kích hoạt bằng cách nhập một vài ký tự hoặc nhấn phím nóng. Những cụm từ này sau đó được thay thế hoặc thêm vào đầu vào của bạn.

Nó cũng hỗ trợ các tập lệnh được viết bằng python mà bạn có thể thực hiện hầu hết mọi thứ nếu bạn biết python. Tôi chưa biết python, nhưng tôi đã nhận được một số kịch bản rất cơ bản để làm những việc gọn gàng.

Mọi thứ dường như đến từ bàn phím của bạn, vì vậy nó hoạt động với bất kỳ ứng dụng nào chấp nhận nhập bàn phím - và với chính máy tính để bàn của bạn.

Nó có rất nhiều tùy chọn kiểm soát cách thức và nơi những thứ này được kích hoạt, vì vậy bạn có thể có một số chỉ hoạt động trong bảng điều khiển của bạn và những thứ khác chỉ hoạt động trong một cửa sổ khác. Bạn cũng có thể đặt các cụm từ để chạy ngay khi bạn nhập chuỗi kích hoạt chúng hoặc đợi cho đến khi bạn cung cấp cho chúng OK.


0

Giống như những người khác đã nói bí danh là bạn của bạn. Đối với những điều phức tạp hơn một chút (khi bạn cần đối số ở đâu đó giữa hướng dẫn) Tôi sử dụng các hàm trong .zshrc của mình, như:

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

hoạt động như định vị (tôi sử dụng nó khi vì một số lý do db không có sẵn). Hoặc là

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

cho một sự thay thế của killall.


0

Ngoài việc sử dụng Cntl-Rđể nhìn lại .bash_history, tôi cũng có một tệp README trong ~/developthư mục nơi tôi đặt các lệnh dài như cho git/ svn, để tôi có thể quay lại với chúng sau này khi tôi cần. Tương tự, tôi dự định có một ~/install/READMEtệp để đặt tất cả các tên gói phổ biến mà tôi thường cài đặt sau khi cài đặt phiên bản Linux / Ubuntu mới. Vì vậy, ý tưởng là để có một tệp README trong mỗi thư mục, ví dụ Video, Audio, ... và đưa vào đó các lệnh / mẹo phổ biến mà bạn có thể cần biết sau này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.