Linux dòng lệnh thực hành tốt nhất và lời khuyên?


112

Tôi muốn mở một cuộc thảo luận sẽ tích lũy các thực tiễn và mẹo hay nhất về dòng lệnh Linux (CLI) của bạn.

Tôi đã tìm kiếm một cuộc thảo luận như vậy để chia sẻ bình luận bên dưới nhưng không tìm thấy một bình luận nào, do đó bài đăng này.

Tôi hy vọng tất cả chúng ta có thể học hỏi từ điều này.

Bạn được hoan nghênh chia sẻ các mẹo Bash, grep, sed, AWK, / Proc và tất cả các quản trị hệ thống Linux / Unix khác có liên quan, lập trình thực hành tốt nhất cho tất cả chúng ta.


Tại sao chỉ có Linux? Nhiều mẹo có thể hữu ích trên hầu hết tất cả các hương vị của Unix.
mouviciel

Câu hỏi này có thể là một câu hỏi rộng - có đủ các cách thực hành tốt nhất cho dòng lệnh Linux / Unix để lấp đầy toàn bộ sách ...
Jonik

Tôi đồng ý rằng các mẹo unix có thể áp dụng cho linux cũng rất được hoan nghênh, tôi đã viết linux vì A. Đây là những gì chúng tôi làm việc ở đây. B. bởi vì nó đạt được một sự tiếp xúc công khai rộng hơn sau đó unix trong những năm gần đây.
Maxim Veksler

Tôi nghĩ rằng đó là một ý tưởng tuyệt vời để liệt kê một danh sách các lệnh hữu ích và thú vị nhất mà mọi người sử dụng.

Có ai trong số này có liên quan? refspecs.freestandards.org

Câu trả lời:


111

Sử dụng màn hình , bộ ghép kênh đầu cuối miễn phí được phát triển bởi Dự án GNU sẽ cho phép bạn có một số thiết bị đầu cuối trong một.

Bạn có thể bắt đầu một phiên và thiết bị đầu cuối của bạn sẽ được lưu ngay cả khi mất kết nối, do đó bạn có thể tiếp tục lại sau hoặc từ nhà.


2
Các công tắc phổ biến nhất tôi sử dụng là 'screen -D -R' để tách và tiếp tục phiên màn hình cuối cùng của tôi và 'screen -x' để xem cùng một phiên màn hình từ nhiều lần đăng nhập. Ngoài ra, hãy kiếm cho mình một .screenrc đẹp từ dotfiles.org/.screenrc
Nick Devereaux

4
Một điều thú vị khác về màn hình là bạn có thể chia sẻ thiết bị đầu cuối với người khác khi bạn muốn cộng tác trên một cái gì đó, sử dụng màn hình -x
gareth_bowles

101

SSH!
SSH là lệnh thần - Tôi nghĩ đó là lệnh có giá trị nhất để học. Các tùy chọn có thể khá khó khăn, nhưng có vẻ như tôi liên tục học cách sử dụng các tùy chọn dòng lệnh mới cho SSH mà tôi không bao giờ nghĩ là cần thiết. Tôi có thể đã sử dụng tất cả chúng tại thời điểm này.

Bạn càng sử dụng nó, bạn càng tìm hiểu về nó. Bạn có thể sử dụng nó để làm một số điều TUYỆT VỜI.

Lưu ý: TẤT CẢ những điều này có thể thực hiện được từ xa mà không cần thiết lập trên máy chủ của bạn ngoại trừ để máy chủ ssh chạy.

Gắn hệ thống tập tin qua internet

tìm kiếm trên mạng cho SSHFS

Chuyển tiếp lệnh .

Giao thức SVN + SSH là Subversion từ máy khách từ xa đến máy chủ KHÔNG CÓ DEAMON chạy trên nó! Lệnh SVN khởi động máy chủ thông qua vỏ ssh và chuyển thông tin qua lại thông qua đường ống hiện có. Chương trình rsync cũng làm điều tương tự, chạy với một máy chủ không có rsync deamon bằng cách tự khởi động thông qua SSH. Thật dễ dàng để viết các tệp bash của riêng bạn để thực hiện các thủ thuật tương tự.

Xích để vượt qua tường lửa

Tôi sử dụng tất cả thời gian để nhảy qua máy chủ linux của tôi ở nhà với máy mac của tôi.

Chuyển tiếp cổng:
Có vẻ chỉ hữu ích ở mức độ vừa phải cho đến khi bạn nhận ra rằng bạn có thể thoát qua tường lửa gia đình và định cấu hình bộ định tuyến tại nhà từ nơi làm việc như thể bạn đang làm như vậy từ trong mạng gia đình của mình).

Chuyển tiếp yêu cầu X:

Đây là một trong những tuyệt vời. Có hoặc không có máy chủ X chạy trên hệ thống từ xa, bạn có thể chạy chương trình x-windows và cửa sổ sẽ xuất hiện trên màn hình cục bộ của bạn. Chỉ cần sử dụng công tắc -X, thế thôi!

Vì bạn không cần phải có máy chủ X chạy trên máy chủ từ xa, nên tác động của CPU đến máy chủ của bạn là tối thiểu, bạn có thể có máy chủ TINY Linux phục vụ các ứng dụng lớn cho PC trò chơi mạnh mẽ của bạn chạy Windows và cygwin / X.

Tất nhiên VI và EMACS hoạt động trên SSH, nhưng khi tôi chạy ở nhà, đôi khi tôi muốn nhiều hơn nữa. Tôi sử dụng ssh -X để bắt đầu một bản sao của Eclipse! Nếu máy chủ của bạn mạnh hơn máy tính xách tay của bạn, bạn đã có GUI ở ngay trên máy tính xách tay của mình, nhưng quá trình biên dịch được thực hiện trên máy chủ của bạn, vì vậy đừng lo lắng về tải hệ thống.

Chạy trong tập tin bó

(có nghĩa là chạy một tệp bó cục bộ "thực hiện công cụ" trên các hệ thống khác):

Hai thứ kết hợp để làm cho cái này mát mẻ. Một là bạn có thể loại bỏ lời nhắc mật khẩu bằng cách sử dụng các khóa mã hóa (an toàn hơn). Thứ hai là bạn có thể chỉ định một lệnh trên SSH CLI. Tôi đã sử dụng điều này theo một số cách thú vị - Giống như khi một trình biên dịch bị lỗi trên máy chủ từ xa, tôi sẽ cho nó SSH vào máy tính của mình và phát một tệp âm thanh).

Hãy nhớ rằng bạn có thể chuyển hướng đầu ra từ lệnh từ xa và sử dụng nó trong tệp bó cục bộ của bạn, do đó bạn cũng có thể điều khiển cục bộ một trình biên dịch chạy trên máy chủ của mình.

Được xây dựng trong Mac

Cả máy chủ và máy khách đều được tích hợp vào cả mac và linux. Trong trường hợp của Mac và Ubuntu, việc kích hoạt máy chủ cũng đơn giản như tìm đúng hộp kiểm.

Trên PC cài đặt cygwin hoặc cygwin / X (cygwin / X sẽ cho phép bạn chuyển tiếp đầu ra cửa sổ x từ máy Linux của bạn sang PC Windows - nó cài đặt máy chủ X)

Mẹo / tập tin cấu hình quan trọng

Không bao giờ sử dụng cổng 22 trên tường lửa của bạn. Bạn sẽ nhận được rất nhiều nỗ lực hack, nó chỉ không xứng đáng. Chỉ cần tường lửa của bạn chuyển tiếp một cổng khác đến máy chủ của bạn.

Có nhiều tùy chọn cấu hình cho phép bạn đơn giản hóa đáng kể các lệnh ssh của mình. Đây là một ví dụ của tôi tại nơi làm việc:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Khi tôi gõ "ssh home" (không có gì khác), nó hoạt động như thể tôi đã gõ:

ssh -p 12345 bill@billshome.hopto.org

và sau đó chuyển tiếp cổng địa phương 1025 sang hệ thống "mac" của tôi ở nhà. Lý do cho điều này là tôi có một mục khác trong tệp của mình:

Host mac
    hostname localhost
    port=1025

để một khi tôi đã thực hiện "ssh home" và vẫn mở cửa sổ, tôi có thể gõ "ssh mac" và máy tính tại đây sẽ thực sự cố gắng kết nối với cổng 1025 của chính nó đã được chuyển tiếp tới "mac: 22 "bằng lệnh khác, vì vậy nó sẽ kết nối với máy Mac của tôi ở nhà thông qua tường lửa.

Chỉnh sửa - kịch bản tuyệt vời!

Tôi đã đào một kịch bản cũ mà tôi yêu thích - phải quay lại và đăng nó cho bất cứ ai ở đây có thể quan tâm. Kịch bản được gọi là "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Nếu bạn có tập lệnh này trong thư mục chính của bạn và có một máy chủ bạn có thể kết nối với (thông qua ssh), thì bạn có thể nhập "./authMe hostName".

Nếu cần thiết, nó sẽ tạo ra một cặp khóa công khai / riêng tư cho bạn, sau đó nó sẽ chuyển sang máy khác và sao chép khóa chung của bạn (lệnh ssh sẽ nhắc bạn nhập mật khẩu ...)

Sau này, lệnh SSH không nên yêu cầu mật khẩu của bạn nữa khi gắn vào hệ thống từ xa đó, nó sẽ sử dụng khóa công khai / riêng tư.

Nếu máy tính từ xa của bạn không phải lúc nào cũng an toàn, bạn nên xem xét việc đặt "cụm mật khẩu" khi được nhắc.

Bạn cũng có thể muốn định cấu hình máy chủ ssh ở phía xa để không cho phép mật khẩu văn bản (chỉ các phím) để bảo mật bổ sung.


4
+1 bài đăng rất hay và nhỏ gọn
Karsten

2
Một lưu ý nhỏ về SSH qua cổng 22: miễn là bạn có mật khẩu root tốt và người dùng của bạn không có mật khẩu khủng, chỉ cần chạy fail2ban (hoặc một cái gì đó tương tự) là đủ để tránh các nỗ lực bẻ khóa. Tôi thấy thực sự khó chịu khi giữ SSH trên một cổng khác.
David Wolever

1
Nó có thể gây khó chịu đôi khi, nhưng khối lượng kết nối chỉ đáng sợ. Tôi biết rằng họ không cần phải vượt qua, nhưng nó giống như là nếu bạn có ai đó đi đến nhà bạn và nghịch ngợm tay nắm cửa của bạn mỗi phút - chỉ là không đáng sợ.

Có phiên bản tích hợp của lệnh cuối cùng của bạn trong hầu hết các phiên bản ssh hiện nay, nó được gọi ssh-copy-idvà đơn giản nhưssh-copy-id user@someserver
JamesHannah

Một cách khác để thực hiện thủ thuật 'ssh mac' của bạn là sử dụng chỉ thị ProxyCommand trong tệp .ssh / config của bạn. Máy chủ mac ProxyCommand ssh -q home "nc% h% p" Điều này sẽ chạy netcat (nc) tại nhà và chuyển hướng kết nối ssh của bạn thẳng đến mac. Tôi thấy những chuỗi đó dễ dàng hơn (ví dụ: nếu bạn cần kết nối với 'nhà' để đến 'cơ sở làm việc' để đến 'máy chủ web làm việc'.
topplingwagon

73

Tôi thích sử dụng

cd -

để chuyển sang thư mục trước. Rất hữu ích!


6
Tôi chưa bao giờ biết điều này! Cảm ơn! Trên một lưu ý liên quan, Pushd và popd làm một cái gì đó tương tự, bằng cách xây dựng một chồng các thư mục. Những loại thủ thuật này giúp ích khi bạn điều hướng xung quanh một cấu trúc dir sâu.

Đây là sự giác ngộ tuyệt đối.
Manuel Ferreria

69

Gần đây tôi đã phát hiện ra pvlệnh (trình xem ống) giống như con mèo nhưng có chi tiết chuyển.

Vì vậy, thay vì

$ gzip -c access.log > access.log.gz

Bạn có thể dùng

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Vì vậy, thay vì không biết khi nào hoạt động của bạn sẽ kết thúc, bây giờ bạn sẽ biết!

Phép lịch sự của Peteris Krumins


$ gzip -c access.log> access.log.gz Tại sao không chỉ: $ gzip access.log

Ồ, nó hoạt động :) Tôi chỉ lấy ví dụ từ trang web của Peteris.
Nick Devereaux

Trông như cũ tee(1).
Daniel C. Sobral

Tiện ích cực kỳ hữu ích, một tiện ích mà tôi luôn quên :-(
Patrick


46

Nhấn Ctrl-R và bắt đầu nhập một lệnh (hoặc bất kỳ phần nào của nó) - nó tìm kiếm lịch sử lệnh. Nhấn Ctrl-R lần nữa sẽ nhảy sang trận đấu tiếp theo, nhập lệnh thực hiện hiện đang hiển thị và mũi tên phải (ít nhất) sẽ cho phép bạn chỉnh sửa nó trước.

$ (reverse-i-search)`svn': svn status

Tôi đã sử dụng Linux trong 7 năm như hệ điều hành chính của mình trước khi biết điều này, nhưng bây giờ tôi biết nó, nó khá tiện dụng.


Cảm ơn. Tôi đã sử dụng tìm kiếm ngược, nhưng không thể tìm ra cách chuyển sang trận đấu tiếp theo.
Adam

Ctrl-S nhảy đến trận đấu tiếp theo. Trước tiên, bạn có thể phải stty -ixontắt ý nghĩa kiểm soát luồng XON / XOFF (điều này cũng làm cho Ctrl-Q khả dụng, theo mặc định, nó được ánh xạ giống như Ctrl-V được trích dẫn, nhưng bạn có thể thay đổi nó thành một thứ khác ). Xem man sttyman readlineđể biết thêm thông tin. Các sttylệnh có thể được thêm vào của bạn~/.bashrc
Dennis Williamson

45

Dòng lệnh là một điều buồn cười. Tôi nghĩ rằng bạn chỉ có thể tự học rất nhiều và phần còn lại bạn học một cách tình cờ khi xem người khác sử dụng một dòng lệnh.

Tôi đã sử dụng shell trong nhiều năm để gõ tên thư mục bằng tay. Một ngày nọ, tôi đang xem một người bạn làm phiền trên một hệ thống và anh ta tiếp tục nhấn phím tab. Tôi hỏi "tại sao bạn nhấn tab?". Trả lời: nó cố gắng hoàn thành thư mục hoặc tên tệp. Ai có thể đoán - hoàn thành tab! Nhập một chút của tệp hoặc thư mục, nhấn tab và nó sẽ cố gắng hoàn thành những gì bạn đã nhập (hành vi phụ thuộc vào vỏ nào).

Một ngày nọ, người bạn nói đang theo dõi tôi trên dòng lệnh và xem tôi gõ một cái gì đó như:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Ai mà đoán được!? Anh ấy không bao giờ biết về popd/ pushd. Đoán chúng ta thậm chí ...


1
Đối với tôi, việc hoàn thành tab có vẻ như là một điều gì đó "hiển nhiên", rất cơ bản, nhưng tôi cũng không bao giờ biết về popd / Pushd. Thật buồn cười. :)
Jonik

3
Đồng thời xem câu trả lời này để có thể hoàn thành nhiều tab hơn các lệnh, tệp và thư mục: stackoverflow.com/questions/603696//603919#603919
Jonik

1
Điều đó rất đúng. Tôi đã tìm hiểu về tìm kiếm lịch sử lạc hậu (ctrl-r) của bash bằng cách xem ai đó. Sau đó tôi nhận ra rằng đó là một tính năng đọc và hoạt động tương tự trong các chương trình khác kết hợp với đường đọc (mysql, gdb, python -i, clisp, v.v.).
sigjuice

2
Làm thế nào bạn có thể sử dụng "vỏ" trong nhiều năm và không biết về hoàn thành tab?
uy tín

Khi làm việc với Pushd / popd đừng quên đề cập đến các lệnh dir . Nó hiển thị những gì trên ngăn xếp đẩy / popd.
slm

41

Học Vim.

Nó (được cho là) ​​trình soạn thảo tốt nhất, nhưng chắc chắn là trình soạn thảo tốt nhất có sẵn trên một máy chủ Linux trống.


1
gvim cũng là trình duyệt tệp tốt nhất trên windows;)

Điều này cũng cực kỳ hữu ích vì một khi bạn biết vim, bạn có thể đặt hầu hết các shell vào chế độ vi, và điều hướng trở nên cực kỳ dễ dàng và nhanh chóng
Patrick

38

Đôi khi rất hữu ích khi để chương trình chạy ngay cả khi bạn đã đăng xuất. Tôi đã thấy một số giải pháp sử dụng nohup hoặc thậm chí màn hình cho mục đích đó. Đơn giản nhất tôi biết là:

$ your_command_here & disown

Bạn cũng có thể tách một chương trình đang chạy:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
Sử dụng màn hình là điều tuyệt vời vì bạn có thể "kết nối lại" với ứng dụng đó từ bất cứ đâu sau này.
uy tín

+1, tôi đã không nghe nói về sự thất vọng.
dùng18911

ditto re disown, mặc dù tôi đã làm tương tự với màn hình
Andy

38

Khi tôi muốn đảm bảo rằng tôi sử dụng lệnh thực tế chứ không phải bí danh, tôi sử dụng dấu gạch chéo ngược hàng đầu:

\rm -rf ~/tmp

cái này có giống như "lệnh rm -rf ~ / tmp" không?
Maxim Veksler

Tôi không biết "mệnh lệnh", nhưng nó trông giống nhau.
mouviciel

4
Chà, vâng, trừ khi "lệnh" không phải là bí danh, trong trường hợp đó bạn sẽ phải sử dụng \ lệnh rm -rf ~ / tmp trong trường hợp đó \ rm -rf ~ / tmp là tốt hơn
Jamol

@presario và bạn nghĩ rằng có thể tạo bí danh cho "/" không? Thật đáng tiếc tôi không thể đưa ra các ý kiến ​​:)

Xem thêm lệnh tương tự " builtin".
Dennis Williamson

38

Mẹo này sẽ giúp CLI của bạn thoải mái hơn (ít nhất là nó giúp tôi):

tạo tập tin ~ / .inputrc với nội dung sau:

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

Tải lại bash (ví dụ: bằng cách gõ "exec bash"). Khi bạn nhập tiền tố của một lệnh và nhấn mũi tên lên, bạn sẽ duyệt các lệnh bắt đầu bằng tiền tố của mình, ví dụ nếu bạn nhập ssh, nó sẽ hiển thị các kết nối cũ của bạn với các shell từ xa. Nếu lời nhắc của bạn trống thì mũi tên lên sẽ duyệt lịch sử theo cách thông thường.


3
Thông thường tôi liên kết chúng với \ e [5 ~ và \ e [6 ~ (còn gọi là pageup và pagedown) thay vì đảo ngược các mũi tên, nhưng nó thuận tiện hơn Ctrl-R / Ctrl-S :)
ephemient

+1. Tôi đã có những ràng buộc này với F8 và Shift-F8 để bắt chước cmd.exe, nhưng áp dụng nguyên tắc tương tự.
dùng18911

4
+1 choexec bash
Dennis Williamson

Việc đọc man readlinevà ghi nhớ các phím tắt mặc định cũng rất giáo dục
SaveTheRbtz

Bạn cũng có thể làm bind -f ~/.inputrcđể tải lại inputrc mà không phải bắt đầu bash mới và xóa sạch môi trường hiện tại của bạn.
Patrick

36

Sử dụng &&thay vì ;khi thực hiện nhiều lệnh cùng một lúc. Nó dừng khi xảy ra lỗi và không thực thi các lệnh khác.

Ví dụ cổ điển:

./configure && make && make install

1
Thực hành này được đánh giá quá thấp! Cần phải thực hành tiêu chuẩn để kết thúc mỗi dòng của tập lệnh shell bằng && và sử dụng "true" làm lệnh cuối cùng.
dùng18911

3
Điều buồn cười là tôi đã không biết về ';' lệnh trước - Tôi đã LUÔN sử dụng '&&'.
Nick Klauer

4
Bạn có thể bắt đầu các kịch bản shell với "#! / Bin / sh -e". Điều này dừng lại nếu bất kỳ dòng thất bại.
stribika

3
Bạn có thể sử dụng một ống đôi cho mệnh đề "khác":dosomething && echo "success" || echo "teh fail"
Dennis Williamson

2
Có một lưu ý gần đây trên Planet Debian rằng việc sử dụng -e trên dòng shebang là một thực tế tồi. Thay vào đó, sử dụng set -e trong phần thân của tập lệnh. Bằng cách này, tập lệnh không hoạt động khác đi nếu ai đó tình cờ sử dụng tên tệp sh $.
ptman

32

Khi viết các vòng lặp trên dòng lệnh trong bash, tôi thường tiền tố các lệnh rủi ro bằng lệnh 'echo'.

for item in items; do echo something-risky; done

Bằng cách này, tôi có thể thấy "cái gì đó mạo hiểm" đầy đủ trước khi cam kết chạy nó. Giúp khi lệnh rủi ro của bạn bao gồm mở rộng biến đổi và ảm đạm. Và 'set -x' rất hữu ích khi viết tập lệnh bash.

'set -x' cho phép gỡ lỗi. Xem http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html để biết thông tin về gỡ lỗi bash.


3
Tôi cũng làm điều này, thủ thuật rất tiện dụng!
dùng18911

1
+1 Đây có thể là một cứu tinh! hoặc tiết kiệm dữ liệu ...
David Oneill

31

Yêu cầu

Bạn cần kiểm tra băng thông tối đa giữa 2 máy chủ.


Giải pháp

Trên SERVER1 làm:

nc -u -l 54321 > /dev/null

Trên SERVER2 làm:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Bạn sẽ thấy đầu ra như:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 MB / s là yếu tố thú vị ở đây, cho thấy băng thông truyền mạng thực tế.

Giải thích :

Vì gói sẽ bắt đầu truyền qua mạng, bạn sẽ có thể xem số liệu thống kê băng thông trên SERVER2, đây là một ước tính khá tốt về băng thông tối đa có thể thực tế giữa hai máy chủ.

Sao chép bằng UDP (để ngăn chặn chi phí TCP).

Sao chép từ bộ nhớ (/ dev / zero) trên SERVER1 sang bộ nhớ (/ dev / null) trên SERVER2, do đó ngăn I / O của đĩa trở thành nút cổ chai.


4
Hãy chắc chắn rằng ssh không được cấu hình để sử dụng nén trong .ssh / config, 'mặc dù. Nếu không, bạn sẽ nhận được những con số thực sự rất xa sự thật ;-)
Joachim Sauer

Lol, vâng. Và SSH sẽ được mã hóa và giải mã CPU của bạn, điều này cũng sẽ loại bỏ các con số.

thay vào đó hãy sử dụng netcat
uốn cong vào

+1 cho netcat. chi phí hoạt động của SSH sẽ làm lệch số của bạn
Mikeage

Tái cấu trúc để sửa đổi các đề xuất của @saua, @Daniel Von Fange và @bendin. Cảm ơn các bạn đã gợi ý.
Maxim Veksler

23

Xem cấu trúc thư mục màu dễ dàng hơn.

alias ls="ls --color=tty"

Biên tập

alias ls="ls --color=auto"

5
Tôi thích --color = auto vì nó không gửi ký tự kiểm soát rác nếu chuyển hướng đến tệp, bạn cũng có thể thực hiện bí danh grep = "grep --color = auto" để làm nổi bật các mẫu phù hợp.

+1 cho --color = tự động; ai đó có thể làm tăng câu trả lời với điều đó?
Jonik

Tôi nghĩ rằng tty làm điều tương tự như tự động ở đây.
joshudson

Đã cập nhật để phản ánh màu sắc = tự động
Khởi

Kỳ lạ thay, màu sắc làm cho mọi thứ ít đọc hơn đối với tôi. Ví dụ, màu vàng trắng không phải là một lựa chọn màu tốt.

20

Một số gợi ý nhỏ về xem nhật ký:

  1. Bạn có thể sử dụng đuôi -F để tiếp tục xem nhật ký sau khi bị cắt ngắn (ví dụ log4j).
  2. Bạn có thể sử dụng ít hơn: Mở ít hơn, nhấp vào Shift + F để mô phỏng hành vi đuôi. Kết hợp cũng hữu ích là -S để vô hiệu hóa gói dòng. ít hơn sẽ cho phép bạn tìm kiếm trong nhật ký.

1
Và với tail -fbạn có thể xem nhiều nhật ký cùng một lúc! Ví dụ:tail -f log1.txt -f log2.txt
Stu Thompson

@StuThndry: Cảm ơn. đã không biết rằng. Ngoài ra, bạn có thể muốn kiểm tra vanheusden.com/multitail
Maxim Veksler

20

Tôi đã học được một mẹo từ một người bạn trong một thời gian dài để dễ dàng thay đổi phần mở rộng của tệp:

mv my_filename.{old,new}

Shell mở rộng sẽ mở rộng này để:

mv my_filename.old my_filename.new

Điều này cũng có thể được sử dụng để đổi tên một tệp theo những cách khác, chẳng hạn như thêm một cái gì đó vào:

mv my_{,cool_}filename

6
Chỉ cần đảm bảo không đặt bất kỳ ký tự đại diện hoặc biểu thức mẫu nào khác trong cùng một lệnh hoặc toàn cầu có thể mở rộng thành nhiều hơn chỉ 2 đối số! mv *. {cũ, mới} có thể tạo ra kết quả thực sự đáng ngạc nhiên.

Có, đã đồng ý - đây là một cảnh báo quan trọng :)

2
Bạn cũng có thể nhập, ví dụ, ls -l /bin/csau đó nhấn Alt-Shift- {và nó sẽ hoàn thành việc này thành một cái gì đó giống như ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}cho bạn.
Dennis Williamson

19

Sử dụng "tar xf" để trích xuất tài liệu lưu trữ nén. Không cần j cho bzip2 và z cho gzip, vì tar sẽ phát hiện loại tệp của kho lưu trữ của bạn. Không phải là dấu '-' trước các đối số. Bạn sẽ tiết kiệm được rất nhiều thời gian (qua một thiên niên kỷ ;-)).

Tốt hơn hết là sử dụng unsoo để trích xuất bất kỳ kho lưu trữ nào bằng một lệnh duy nhất mà không có bất kỳ đối số không cần thiết nào.


Yup, tôi có alias ut="tar xf"- làm cho việc trích xuất tài liệu lưu trữ thậm chí dễ dàng hơn.
David Wolever

Điều này không thành công trên một số bản phân phối của RHEL, nếu bạn sử dụng chúng.
pvsnp

Tar mới cũng có công tắc "J" để nén vào kho lưu trữ xz (dựa trên 7zip)
Hubert Kario

Hoặc cài đặt unp: packages.debian.org/sid/unp . Tôi đoán nó tương tự như Unoo.
Zitrax

17

Cài đặt gói hoàn thành bash. Nó chứa một số quy tắc hoàn thành được xác định trước cho shell. Kích hoạt nó bằng cách gõ "source / etc / bash_completion" nếu bạn không làm điều đó cho bạn. Sau đó, ví dụ bất cứ khi nào bạn hoàn thành sau kpdf, bạn sẽ chỉ thấy một danh sách các thư mục và tệp PDF. Nó cũng thông minh như hoàn thành các tệp từ xa sau scp ssh: // server / XXX (nếu bạn đã bật đăng nhập không mật khẩu).


17

Tôi sử dụng liên tục những cái này

ALT-. (ESC +. Trong một số thiết bị đầu cuối) sao chép đối số được sử dụng lần cuối (siêu hữu ích)

CTRL-W xóa từ

Xóa thiết bị đầu cuối CTRL-L (như lệnh xóa nhưng nhanh hơn)

ALT-B (ESC + B trong một số thiết bị đầu cuối) di chuyển ngược một từ

ALT-F (ESC + F trong một số thiết bị đầu cuối) di chuyển về phía trước một từ

CTRL-E nhảy tới EOL

CTRL-A nhảy đến BOL

Tìm kiếm CTRL-R trong lịch sử


1
Cảm ơn bạn đã chia sẻ các phím tắt! Tôi không có ALT-B / F để hoạt động trong Mac.
Léo Léopold Hertz 준영

Người đàn ông tuyệt vời ....
Daud Ahmad Khokhar

16

Trong bash, tôi sử dụng ! $ Rất nhiều. Nó lặp lại đối số cuối cùng của lệnh cuối cùng:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Nó sẽ chạy ls, sau đó nếu bạn muốn chỉnh sửa nó, bạn không cần phải gõ lại, chỉ cần sử dụng! $. Điều này thực sự hữu ích cho tên đường dẫn / tệp dài. Ngoài ra ,! * Lặp lại tất cả các đối số của lệnh trước đó. Tôi không sử dụng nó nhiều như vậy, nhưng nó có vẻ hữu ích.

Tôi biết họ đã được đề cập, nhưng tôi sử dụng vim, màn hình và cd - rất nhiều.

Tôi đã quên noclobber:

set -o noclobber

Từ người đàn ông bash :

Nếu được đặt, bash không ghi đè lên tệp hiện có với các toán tử chuyển hướng>,> & và <>. Điều này có thể bị ghi đè khi tạo tệp đầu ra bằng cách sử dụng toán tử chuyển hướng> | thay vì>.


6
Tôi không sử dụng $!, Vì nó rất dễ làm ngón tay mập, nhưng tôi thích đánh ^ [-. (thời gian thoát) để có được hiệu ứng tương tự.
David Wolever

7
Tùy thuộc vào bàn phím của bạn, vv, bạn cũng có thể làm Alt-.như vậy.
Dennis Williamson

Ôi, cực khoái tí hon, ty Dennis!
artifex

14

Chuyển từ bash sang zsh và xem năng suất của bạn được cải thiện:

  • Thực sự thông minh, hoàn thành tab script. Nó hoàn thành không chỉ các dòng lệnh mà tất cả các tùy chọn, tên của trang man, tên gói (đối với apt-get / emerge, v.v.) và những gì có bạn. Và cung cấp một lời giải thích hữu ích về các tùy chọn trong quá trình hoàn thành. Tất cả điều này mà không sử dụng bất kỳ không gian cuộn lại sau khi lệnh đã được ban hành.
  • Tab hoàn thành các ký tự đại diện; viết cat * .txt, nhấn tab và chọn giữa bất kỳ tệp nào khớp với biểu thức.
  • Chuyển thư mục chỉ bằng cách gõ tên của họ.
  • Một số chế độ biên tập dòng. Có thể cư xử như vi hoặc emacs nếu bạn muốn nó.
  • Các ràng buộc chính có thể tùy chỉnh để làm bất cứ điều gì bạn muốn.
  • Lời nhắc có thể sử dụng, bao gồm khả năng đặt thông tin nhắc ở bên phải màn hình và tự động ẩn khi nhập lệnh dài

Google sẽ cho bạn biết nhiều lợi ích hơn.


1
bạn nên cung cấp thêm sau đó một liên kết. Nghe có vẻ thú vị, nhưng bán nó cho tôi người đàn ông!

Họ đã quản lý để bao gồm hỗ trợ unicode?

@Cory Được rồi, tôi chỉ không muốn đạo văn và cảm thấy không cần thiết để tự viết khi có quá nhiều thứ hay ho được viết bởi người khác :)

@kyku vâng, có hỗ trợ unicode thích hợp vì có thể một năm trở lại.

trông mát mẻ. tôi sẽ cho nó một viên đạn!

13

Trường học cũ, di chuyển một cây thư mục từ nơi này sang nơi khác, bảo tồn các liên kết tượng trưng, ​​quyền và tất cả những thứ tốt:

tar cBf - . | (cd /destination; tar xvBpf -)

hoặc trên mạng

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Trường mới:

rsync -urltv . /destination

hoặc trên mạng

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Ít gõ hơn một chút và dễ sử dụng hơn ssh.
ephemient

1
-a giống như '-rlptgoD' - nghĩa là lặp lại, sao chép liên kết tượng trưng dưới dạng liên kết tượng trưng, ​​giữ perm, giữ dấu thời gian, giữ nhóm, giữ chủ sở hữu, sao chép tệp thiết bị và tệp đặc biệt dưới dạng thiết bị và tệp đặc biệt. Ngoài ra, giữa các máy, -z (nén tệp trước khi gửi, giải nén sau khi nhận) là hữu ích. rsync -avz [-e ssh] là bạn của bạn :-)
dr-jan

-Z có làm tốt hơn ssh không? Tôi sẽ không nghĩ như vậy.
Paul Tomblin

rsync -avhlà tốt nhất trên một máy duy nhất - hđảm bảo rằng các liên kết cứng được truyền chính xác mà không biến mỗi liên kết thành một tệp riêng biệt, mặc dù nếu bạn có số lượng tệp khổng lồ thì nó có thể sử dụng rất nhiều bộ nhớ. rsync -avzh . foo.com/destinationlà tương đương với mạng và thông thường bạn không cần -e sshrsync sẽ biết sử dụng ssh.
RichVel

Trên thực tế, những ngày này tôi đang sử dụngrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

Yêu cầu : Bạn có một thư mục chứa danh sách lớn các tệp bạn muốn xóa. rm -r sẽ thất bại!

thí dụ

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Giải pháp :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Giải thích :

Chỉnh sửa: Sửa giải thích sau bình luận @ephemient.

find sẽ cung cấp các đối số cho rm bằng các đối số tối đa được phép. Điều này sẽ cho phép rm xóa các tệp theo lô, đây là kỹ thuật nhanh nhất mà tôi biết mà không cần sử dụng thao tác -delete của chính nó. Nó tương đương với

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

mà bạn có thể thấy hữu ích nếu bạn findkhông hỗ trợ -exec ... +.


5
Thay thế \;bằng +: sau đó findsẽ làm những gì xargslàm theo mặc định, đó là bó các đối số càng nhiều càng tốt (mà không chạy quá giới hạn danh sách đối số). Hoặc chỉ cần sử dụng -deleteintead của -exec rm(GNU Findutils cần thiết cho cả hai)
ephemient

Mẹo hay - Tôi không biết cái '+'.
codeinthehole

@ephemient: Nhận xét tốt, tôi đã chỉnh sửa bài viết.
Maxim Veksler

2
Thật thú vị, tôi đã không nghe nói về '+'.
dùng18911

hoặc chỉ find ... -delete, nếu phát hiện của bạn là như vậy.
David Wolever

11

Tôi sử dụng hai mẹo này thường xuyên đến mức tôi nghĩ rằng nó sẽ là một ý tưởng tốt để chia sẻ:

!foo

Sẽ khởi chạy lệnh cuối cùng trong tệp lịch sử bắt đầu bằng "foo" (tôi thường sử dụng nó khi biên dịch !gccchẳng hạn.)

Một cái khác là phím tắt (Ctrl + O thay vì Return), điều này sẽ thực thi lệnh VÀ hiển thị lệnh tiếp theo trong tệp lịch sử. Ví dụ: khi tôi biên dịch và kiểm tra một tập tin, tôi luôn thực hiện 3 hoặc 4 lệnh, tạo, cd vào thư mục của bài kiểm tra, chạy thử nghiệm, cd vào thư mục của tệp thực hiện. Sử dụng Ctrl + O, điều này làm cho công việc này dễ dàng hơn nhiều :)

Hy vọng điều này giúp đỡ!


1
+1 cho Ctrl-O
Dennis Williamson

10

Cách sử dụng lật đổ trong Linux mà không cần sự trợ giúp của các giao diện đồ họa ưa thích có thể không khả dụng.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Điều này kìm hãm rất nhiều nhà phát triển sử dụng Linux, thật kỳ lạ.


rapidsvn là một gui nhỏ tuyệt vời cho svn trong Linux.

Nhiều GUI mạnh mẽ, lạ mắt chắc chắn có sẵn (như trong IntelliJ IDEA), nhưng tôi thích khả năng sử dụng một trong hai hoặc dòng lệnh (cũng mạnh mẽ, nhưng khác biệt) - phù hợp với tình huống hiện tại tốt hơn
Jonik

Yêu thích của tôi cho đến nay là NautilusSVN (giống như TortoiseSVN): code.google.com/p/nautilussvn
user7655

10

Lệnh cũ bị bỏ qua nhất: find

Hôm qua tôi đã sửa một lỗi tổng quyền:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Đúng! Tìm hiểu lệnh tìm. Tìm hỗn hợp với xargs, sed và awk làm cho một juggernaut xử lý tập tin!
Jonathon Watney

Đã đồng ý! Mặc dù tôi không bao giờ nhớ bất cứ điều gì về sed và awk - tôi luôn cần phải học lại nó! Tôi thực sự nên in ra một chiếc áo choàng.

Có, nhưng đừng quên sử dụng -print0 và tùy chọn -0 để xargs để tránh các vấn đề khó khăn liên quan đến tên tệp có chứa các ký tự bất thường (ví dụ: dấu gạch chéo ngược).
dùng18911

Phải, có lẽ là một nửa thời gian tôi sử dụng tìm nó để sửa những thứ cho phép ngu ngốc : chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Đừng quên -permtùy chọn findđịnh vị các tệp có quyền được đặt theo một cách nhất định.
Dennis Williamson

8

Đối với các shell như bashksh, bạn có thể làm cho dòng lệnh phản hồi các lệnh điều hướng như trình soạn thảo văn bản của bạn:

set -o emacs

hoặc là

set -o vi

sẽ cho phép bạn tìm kiếm lịch sử của mình và di chuyển về dòng lệnh theo cách bạn đã quen làm trong các tệp văn bản (ví dụ: ở chế độ vi, nhấn ESCrồi gõ /stringsẽ tìm kiếm "chuỗi" trước đó của bạn - bạn có thể sử dụng nNdi chuyển giữa các trận đấu)


Lỗi đánh máy nhỏ: "trình soạn thảo kiểm tra" phải là "trình soạn thảo văn bản"

8

grep là bạn của tôi Nghiêm túc.

Liệt kê .rbcác tệp có chứa văn bản class foo:

grep -l "class foo" .rb

Liệt kê .rbcác tệp không chứa văn bản class foo:

grep -L "class foo" *.rb

Liệt kê .rbcác tệp không chứa foo hoặc bar (bạn có thể sử dụng bất kỳ biểu thức chính quy nào với -e, nhưng bạn cần thoát các toán tử):

grep -L -e "foo\|bar" *.rb

Bạn có thể quan tâm đến một công cụ gọi là "ack", hoạt động tương tự như grep nhưng sẽ chỉ quét các tệp nguồn đệ quy. Hãy dùng thử (miễn phí): betterthangrep.com

8

Thay thế vỏ được thực hiện với ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
Trên thực tế tôi thích "!!: gs / foo / bar" vì tôi thường thấy rằng foo được nhắc đến nhiều hơn một lần trong lệnh trước đó và tôi muốn một sự thay thế toàn cầu (ví dụ: "mv foo.txt foo.bak").
dùng18911
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.