Bí quyết dòng lệnh yêu thích nhất của bạn khi sử dụng Bash là gì? [đóng cửa]


156

Chúng ta đều biết cách sử dụng <ctrl>-Rđể đảo ngược tìm kiếm trong lịch sử, nhưng bạn có biết bạn có thể sử dụng <ctrl>-Sđể chuyển tiếp tìm kiếm nếu bạn đặt stty stop ""không? Ngoài ra, bạn đã bao giờ thử chạy bind -p để xem tất cả các phím tắt được liệt kê chưa? Có hơn 455 trên Mac OS X theo mặc định.

Thủ thuật tối nghĩa yêu thích nhất của bạn, lối tắt bàn phím hoặc cấu hình shopt bằng bash là gì?


2
Vui lòng điều chỉnh lại để nói "Yêu thích nhất của bạn là gì". Điều này cho phép mọi người bỏ phiếu trả lời cụ thể, gần giống như một cuộc thăm dò.
SCdF

> Vui lòng điều chỉnh lại để nói "Yêu thích nhất của bạn là gì". Làm xong.
Martin Klinke

1
Có một bản sao StackOverflow cho câu hỏi rất này: commandlinefu.com
RKB

Chỉ 232 trong số 45 ràng buộc khóa mặc định đó làm một cái gì đó ngoài "tự chèn" ("gõ khóa này"): $ bind -p | grep -v tự chèn | wc
Ed Brannin

Một số thứ gọn gàng ở đây. Nhưng cần lưu ý rằng một vài trong số chúng chỉ hoạt động khi bash ở chế độ emacs ...
Mo.

Câu trả lời:


157

Đổi tên / di chuyển tệp với hậu tố một cách nhanh chóng:
cp /home/foo/realllylongname.cpp{,-old}

Điều này mở rộng đến:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


12
Tuyệt vời! Bây giờ tôi cần phải cố gắng và nhớ điều này.
Jon Ericson

9
Chỉ cần chỉ ra rằng để làm điều ngược lại (đi từ .cpp-old sang .cpp), bạn sẽ làm cp
/home/foo/realllylongname.cpp đũa-old

Quá rõ ràng khi nhìn lại, nhưng tôi không nghĩ rằng tôi nên tự mình làm điều đó. Cảm ơn!
Zecc

150
cd -

Đó là dòng lệnh tương đương với nút quay lại (đưa bạn đến thư mục trước đó bạn đang ở).


6
Tôi thích sử dụng pushdpopdđể duy trì một ngăn xếp thư mục, bản thân mình.
Alex M

21
Nhưng 'cd -' có lợi thế hoạt động ngay cả khi bạn không nhớ sử dụng Pushd.
Sergio Acosta

10
Điều đáng nói là 'cd' sẽ đưa bạn đến thư mục chính của bạn.
dr-jan

Thật thú vị khi điều này không xuất hiện trong man cdhoặc, cd --help(ít nhất là của tôi).
Halil zgür

135

Yêu thích khác:

!!

Lặp lại lệnh cuối cùng của bạn. Hữu ích nhất trong các hình thức:

sudo !!

81
nó có thêm lợi ích làm cho bạn có vẻ thực sự tức giận về nó. "Máy tính, làm cái này." "Truy cập bị từ chối". "LÀM ĐI!!"
nickf

Điều đó không được biết đến nhiều! :-)
hoyhoy

10
Những điều tương tự bạn có thể làm: mkdir testdir; cd !$.. Điều này chạy cd [last word of previous line](trong ví dụ, cd testdir)
dbr

13
Làm cho tôi một bánh sandwich Sudo !!
Kibbee

Nếu bạn thích !!,! $ Và! -1: ^ foo ^, bạn cũng sẽ "liên kết Không gian: không gian ma thuật". stackoverflow.com/questions/603696/ Mạnh
Yoo

81

Yêu thích của tôi là '^ chuỗi ^ string2', nhận lệnh cuối cùng, thay thế chuỗi bằng chuỗi2 và thực thi nó

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Hướng dẫn lịch sử dòng lệnh Bash


Điều này là không tham lam. Làm thế nào để tôi làm cho nó tham lam?
Altreus

9
!!:gs/ehco/echo/
andre-r

Trang thứ 2 của hướng dẫn đó rất cần thiết
jmoz

1
@ andre-r: !!:gs/ehco/echo/thực hiện tìm kiếm toàn cầu và thay thế trên lệnh cuối cùng (trao đổi !!trong stackoverflow.com/questions/68372/ trộm ). Điều đó không tương đương với việc ^ehco^echochỉ thay thế một trường hợp của "ehco" - một phản hồi chính xác hơn sẽ là !!:s/ehco/scho.
Iceland_jack

64

đổi tên

Thí dụ:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

Rất hữu ích


3
Wow, tôi đã là một kẻ ngốc trong suốt những năm qua bằng cách sử dụng các thủ thuật basename, mv và {} để làm điều này. / trán.
Gregg Lind

7
đổi tên không phải là bash / readline cụ thể như các bài viết khác.
súng

1
zmv từ phân phối zsh tốt hơn nhiều trong hầu hết các trường hợp.
ZyX

produc-linux-ng cũng có lệnh đổi tên và nó không giống như lệnh được đề cập trong câu trả lời này. Lệnh được mô tả ở đây là mmv .
Cristian Ciupitu

60

Tôi là một fan hâm mộ của !$, !^và các bản !*mở rộng, trở về, từ dòng lệnh được gửi gần đây nhất: mục cuối cùng, mục không lệnh đầu tiên và tất cả các mục không phải lệnh. To wit (Lưu ý rằng shell in ra lệnh trước):

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

Điều này có ích khi bạn, nói ls filea filebvà muốn chỉnh sửa một trong số chúng: vi !$hoặc cả hai : vimdiff !*. Nó cũng có thể được khái quát thành " nđối số thứ" như vậy:

$ echo foo bar baz
$ echo !:2
echo bar
bar

Cuối cùng, với tên đường dẫn, bạn có thể nhận được các phần của đường dẫn bằng cách nối thêm :h:tvào bất kỳ bản mở rộng nào ở trên:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

'echo !! 2' không hoạt động với tôi và từ một bài đăng sau tôi đã thấy rằng tôi nghĩ nó phải là: 'echo !: 2'
user13060

8
thêm "liên kết không gian: ma thuật-không gian" vào .bashrc và bất kỳ! kết hợp sẽ được tự động mở rộng khi bạn nhấn vào không gian.
Yoo

47

Khi chạy các lệnh, đôi khi tôi sẽ muốn chạy một lệnh với các đối số trước đó. Để làm điều đó, bạn có thể sử dụng phím tắt này:

$ mkdir /tmp/new
$ cd !!:*

Thỉnh thoảng, thay vì sử dụng find, tôi sẽ thoát ra một vòng lặp một dòng nếu tôi cần chạy một loạt các lệnh trên danh sách các tệp.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

Cấu hình các tùy chọn lịch sử dòng lệnh trong .bash_login (hoặc .bashrc) của tôi thực sự hữu ích. Sau đây là một loạt các cài đặt mà tôi sử dụng trên Macbook Pro.

Cài đặt sau đây giúp bash xóa các lệnh trùng lặp trong lịch sử của bạn:

export HISTCONTROL="erasedups:ignoreboth"

Tôi cũng kích thước lịch sử của tôi lên khá cao quá. Tại sao không? Nó dường như không làm chậm bất cứ điều gì trên bộ vi xử lý ngày nay.

export HISTFILESIZE=500000
export HISTSIZE=100000

Một điều khác mà tôi làm là bỏ qua một số lệnh từ lịch sử của tôi. Không cần phải nhớ lệnh thoát.

export HISTIGNORE="&:[ ]*:exit"

Bạn chắc chắn muốn thiết lập histappend. Nếu không, bash sẽ ghi đè lên lịch sử của bạn khi bạn thoát.

shopt -s histappend

Một tùy chọn khác mà tôi sử dụng là cmdhist. Điều này cho phép bạn lưu các lệnh nhiều dòng vào lịch sử dưới dạng một lệnh.

shopt -s cmdhist

Cuối cùng, trên Mac OS X (nếu bạn không sử dụng chế độ vi), bạn sẽ muốn đặt lại <CTRL> -S khỏi bị dừng cuộn. Điều này ngăn bash có thể diễn giải nó như là tìm kiếm phía trước.

stty stop ""

6
Tôi tìm thấy "Alt-." tốt hơn nhiều so với "!!: *" khi lặp lại từ cuối cùng của lệnh cuối cùng.
Weidenrinde

Bổ sung cho histroy: 1. thường xuyên lưu lịch sử (với -a nếu bạn mở nhiều shell cùng một lúc) xuất PROMPT_COMMAND = "history -a" 2. Bí danh để đọc lịch sử từ các shell khác. bí danh - h = 'history -n; lịch sử | grep '
Weidenrinde

export HISTIGNORE = "[] *" là không cần thiết, vì HISTCONTROL = ignboth của bạn cũng sẽ làm như vậy
Weidenrinde

Một điều thú vị khác cho lịch sử: xuất HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde

Để lưu một vài tổ hợp phím khỏi "cd !!: *", hãy thử "cd! $". "! $" Sẽ được hiểu là đối số cuối cùng của lệnh cuối cùng của bạn.
Tim Stewart

43

Làm thế nào để liệt kê chỉ các thư mục con trong hiện tại?

ls -d */

Đó là một mẹo đơn giản, nhưng bạn sẽ không biết tôi cần bao nhiêu thời gian để tìm ra nó!


2
Thông minh! Tất cả những năm này, điều tốt nhất tôi có thể nghĩ ra là alias lsd='ls -F | grep --color /', nó sẽ liệt kê những điều tương tự nhưng theo một cách khập khiễng hơn. Tuy nhiên, nó sẽ liệt kê một dir trên mỗi dòng, để dễ phân tích cú pháp. Tôi đã sửa đổi lệnh của bạn để làm điều tương tự:ls -d1 */
Artem Russakovskii

Cái này hoạt động ra sao? "ls -d" chỉ liệt kê. (thật kỳ lạ) nhưng "ls -d * /" hoạt động.
Yoo

1
Có một chút khó khăn ... "ls -d" tương tự như "ls -d ./" và "ls -d /" thành "ls -d ./*/". Công tắc '-d' set 'ls' tu chỉ liệt kê các mục nhập thư mục, nhưng nếu bạn không có tham số nào, nó sẽ sử dụng thư mục hiện tại làm tham số, vì vậy nó chỉ có "." thư mục để liệt kê ...
edomaur

1
Tôi không thể tin rằng tôi chưa bao giờ phát hiện ra điều này trước đây. Mẹo tuyệt vời.
Nick Dixon

Không có từ nào, chỉ là wow !!! :)
dimba

41

ESC.

Chèn các đối số cuối cùng từ lệnh bash cuối cùng của bạn. Nó có ích hơn bạn nghĩ.

cp file /to/some/long/path

CD ESC.


Điều này làm việc cho tôi (bash). Lưu ý rằng bạn nhấn phím esc và sau đó là phím period. Không có dấu gạch ngang hoặc bất cứ điều gì.
Howler

9
Ngoài ra alt-. là điều tương tự.
Mark Baker

Vâng, đó chỉ là Bash. Nhưng <esc> (hoặc Alt- hoặc Meta-) _ bị ràng buộc với cùng chức năng và <esc> -_ cũng hoạt động ở chế độ vi.
Nick Dixon

@hendry trong zsh của tôi nó thực sự hoạt động. Có lẽ bạn sử dụng chế độ vi?
ZyX

Sử dụng thẻ kbd cho lần truy cập bàn phím: <kbd> ESC </ kbd> (Nhưng không chơi rất hay với định dạng mã / thụt lề).
người dùng không xác định

36

Chắc chắn, bạn có thể " diff file1.txt file2.txt", nhưng Bash hỗ trợ thay thế quy trình , cho phép bạn diffxuất ra các lệnh.

Ví dụ: giả sử tôi muốn đảm bảo rằng tập lệnh của tôi cung cấp cho tôi đầu ra mà tôi mong đợi. Tôi chỉ có thể gói tập lệnh của mình vào <() và cung cấp tập lệnh diffđể có được bài kiểm tra đơn vị nhanh và bẩn:

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

Một ví dụ khác, giả sử tôi muốn kiểm tra xem hai máy chủ có cùng danh sách RPM được cài đặt không. Thay vì sshing đến từng máy chủ, viết từng danh sách RPM vào các tệp riêng biệt và thực hiện difftrên các tệp đó, tôi chỉ có thể thực hiện difftừ máy trạm của mình:

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

Có nhiều ví dụ hơn trong Hướng dẫn Bash-Scripting nâng cao tại http://tldp.org/LDP/abs/html/ process-sub.html .


35

Lệnh yêu thích của tôi là "ls -thor"

Nó triệu tập sức mạnh của các vị thần để liệt kê các tệp được sửa đổi gần đây nhất ở định dạng dễ đọc.


6
Nhắc nhở tôi về một lệnh khác, hoàn toàn vô dụng nhưng cũng buồn cười : ls -bart -simpson -ruls. S, ICNR
filiprem

'ls -tor' cũng hữu ích vì bạn có thể nhanh chóng tìm thấy các tệp lớn. Ngoài ra, cách đánh vần gốc tiếng Thụy Điển của tên của thần sấm sét thực sự là 'Tor'.
dala

Trong tiếng Đan Mạch, bạn có thể sử dụng ls -lorttừ "shit" trong tiếng Đan Mạch. Bỏ qua bất kỳ nhóm nào và không nhận được sự phẫn nộ của valhal :)
Jesper Rønn-Jensen

1
người ta cũng có thể nói nó giống như "ls -lotr" có vẻ như có liên quan đến Tolkien và Lord Of The Rings :)
ADEpt

28

Thêm một điều mới lạ, nhưng thật thông minh ...

10 lệnh hàng đầu được sử dụng:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

Đầu ra mẫu:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi

1
Đây là phiên bản ngắn hơn, nhanh hơn:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Tạm dừng cho đến khi có thông báo mới.

25

^ R tìm kiếm ngược. Nhấn ^ R, nhập một đoạn của lệnh trước bạn muốn khớp và nhấn ^ R cho đến khi bạn tìm thấy lệnh bạn muốn. Sau đó, tôi không phải nhớ các lệnh được sử dụng gần đây vẫn còn trong lịch sử của tôi. Không chỉ riêng bash, mà còn: ^ E cho cuối dòng, ^ A cho đầu dòng, ^ U và ^ K để xóa trước và sau con trỏ, tương ứng.


2
Tôi không bao giờ có thể nhớ ^ U vì một số lý do. Không có một phím tắt xóa xóa quá?
hoyhoy

1
^ W xóa từ trước con trỏ. (Hãy thoải mái chỉnh sửa câu trả lời của bạn với điều này.)
Jon Ericson

2
^ R rất hữu ích đến nỗi nó đã được đề cập trong câu hỏi :)
Mark Baker

20

Tôi thường có bí danh cho vi, ls, v.v. nhưng đôi khi bạn muốn thoát khỏi bí danh. Chỉ cần thêm một dấu gạch chéo ngược vào lệnh phía trước:

Ví dụ:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

Thật tuyệt phải không?


Bạn cũng có thể chạy command-xem SHELL BUILTIN COMMANDStrong cuốn hướng dẫn Bash.
Iceland_jack

17

Đây là một vài điều chỉnh cấu hình:

~/.inputrc:

"\C-[[A": history-search-backward
"\C-[[B": history-search-forward

Điều này hoạt động tương tự như ^Rnhưng sử dụng các phím mũi tên thay thế. Điều này có nghĩa là tôi có thể gõ (ví dụ) cd /media/sau đó nhấn mũi tên lên để đi đến điều cuối cùng tôi cdmuốn vào trong /media/thư mục.

(Tôi sử dụng Gnome Terminal, bạn có thể cần thay đổi mã thoát cho các trình giả lập thiết bị đầu cuối khác.)

Hoàn thành Bash cũng cực kỳ hữu ích, nhưng đó là một bổ sung tinh tế hơn nhiều. Trong ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Điều này sẽ cho phép hoàn thành tab trên mỗi chương trình (ví dụ: cố gắng hoàn thành tab khi dòng lệnh bắt đầu evincesẽ chỉ hiển thị các tệp mà evince có thể mở và nó cũng sẽ tùy chọn dòng lệnh hoàn thành tab).

Hoạt động độc đáo với điều này cũng trong ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

+1 bash_completion thật tuyệt vời
uy tín

Trên máy Mac, có thể bật tìm kiếm Lịch sử bằng các phím mũi tên với: bind '"\ e [A"': history-search-backward bind '"\ e [B"': history-search-Forward
Asmus

17

Tôi sử dụng rất nhiều sau đây:

Công cụ :psửa đổi để in kết quả lịch sử. Ví dụ

!!:p

Sẽ in lệnh cuối cùng để bạn có thể kiểm tra xem nó có đúng không trước khi chạy lại. Chỉ cần nhập !!để thực hiện nó.

Trong một tĩnh mạch tương tự:

!?foo?:p

Sẽ tìm kiếm lịch sử của bạn cho lệnh gần đây nhất có chứa chuỗi 'foo' và in nó.

Nếu bạn không cần in,

!?foo

thực hiện tìm kiếm và thực hiện nó ngay lập tức.


2
Thay vì sử dụng: p, bạn cũng có thể sử dụng không gian ma thuật: stackoverflow.com/questions/603696/ mẹo
Yoo

để mở rộng các điều khiển lịch sử mà không cần chạy không gian ảo thuật trong bashrcbind Space:magic-space # !pin<space>
SergioAraujo

16

Tôi đã có một vũ khí bí mật: shell-fu.

Có hàng ngàn lời khuyên thông minh, thủ thuật hay và công thức nấu ăn hiệu quả mà hầu hết thời gian phù hợp với một dòng.

Một cái mà tôi yêu thích (nhưng tôi gian lận một chút vì tôi sử dụng thực tế là Python đã được cài đặt trên hầu hết hệ thống Unix bây giờ):

alias webshare='python -m SimpleHTTPServer'

Bây giờ mỗi khi bạn gõ "webshare", thư mục hiện tại sẽ có sẵn thông qua cổng 8000. Thật tuyệt khi bạn muốn chia sẻ tệp với bạn bè trên mạng cục bộ mà không cần khóa usb hoặc thư mục từ xa. Truyền phát video và âm nhạc cũng sẽ làm việc.

Và tất nhiên, quả bom ngã ba cổ điển hoàn toàn vô dụng nhưng vẫn rất nhiều niềm vui:

$ :(){ :|:& };:

Đừng thử điều đó trong một máy chủ sản xuất ...


Tôi đoán tôi không nên webshare /
Yoo

Tôi đoán bạn có thể đơn giản hóa lệnh này python -m SimpleHTTPServer(trừ khi tôi thiếu thứ gì đó lạ mắt với lệnh ban đầu
Jesper Rønn-Jensen

Meh. Trên một máy chủ sản xuất, bom ngã ba sẽ bị HĐH đè bẹp; có giới hạn về số lượng quy trình mà bất kỳ người dùng nào cũng có thể tạo.
Donal Fellows

3
@Donal: Bạn nên thử nó và báo cáo kết quả của bạn.
Michael Foukarakis

12

Bạn có thể sử dụng lệnh xem kết hợp với một lệnh khác để tìm kiếm thay đổi. Một ví dụ về điều này là khi tôi đang kiểm tra bộ định tuyến của mình và tôi muốn có được các số cập nhật trên các thứ như tỷ lệ tín hiệu-nhiễu, v.v.

watch --interval=10 lynx -dump http://dslrouter/stats.html

Lệnh đồng hồ thực sự rất tuyệt. Lần đầu tiên tôi đọc về cuốn sách Linux Server Hacks khoảng năm năm trước. Ai biết nó tồn tại?
hoyhoy

11
'Đồng hồ' trên thế giới có liên quan gì đến bash?
Artem Russakovskii

11
type -a PROG

để tìm tất cả những nơi có sẵn PROG, thường là một nơi nào đó trong ~ / bin chứ không phải là nơi trong / usr / bin / PROG có thể được mong đợi.


1
Nó cũng sẽ cho bạn biết nếu đó là một chức năng hoặc bí danh. Nếu nó ở nhiều nơi trong bạn, PATHnó sẽ hiển thị từng cái.
Tạm dừng cho đến khi có thông báo mới.

11

Tôi thích xây dựng các lệnh với echo và dẫn chúng vào shell:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

Tại sao? Bởi vì nó cho phép tôi xem xét những gì sẽ được thực hiện trước khi tôi làm điều đó. Bằng cách đó nếu tôi có một lỗi khủng khiếp (như xóa thư mục chính của tôi), tôi có thể bắt nó trước khi nó xảy ra. Rõ ràng, điều này là quan trọng nhất cho các hành động phá hoại hoặc không thể hủy bỏ.


1
Bạn có thể muốn sử dụng find -print0 và xargs -0 để tránh các vấn đề với tệp và thư mục có khoảng trắng trong đó.
neu242

Hoặc tránh tạo và làm việc với các tệp và thư mục có khoảng trắng trong tên của chúng. ;-) Rõ ràng nếu bạn đang làm việc với tên do người dùng tạo, đề xuất của bạn rất quan trọng.
Jon Ericson

4
Tại sao bạn lại thêm "| ksh -s" khi bạn có thể loại bỏ "tiếng vang"?
Yoo

Không cần nối ống với GNU tìm:$ find dir -name \\*~ -exec rm {} +
bobbogo

10

Khi tải xuống một tệp lớn, tôi thường làm:

while ls -la <filename>; do sleep 5; done

Và sau đó chỉ ctrl + c khi tôi hoàn thành (hoặc nếu lstrả về giá trị khác không). Nó tương tự như watchchương trình nhưng nó sử dụng shell thay thế, vì vậy nó hoạt động trên các nền tảng mà không có watch.

Một công cụ hữu ích khác là netcat, hoặc nc. Nếu bạn làm:

nc -l -p 9100 > printjob.prn

Sau đó, bạn có thể thiết lập máy in trên một máy tính khác nhưng thay vào đó hãy sử dụng địa chỉ IP của máy tính đang chạy netcat. Khi lệnh in được gửi, nó sẽ được nhận bởi máy tính đang chạy netcat và đổ vào printjob.prn.


Tại sao điều này và không, ví dụ , wget?
porges

Hãy thử watch ls -la <filename>(sử dụng -n5 nếu bạn không thích mặc định là 2 giây).
Ted Percival

1
@Ted, watchkhông có sẵn trên tất cả các nền tảng, như Solaris, Mac OS X, v.v ... @Porges, không chắc ý của bạn là gì. Wget cũng có thể nghe trên một cổng?
dreamlax


10

Một cách điều hướng ưa thích khi tôi đang sử dụng nhiều thư mục ở những nơi riêng biệt rộng rãi trong hệ thống phân cấp cây là sử dụng acf_func.sh (được liệt kê bên dưới). Sau khi xác định, bạn có thể làm

cd -

để xem danh sách các thư mục gần đây, với menu số

cd -2

để đi đến thư mục gần đây thứ hai.

Rất dễ sử dụng, rất tiện dụng.

Đây là mã:

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

10

Mở rộng các dòng phức tạp trước khi nhấn enter đáng sợ

  • Alt+ Ctrl+ e- shell-extend-line (có thể cần sử dụng Esc, Ctrl+ etrên bàn phím của bạn)
  • Ctrl+ _- hoàn tác
  • Ctrl+ x, *- toàn cầu mở rộng từ

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

& c.


+1, tôi luôn sợ bức xúc Enter:)
João Portela

Không biết ai trong số này. Hoàn tác là một kẻ giết người. Tốt cho bất kỳ chỉnh sửa dòng lệnh.
Philippe A.

9

Tôi đã luôn luôn là một phần để:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

Tôi cũng sử dụng shopt -s cdable_vars, sau đó bạn có thể tạo các biến bash cho các thư mục phổ biến. Vì vậy, đối với cây nguồn của công ty tôi, tôi tạo ra một loạt các biến như:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

sau đó tôi có thể thay đổi thư mục đó bằng cách cd Dcentmain.


Home và End làm những việc tương tự như crtl-A và ctrl-E.
davidfg4

Điều này giúp trên Máy tính xách tay Mac không có phím home và end.
jamesh

Thật không may, ctrl-A cũng là phím thoát screentheo mặc định. Tôi sắp xếp lại nó cho ctrl-X .screenrc, nhưng sau đó tôi không phải là người dùng emacs.
hệ thống PAUSE

Một phần nào đó liên quan đến tùy chọn cdable_vars, cũng có biến môi trường CDPATH. Nhưng điều đó hoạt động khác nhau, bởi vì bạn đặt thư mục mẹ, giống như trong PATH. Với cdable_vars bạn có thể kiểm soát nhiều hơn.
Zecc

1
Thêm cho danh sách phím tắt của bạn: CTRL + K để xóa mọi thứ từ con trỏ đến cuối dòng, CTRL + U để xóa mọi thứ trước con trỏ, ALT + F / ALT + B để di chuyển một từ tiến / lùi (hoặc CTRL + mũi tên trái / CTRL + mũi tên phải). +1 cho cdable_vars!
Philippe A.

8

pbcopy

Bản sao này vào bảng tạm hệ thống Mac. Bạn có thể đặt lệnh cho nó ... thử:

pwd | pbcopy


Lưu ý! Đây là một lệnh cụ thể của Mac.
dala

Đây không phải là: alias pbcopy='xsel --clipboard --input'alias pbpaste='xsel --clipboard --output'
wawawawa

7
$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done

Sử dụng history 10thay vì history | tail -10(nên tail -n 10bằng cách đó vì cú pháp đó không được dùng nữa).
Tạm dừng cho đến khi có thông báo mới.

7

Sử dụng 'set -o vi' từ dòng lệnh, hoặc tốt hơn, trong .bashrc, đưa bạn vào chế độ chỉnh sửa vi trên dòng lệnh. Bạn bắt đầu ở chế độ 'chèn' để bạn có thể nhập và xóa lùi như bình thường, nhưng nếu bạn mắc lỗi 'lớn', bạn có thể nhấn phím esc và sau đó sử dụng 'b' và 'f' để di chuyển như bạn làm trong vi. cw để thay đổi một từ. Đặc biệt hữu ích sau khi bạn đưa ra một lệnh lịch sử mà bạn muốn thay đổi.


7

Tương tự như nhiều người ở trên, yêu thích hiện tại của tôi là tổ hợp phím [alt]. (Alt và phím "." Cùng nhau) giống như $! (Chèn đối số cuối cùng từ lệnh trước) ngoại trừ việc nó ngay lập tức và đối với tôi dễ gõ hơn. (Chỉ không thể được sử dụng trong các tập lệnh)

ví dụ:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

Ngoài ra, hãy thử kết hợp nó với Alt- [0-9] (nhấn tổ hợp đầu tiên, sau đó phát hành, sau đó đến lần thứ hai). ví dụ: nếu lệnh cuối cùng là 'mv foo bar', thì "Alt-0 Alt-." cho 'mv', "Alt-1 Alt-." cho 'foo', "Alt-2 Alt-." và cơ bản Alt-. cả hai đều cho 'thanh', v.v.
Sam Stokes

1
Cũng thử nhấn Alt-. nhiều hơn một lần (hoặc nhấn Alt, giữ nó ở đó, nhấn dấu chấm nhiều lần và sau đó nhả Alt) Điều này tương tự như nhấn Ctrl-R nhiều lần.
Yoo

7

Chuỗi nhiều lệnh với nhau bằng lệnh && :

./run.sh && tail -f log.txt

hoặc là

kill -9 1111 && ./start.sh

1
nếu một thất bại, lệnh khác sẽ không được thực thi (thất bại nhanh, như trong lập trình)
Frederic Morin

1
Ngược lại là sử dụng logic hoặc '||' trong đó phía bên tay phải sẽ chỉ được thực hiện nếu phía bên trái là sai. Ví dụ: <code> lệnh_1 || lệnh_2 </ code>
dala
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.