Praktik terbaik dan tips baris perintah Linux?

112

Saya ingin membuka diskusi yang akan mengakumulasi praktik dan tip terbaik Linux command line (CLI) Anda.

Saya telah mencari diskusi semacam itu untuk membagikan komentar di bawah ini tetapi belum menemukan satu, karenanya posting ini.

Saya harap kita semua bisa belajar dari ini.

Anda dipersilakan untuk berbagi kiat Bash, grep, sed, AWK, / proc dan semua administrasi sistem Linux / Unix terkait lainnya, memprogram praktik terbaik pemrograman shell untuk kepentingan kita semua.

Maxim Veksler
sumber
Kenapa hanya Linux? Banyak tips mungkin berguna pada hampir semua rasa Unix.
mouviciel
Pertanyaan ini mungkin anak laki-laki yang luas - ada cukup untuk Linux / Unix baris perintah praktik terbaik untuk mengisi seluruh buku ...
Jonik
Saya setuju bahwa tips unix yang dapat diterapkan ke linux juga sangat disambut baik, saya sudah menulis linux karena A. Inilah yang kami kerjakan di sini. B. karena mendapatkan paparan publik yang lebih luas kemudian unix dalam beberapa tahun terakhir.
Maxim Veksler
Saya pikir itu ide bagus untuk menyusun daftar perintah paling berguna dan menarik yang digunakan orang.
Apakah ada yang relevan? refspecs.freestandards.org

Jawaban:

111

Gunakan layar , multiplexer terminal gratis yang dikembangkan oleh Proyek GNU yang memungkinkan Anda memiliki beberapa terminal dalam satu terminal.

Anda dapat memulai sesi dan terminal Anda akan disimpan bahkan ketika koneksi Anda terputus, sehingga Anda dapat melanjutkan nanti atau dari rumah.

jeneriz
sumber
2
Sakelar paling umum yang saya gunakan adalah 'layar -D -R' untuk melepaskan dan melanjutkan kembali sesi layar terakhir saya dan 'layar -x' untuk melihat sesi layar yang sama dari beberapa login. Juga, dapatkan sendiri .screenrc bagus dari dotfiles.org/.screenrc
Nick Devereaux
4
Satu hal yang menyenangkan tentang layar adalah Anda dapat berbagi terminal dengan orang lain saat Anda ingin berkolaborasi dalam sesuatu, menggunakan layar -x
gareth_bowles
101

SSH!
SSH adalah perintah dewa - saya pikir itu perintah yang paling berharga untuk dipelajari. Opsi bisa sangat menakutkan, tetapi sepertinya saya terus-menerus belajar menggunakan opsi baris perintah baru untuk SSH yang tidak pernah saya pikir akan diperlukan. Saya mungkin telah menggunakan semuanya pada saat ini.

Semakin banyak Anda menggunakannya, semakin banyak Anda mempelajarinya. Anda dapat menggunakannya untuk melakukan beberapa hal yang LUAR BIASA.

Catatan: SEMUA hal ini dapat dilakukan dari jarak jauh tanpa pengaturan di server Anda kecuali menjalankan ssh server.

Pasang sistem file melalui internet

cari bersih untuk SSHFS

Teruskan perintah .

Protokol SVN + SSH adalah Subversi dari klien jarak jauh ke server tanpa NO DEAMON berjalan di atasnya! Perintah SVN memulai server melalui ssh shell dan meneruskan info bolak-balik melalui pipa yang ada. Program rsync melakukan hal yang sama, berjalan melawan server tanpa deamon rsync dengan memulai sendiri melalui SSH. Sangat mudah untuk menulis file bash Anda sendiri untuk melakukan trik serupa.

Rantai untuk melewati firewall

Saya menggunakan ini sepanjang waktu untuk melompat melalui server linux saya di rumah ke mac saya.

Port
penerusan : Tampaknya hanya cukup bermanfaat sampai Anda menyadari bahwa Anda dapat bangkit melalui firewall rumah Anda dan mengonfigurasi router di rumah dari kantor seolah-olah Anda melakukannya dari dalam jaringan rumah Anda).

Teruskan permintaan X:

Ini satu lagi yang menakjubkan. Dengan atau tanpa server X yang berjalan pada sistem jarak jauh Anda, Anda dapat menjalankan program x-windows dan jendela tersebut akan muncul di layar lokal Anda. Cukup gunakan saklar -X, itu saja!

Karena Anda tidak harus memiliki server X yang berjalan di server jarak jauh Anda, dampak CPU pada server Anda minimal, Anda dapat memiliki server TINY Linux yang menyajikan aplikasi besar ke PC game Anda yang kuat yang menjalankan Windows dan cygwin / X.

Tentu saja VI dan EMACS bekerja pada SSH, tetapi ketika saya berlari di rumah, terkadang saya menginginkan lebih. Saya menggunakan ssh -X untuk memulai salinan Eclipse! Jika server Anda lebih kuat dari laptop Anda, Anda punya GUI di sana di laptop Anda, tetapi kompilasi dilakukan di server Anda, jadi jangan khawatir tentang beban sistem.

Jalankan dalam file batch

(artinya jalankan file batch lokal yang "melakukan hal-hal" pada sistem lain):

Dua hal bergabung untuk menjadikan yang satu ini keren. Salah satunya adalah Anda dapat menghilangkan permintaan kata sandi dengan menggunakan kunci enkripsi (lebih aman). Yang kedua adalah Anda dapat menentukan perintah pada SSH CLI. Saya telah menggunakan ini dalam beberapa cara menarik - Seperti ketika kompilasi gagal pada server jauh, saya akan memasukkan SSH ke komputer saya dan memutar file suara).

Ingat Anda dapat mengarahkan output dari perintah jarak jauh dan menggunakannya dalam file batch lokal Anda, sehingga Anda juga bisa secara lokal mengikuti kompilasi yang berjalan di server Anda.

Dibangun untuk Mac

Baik server dan klien dibangun ke dalam mac dan linux. Dalam kasus Mac dan Ubuntu, mengaktifkan server semudah menemukan kotak centang yang tepat.

Pada PC, instal cygwin atau cygwin / X (cygwin / X akan memungkinkan Anda untuk meneruskan output x-window Anda dari mesin Linux ke PC Windows Anda - ia menginstal server X)

Tips Penting / file konfigurasi

Jangan pernah gunakan port 22 di firewall Anda. Anda akan mendapatkan banyak upaya peretasan, hanya saja tidak sepadan. Hanya perlu firewall Anda meneruskan port yang berbeda ke server Anda.

Ada opsi konfigurasi luas yang memungkinkan Anda untuk menyederhanakan perintah ssh Anda secara signifikan. Berikut ini contoh milik saya di tempat kerja:

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

Ketika saya mengetik "ssh home" (tidak ada yang lain), ini berfungsi seolah-olah saya telah mengetik:

ssh -p 12345 bill@billshome.hopto.org

dan kemudian meneruskan port lokal saya 1025 ke sistem "mac" di rumah. Alasan untuk ini adalah saya memiliki entri lain di file saya:

Host mac
    hostname localhost
    port=1025

sehingga setelah saya melakukan "ssh home" dan masih membuka jendela, saya dapat mengetik "ssh mac" dan komputer yang bekerja di sini akan benar-benar mencoba untuk terhubung ke port 1025 sendiri yang telah diteruskan ke "mac: 22 "oleh perintah lain, sehingga akan terhubung ke Mac saya di rumah melalui firewall.

Edit - skrip keren!

Saya menggali skrip lama yang saya sukai - harus kembali dan mempostingnya untuk siapa saja di sini yang mungkin tertarik. Script ini disebut "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

Jika Anda memiliki skrip ini di direktori home Anda dan ada host yang dapat Anda hubungi (melalui ssh), maka Anda dapat mengetikkan "./authMe hostName".

Jika perlu itu akan membuat keypair publik / pribadi untuk Anda, maka itu akan ssh ke mesin lain dan menyalin kunci publik Anda di atas (perintah ssh akan meminta Anda untuk kata sandi ...)

Setelah ini, perintah SSH tidak boleh meminta kata sandi Anda lagi ketika melampirkan ke sistem jarak jauh, itu akan menggunakan keypair publik / pribadi.

Jika komputer jarak jauh Anda tidak selalu aman, Anda harus mempertimbangkan pengaturan "frasa sandi" saat diminta.

Anda mungkin juga ingin mengkonfigurasi server ssh di ujung untuk tidak mengizinkan kata sandi teks (hanya kunci) untuk keamanan tambahan.

Bill K
sumber
4
+1 pos yang sangat bagus dan ringkas
Karsten
2
Catatan kecil tentang SSH melalui port 22: asalkan Anda memiliki kata sandi root yang baik dan pengguna Anda tidak memiliki kata sandi yang buruk, hanya menjalankan fail2ban (atau yang serupa) sudah cukup untuk mencegah upaya crack. Saya merasa sangat menjengkelkan untuk menjaga SSH di port lain.
David Wolever
1
Kadang-kadang bisa menjengkelkan, tetapi volume koneksi hanya menakutkan. Saya tahu mereka tidak seharusnya melewati, tapi rasanya seperti jika Anda memiliki seseorang berjalan ke rumah Anda dan mengutak-atik kenop pintu Anda setiap menit - hanya mengerikan.
Ada versi built-in dari perintah terakhir Anda di sebagian besar versi ssh saat ini, itu disebut ssh-copy-id, dan itu sesederhanassh-copy-id user@someserver
JamesHannah
Cara lain untuk melakukan trik 'ssh mac' Anda adalah dengan menggunakan perintah ProxyCommand dalam file .ssh / config Anda. Host mac ProxyCommand ssh -q home "nc% h% p" Ini akan menjalankan netcat (nc) di rumah dan mengarahkan ulang koneksi ssh Anda langsung ke mac. Saya menemukan mereka lebih mudah untuk rantai (misalnya jika Anda perlu terhubung ke 'rumah' untuk sampai ke 'work bastion' untuk sampai ke 'work web server'.
toppledwagon
73

Saya suka menggunakan

cd -

untuk beralih ke direktori sebelumnya. Sangat berguna!

Fortyrunner
sumber
6
Saya tidak pernah tahu ini! Terima kasih! Pada catatan terkait, pushd dan popd melakukan sesuatu yang serupa, dengan membangun setumpuk dir. Trik semacam ini membantu ketika Anda bernavigasi di sekitar struktur dir yang dalam.
Ini adalah pencerahan belaka.
Manuel Ferreria
69

Saya baru-baru ini menemukan pvperintah (penampil pipa) yang seperti kucing tetapi dengan detail transfer.

Jadi, bukannya

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

Anda dapat gunakan

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

Jadi, bukannya tidak tahu kapan operasi Anda akan selesai, sekarang Anda akan tahu!

Atas perkenan Peteris Krumins

Nick Devereaux
sumber
$ gzip -c access.log> access.log.gz Mengapa tidak hanya: $ gzip access.log
Oh itu berhasil :) Saya baru saja mengambil contoh dari situs web Peteris.
Nick Devereaux
Itu terlihat seperti tua yang baik tee(1).
Daniel C. Sobral
Utilitas yang sangat berguna, yang selalu saya lupakan :-(
Patrick
53
sudo !!

Jalankan kembali perintah sebelumnya sebagai root.

[Perintah teratas saat ini di situs http://www.commandlinefu.com , situs bertema di sepanjang baris pertanyaan ini.]

kode masuk ke lubang
sumber
2
Pengungkapan - Saya menjalankan commandlinefu.com
codeinthehole
9
Itu akan menyelamatkan orang ini 16 karakter: xkcd.com/149
46

Tekan Ctrl-R dan mulai mengetik perintah (atau bagian dari itu) - itu mencari sejarah perintah. Menekan Ctrl-R lagi akan melompat ke pertandingan berikutnya, masukkan mengeksekusi perintah yang ditampilkan saat ini, dan panah kanan (setidaknya) akan membiarkan Anda mengeditnya terlebih dahulu.

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

Saya telah menggunakan Linux selama kira-kira 7 tahun sebagai OS utama saya sebelum mempelajari hal ini, tetapi sekarang setelah saya mengetahuinya, ini sangat berguna.

Jonik
sumber
Terima kasih. Saya telah menggunakan pencarian terbalik, tetapi belum dapat menemukan cara untuk beralih ke pertandingan berikutnya.
Adam
Ctrl-S melompat ke pertandingan berikutnya. Anda mungkin harus melakukan stty -ixonterlebih dahulu untuk mematikan makna kontrol aliran XON / XOFF (ini juga membuat Ctrl-Q tersedia, secara default itu dipetakan sama dengan Ctrl-V yang dikutip-sisipkan, tetapi Anda dapat mengubahnya ke hal lain ). Lihat man sttydan man readlineuntuk informasi lebih lanjut. The sttyperintah dapat ditambahkan ke~/.bashrc
Dennis Williamson
45

Baris perintah adalah hal yang lucu. Saya pikir Anda hanya bisa belajar begitu banyak pada Anda sendiri dan sisanya Anda pelajari secara tidak sengaja menonton orang lain menggunakan baris perintah.

Saya menggunakan shell selama bertahun-tahun dengan susah payah mengetikkan nama direktori dengan tangan. Suatu hari saya melihat seorang teman mengacaukan sebuah sistem dan dia terus menekan tombol tab. Saya bertanya "mengapa Anda memukul tab?". Jawab: ia mencoba untuk menyelesaikan direktori atau nama file. Siapa yang akan menebak - penyelesaian tab! Ketik sedikit file atau direktori, tekan tab, dan itu akan mencoba untuk menyelesaikan apa yang Anda ketik (perilaku tergantung pada shell yang mana).

Suatu hari, kata teman itu memperhatikan saya di baris perintah dan menonton saya mengetik sesuatu seperti:

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

Siapa yang akan menebak !? Dia tidak pernah tahu tentang popd/ pushd. Kira kita bahkan ...

Cory R. King
sumber
1
Bagi saya penyelesaian tab sepertinya sesuatu yang "jelas", sangat mendasar, tetapi saya juga tidak pernah tahu tentang popd / pushd. Lucu memang. :)
Jonik
3
Lihat juga jawaban ini untuk dapat menyelesaikan banyak hal lebih dari sekadar perintah, file, dan direktori: stackoverflow.com/questions/603696//603919#603919
Jonik
1
Itu benar sekali. Saya belajar tentang pencarian mundur-sejarah-bash (ctrl-r) dengan menonton seseorang. Saya kemudian menyadari bahwa itu adalah fitur readline dan bekerja sama di program lain yang menggabungkan readline (mysql, gdb, python-i, clisp dll).
sigjuice
2
Bagaimana Anda bisa menggunakan "shell" selama bertahun-tahun dan tidak tahu tentang penyelesaian tab?
prestomation
Ketika berhadapan dengan pushd / popd jangan lupa untuk menyebutkan perintah dirs . Ini menunjukkan apa yang ada di tumpukan pushd / popd.
slm
41

Pelajari Vim.

Ini (bisa dibilang) editor terbaik, tetapi pastinya editor terbaik yang tersedia di server Linux kosong.

Ali A
sumber
1
gvim juga peramban file terbaik di windows;)
Ini juga sangat berguna karena begitu Anda tahu vim, Anda dapat memasukkan sebagian besar shell ke mode-vi, dan navigasi menjadi sangat mudah dan cepat
Patrick
38

Terkadang berguna untuk membiarkan program berjalan bahkan setelah Anda keluar. Saya telah melihat beberapa solusi yang menggunakan layar nohup atau bahkan untuk tujuan itu. Yang paling sederhana yang saya tahu adalah:

$ your_command_here & disown

Anda juga dapat melepaskan program yang sedang berjalan:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
kyku
sumber
6
Menggunakan layar sangat bagus karena Anda dapat "menyambung kembali" ke aplikasi itu dari mana saja nanti.
prestomation
+1, saya belum pernah mendengar tentang penolakan.
user18911
juga tidak diakui, meskipun saya sudah melakukan hal yang sama dengan layar
Andy
38

Ketika saya ingin memastikan bahwa saya menggunakan perintah aktual dan bukan alias, saya menggunakan backslash terkemuka:

\rm -rf ~/tmp
mouviciel
sumber
apakah ini sama dengan "perintah rm -rf ~ / tmp"?
Maxim Veksler
Saya tidak tahu "perintah", tetapi terlihat sama.
mouviciel
4
Nah, ya kecuali "perintah" bukan alias dalam hal ini Anda harus menggunakan \ command rm -rf ~ / tmp dalam kasus itu \ rm -rf ~ / tmp lebih baik
Jamol
@presario dan Anda pikir itu mungkin untuk membuat alias untuk "/"? Sayang sekali saya tidak bisa mengubah komentar :)
Lihat juga perintah serupa " builtin".
Dennis Williamson
38

Tip ini akan membuat CLI Anda lebih nyaman (setidaknya itu membuat saya):

buat file ~ / .inputrc dengan konten berikut:

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

Muat ulang bash (mis. Dengan mengetikkan "exec bash"). Saat Anda mengetikkan awalan suatu perintah dan menekan panah ke atas Anda akan menelusuri perintah yang dimulai dengan awalan Anda, misalnya jika Anda mengetik ssh itu akan menunjukkan koneksi lama Anda dengan shell jarak jauh. Jika prompt Anda kosong maka panah ke atas akan menelusuri sejarah dengan cara normal.

kyku
sumber
3
Biasanya saya mengikat mereka ke \ e [5 ~ dan \ e [6 ~ (alias pageup dan pagedown) alih-alih mengubah tanda panah, tetapi lebih nyaman daripada Ctrl-R / Ctrl-S :)
ephemient
+1. Saya punya ini terikat ke F8 dan Shift-F8 untuk meniru cmd.exe, tetapi prinsip yang sama berlaku.
user18911
4
+1 untukexec bash
Dennis Williamson
Ini juga pendidikan untuk membaca man readlinedan menghafal shortcut standar itu
SaveTheRbtz
Anda juga dapat melakukan bind -f ~/.inputrcuntuk memuat ulang inputrc tanpa harus memulai bash baru dan menghapus lingkungan Anda saat ini.
Patrick
36

Gunakan &&alih-alih ;saat menjalankan beberapa perintah sekaligus. Itu berhenti ketika kesalahan terjadi dan tidak menjalankan perintah lain.

Contoh klasik:

./configure && make && make install
arah x
sumber
1
Praktek ini sangat diremehkan! Ini harus menjadi praktik standar untuk mengakhiri setiap baris skrip shell dengan && dan menggunakan "true" sebagai perintah terakhir.
user18911
3
yang lucu adalah saya tidak tahu tentang ';' perintah sebelumnya - Saya SELALU menggunakan '&&'.
Nick Klauer
4
Anda dapat memulai skrip shell dengan "#! / Bin / sh -e". Ini berhenti jika ada saluran yang gagal.
stribika
3
Anda dapat menggunakan pipa ganda untuk klausul "lain":dosomething && echo "success" || echo "teh fail"
Dennis Williamson
2
Ada catatan baru-baru ini di Planet Debian bahwa praktik buruk untuk menggunakan -e pada garis shebang. Alih-alih gunakan set -e di badan skrip. Dengan cara ini skrip tidak bekerja secara berbeda jika seseorang kebetulan menggunakan nama file sh $.
ptman
32

Saat menulis loop pada baris perintah di bash, saya sering awalan perintah berisiko dengan perintah 'echo'.

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

Dengan cara ini saya bisa melihat 'sesuatu yang beresiko' secara penuh sebelum berkomitmen untuk menjalankannya. Membantu ketika perintah berisiko Anda mencakup ekspansi variabel dan gumpalan. Dan 'set -x' sangat berguna saat menulis skrip bash.

'set -x' memungkinkan debugging. Lihat http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html untuk informasi tentang debugging bash.

Jonathon Watney
sumber
3
Saya melakukan ini juga, trik yang sangat berguna!
user18911
1
+1 Ini bisa menjadi penyelamat! atau penghemat data ...
David Oneill
31

Kebutuhan

Anda perlu menguji bandwidth maksimum antara 2 server.


Larutan

Pada SERVER1 lakukan:

nc -u -l 54321 > /dev/null

Pada SERVER2 lakukan:

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

Anda akan melihat output seperti:

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

117 MB / s adalah faktor yang menarik di sini, yang menunjukkan bandwidth transfer jaringan yang sebenarnya.

Penjelasan :

Ketika paket akan mulai mengalir melalui jaringan Anda akan dapat melihat statistik bandwidth pada SERVER2, yang merupakan perkiraan yang cukup bagus dari bandwidth maksimum yang mungkin sebenarnya antara 2 server.

Menyalin dengan UDP (untuk mencegah TCP overhead).

Menyalin ke dari memori (/ dev / nol) pada SERVER1 ke memori (/ dev / null) pada SERVER2, sehingga mencegah disk I / O menjadi hambatan.

Maxim Veksler
sumber
4
Pastikan ssh tidak dikonfigurasikan untuk menggunakan kompresi dalam .ssh / config, 'meskipun. Kalau tidak, Anda akan mendapatkan angka yang benar-benar bagus yang jauh dari kebenaran ;-)
Joachim Sauer
Lol, ya. Dan SSH akan menggebrak enkripsi dan decrypting CPU Anda, yang juga akan membuang nomor.
gunakan netcat sebagai gantinya
bendin
+1 untuk netcat. biaya overhead SSH akan condong ke angka Anda
Mikeage
Refactored untuk mengubah saran oleh @saua, @Daniel Von Fange dan @bendin. Terima kasih atas saran Anda semuanya.
Maxim Veksler
23

Melihat struktur direktori warna lebih mudah.

alias ls="ls --color=tty"

Sunting

alias ls="ls --color=auto"
Suroot
sumber
5
Saya lebih suka --color = otomatis karena tidak mengirim karakter kontrol sampah jika mengarahkan ulang ke file Anda juga dapat melakukan alias grep = "grep --color = auto" agar pola yang cocok disorot.
+1 untuk --color = otomatis; dapatkah seseorang menambah jawabannya dengan itu?
Jonik
Saya pikir tty melakukan hal yang sama dengan otomatis di sini.
joshudson
Diperbarui untuk mencerminkan warna = otomatis
Suroot
Anehnya, pewarnaannya membuat hal-hal menjadi kurang mudah dibaca bagi saya. Kuning-putih, misalnya, bukan pilihan warna yang bagus.
20

Beberapa petunjuk kecil tentang melihat log:

  1. Anda dapat menggunakan tail -F untuk terus menonton log setelah dipotong (dengan contoh log4j).
  2. Anda dapat menggunakan lebih sedikit: Buka lebih sedikit, klik SHIFT + F untuk meniru perilaku ekor. Kombinasi yang juga berguna adalah -S untuk menonaktifkan pembungkus baris. less akan memungkinkan Anda untuk mencari di log.
Maxim Veksler
sumber
1
Dan dengan tail -fAnda dapat menonton banyak log sekaligus! Contoh:tail -f log1.txt -f log2.txt
Stu Thompson
@StuThompson: Terima kasih. tidak tahu itu. Selain itu, Anda mungkin ingin checkout vanheusden.com/multitail
Maxim
20

Saya belajar trik dari seorang teman sejak lama untuk mengubah ekstensi file dengan mudah:

mv my_filename.{old,new}

Ekspansi Shell akan memperluas ini ke:

mv my_filename.old my_filename.new

Ini juga dapat digunakan untuk mengubah nama file dengan cara lain, seperti menambahkan sesuatu di:

mv my_{,cool_}filename
Scotty Allen
sumber
6
Pastikan untuk tidak menempatkan wildcard atau ekspresi pola lain dalam perintah yang sama, atau gumpalan dapat berkembang menjadi lebih dari 2 argumen! mv *. {lama, baru} kemungkinan akan menghasilkan hasil yang sangat mengejutkan.
Ya, setuju - ini adalah peringatan penting :)
2
Anda juga dapat mengetik, misalnya, ls -l /bin/clalu tekan Alt-Shift- {dan itu akan menyelesaikan ini untuk sesuatu seperti ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}untuk Anda.
Dennis Williamson
19

Gunakan "tar xf" untuk mengekstrak arsip terkompresi. J untuk bzip2 dan z untuk gzip tidak diperlukan, karena tar akan mendeteksi tipe file arsip Anda. Tidak ada tanda '-' sebelum argumen. Anda akan menghemat banyak waktu (lebih dari satu milenium ;-)).

Lebih baik lagi gunakan unfoo untuk mengekstrak arsip apa pun dengan satu perintah tanpa argumen yang tidak perlu.

kyku
sumber
Yup, saya punya alias ut="tar xf"- membuat mengekstraksi arsip lebih mudah.
David Wolever
Ini gagal pada beberapa distribusi RHEL, jika Anda menggunakannya.
pvsnp
Tar baru juga memiliki saklar "J" untuk mengompresi arsip xz (berbasis 7zip)
Hubert Kario
Atau instal unp: packages.debian.org/sid/unp . Saya kira itu mirip dengan unfoo.
Zitrax
17

Instal paket bash-completion. Ini berisi sejumlah aturan penyelesaian yang telah ditentukan untuk shell. Aktifkan dengan mengetikkan "source / etc / bash_completion" jika distro Anda tidak melakukannya untuk Anda. Kemudian, misalnya setiap kali Anda menyelesaikan setelah kpdf Anda hanya akan melihat daftar direktori dan file PDF. Ini sama pintarnya dengan menyelesaikan file jarak jauh setelah scp ssh: // server / XXX (jika Anda mengaktifkan login tanpa kata sandi).

kyku
sumber
17

Saya selalu menggunakan yang ini

ALT-. (ESC +. Di beberapa terminal) menyalin argumen yang terakhir digunakan (sangat berguna)

CTRL-W menghapus kata

Terminal jelas CTRL-L (seperti perintah yang jelas tetapi lebih cepat)

ALT-B (ESC + B di beberapa terminal) bergerak mundur satu kata

ALT-F (ESC + F di beberapa terminal) memajukan kata

CTRL-E melompat ke EOL

CTRL-A melompat ke BOL

Pencarian CTRL-R dalam sejarah

Álvaro
sumber
1
Terima kasih telah berbagi pintasannya! Saya tidak mendapatkan ALT-B / F untuk bekerja di Mac.
Léo Léopold Hertz 준영
Orang yang luar biasa ....
Daud Ahmad Khokhar
16

Dalam bash, saya menggunakan ! $ Banyak. Itu mengulangi argumen terakhir dari perintah terakhir:

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

Ini akan menjalankan ls, maka jika Anda ingin mengeditnya, Anda tidak perlu mengetik ulang, cukup gunakan! $. Ini sangat berguna untuk nama path / file yang panjang. Juga, * mengulangi semua argumen perintah sebelumnya. Saya tidak menggunakannya sebanyak itu, tapi itu terlihat berguna.

Saya tahu mereka telah disebutkan, tetapi saya menggunakan vim, layar, dan cd - banyak.

Saya lupa noclobber:

set -o noclobber

Dari man bash :

Jika diatur, bash tidak menimpa file yang ada dengan operator pengalihan>,> &, dan <>. Ini mungkin ditimpa ketika membuat file output dengan menggunakan operator redirection> | bukannya>.

gpojd
sumber
6
Saya tidak menggunakan $ !, karena itu sangat mudah untuk jari gemuk, tapi saya suka memukul ^ [-. (periode melarikan diri) untuk mendapatkan efek yang sama.
David Wolever
7
Tergantung pada keyboard Anda, dll., Anda dapat melakukannya Alt-.juga.
Dennis Williamson
Omg, orgasme kecil, ty Dennis!
artifex
14

Beralih dari bash ke zsh , dan lihat produktivitas Anda meningkat:

  • Benar-benar cerdas, penyelesaian tab skrip. Ini tidak hanya menyelesaikan baris perintah tetapi semua opsi, nama halaman manual, nama paket (untuk apt-get / emerge dll), dan apa yang Anda miliki. Dan memberikan penjelasan yang bermanfaat tentang opsi selama penyelesaian. Semua ini tanpa menggunakan ruang scrollback apa pun setelah perintah dikeluarkan.
  • Tab penyelesaian wildcard; tulis cat * .txt, tekan tab, dan pilih di antara file apa pun yang cocok dengan ekspresi.
  • Ganti direktori hanya dengan mengetikkan nama mereka.
  • Beberapa mode editor baris. Dapat berperilaku seperti vi atau emacs jika Anda menginginkannya.
  • Ikatan kunci yang dapat disesuaikan untuk melakukan apa pun yang Anda inginkan.
  • Prompt bertema, termasuk kemampuan untuk menempatkan informasi prompt di sisi kanan layar dan menyembunyikannya saat mengetik perintah panjang

Google akan memberi tahu Anda lebih banyak manfaat.

flodin
sumber
1
Anda harus memberi lebih dari satu tautan. kedengarannya menarik, tetapi menjualnya kepada saya man!
Apakah mereka berhasil memasukkan dukungan unicode?
@Cory Baiklah, aku hanya tidak ingin menjiplak dan rasanya berlebihan untuk menulis saya sendiri ketika ada begitu banyak hal yang baik yang ditulis oleh orang lain sudah :)
@kyku ya, ada dukungan unicode yang tepat sejak mungkin setahun yang lalu.
terlihat keren. Aku akan mencobanya!
13

Sekolah lama, memindahkan pohon direktori dari satu tempat ke tempat lain, melestarikan symlink, izin dan semua hal baik itu:

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

atau di seluruh jaringan

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

Sekolah baru:

rsync -urltv . /destination

atau di seluruh jaringan

rsync -urltv -e ssh . foo.com:/destination
Paul Tomblin
sumber
tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Sedikit kurang mengetik, dan lebih mudah digunakan di atas ssh.
ephemient
1
-a sama dengan '-rlptgoD' - yaitu pengulangan, salin symlink sebagai symlink, pertahankan perms, pertahankan stempel waktu, pertahankan grup, pertahankan pemilik, salin file perangkat dan file khusus sebagai perangkat dan file khusus. Juga, di antara mesin, -z (kompres file sebelum mengirim, dekompresi setelah menerima) berguna. rsync -avz [-e ssh] adalah teman Anda :-)
dr-jan
Apakah -z ada gunanya selain ssh? Saya tidak akan berpikir begitu.
Paul Tomblin
rsync -avhterbaik pada satu mesin - hmemastikan bahwa tautan keras ditransfer dengan benar tanpa mengubah setiap tautan menjadi file terpisah, meskipun jika Anda memiliki banyak file, itu dapat menggunakan banyak memori. rsync -avzh . foo.com/destinationadalah padanan untuk jaringan, dan biasanya Anda tidak memerlukannya -e sshkarena rsync akan tahu untuk menggunakan ssh.
RichVel
Sebenarnya, hari ini saya menggunakanrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin
13

Persyaratan : Anda memiliki direktori yang berisi daftar besar file yang ingin Anda hapus. rm -r akan gagal!

contoh

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

Solusi :

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

Penjelasan :

Sunting: Memperbaiki penjelasan berikut komentar @ephemient.

find akan memberikan argumen kepada rm dengan argumen maksimum yang diizinkan. Ini akan memungkinkan rm untuk menghapus file dalam batch yang merupakan teknik tercepat yang saya tahu tanpa menggunakan operasi -delete dari find itu sendiri. Ini setara dengan

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

yang mungkin berguna bagi Anda jika Anda findtidak mendukung -exec ... +.

Maxim Veksler
sumber
5
Ganti \;dengan +: maka findakan melakukan apa yang xargsdilakukan secara default, yaitu mengumpulkan argumen sebanyak mungkin (tanpa melewati batas daftar argumen). Atau cukup gunakan -deleteintead of -exec rm(GNU Findutils diperlukan untuk keduanya)
ephemient
Tip bagus - Saya tidak tahu yang '+'.
codeinthehole
@ephemient: Komentar baik, saya sudah mengedit posting.
Maxim Veksler
2
Menarik, saya belum pernah mendengar '+'.
user18911
atau hanya find ... -delete, jika temuan Anda begitu diberkahi.
David Wolever
11

Saya menggunakan dua tips ini begitu sering sehingga saya pikir itu ide yang baik untuk dibagikan:

!foo

Akan meluncurkan perintah terakhir dalam file histori yang dimulai dengan "foo" (saya sering menggunakannya saat kompilasi, !gccmisalnya.)

Yang lainnya adalah pintasan keyboard (Ctrl + O alih-alih Kembali) ini akan menjalankan perintah DAN menampilkan perintah berikutnya dalam file riwayat. Sebagai contoh ketika saya mengkompilasi dan menguji file saya selalu melakukan 3 atau 4 perintah, buat, cd ke dir tes, jalankan tes, cd ke dir makefile. Menggunakan Ctrl + O ini membuat tugas ini jauh lebih mudah :)

Semoga bantuan ini!

claferri
sumber
1
+1 untuk Ctrl-O
Dennis Williamson
10

Cara menggunakan subversi di Linux tanpa bantuan antarmuka grafis mewah yang mungkin tidak tersedia.

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

Ini menghambat banyak pengembang dari menggunakan Linux, anehnya.

postfuturist
sumber
rapidsvn adalah gui kecil yang bagus untuk svn di Linux.
Banyak GUI mewah dan kuat tentu saja tersedia (seperti itu di IntelliJ IDEA), tapi saya suka kemungkinan menggunakan keduanya atau baris perintah (juga kuat, tetapi berbeda) - mana yang sesuai dengan situasi saat ini dengan lebih baik
Jonik
Sejauh ini favorit saya adalah NautilusSVN (seperti TortoiseSVN): code.google.com/p/nautilussvn
user7655
10

Perintah old-school yang paling diabaikan: find

Kemarin saya memperbaiki bug izin kotor:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
Norman Ramsey
sumber
Iya! Pelajari perintah find. Cari dicampur dengan xargs, sed dan awk membuat untuk juggernaut pemrosesan file!
Jonathon Watney
Sepakat! Meskipun saya tidak pernah mengingat apapun tentang sed dan awk - saya selalu perlu mempelajari kembali! Saya harus benar-benar mencetak lembar contekan.
Ya, tapi jangan lupa untuk menggunakan opsi -print0 dan -0 untuk xargs untuk menghindari masalah rumit yang melibatkan nama file yang mengandung karakter yang tidak biasa (misalnya backslash).
user18911
Yup, mungkin setengah kali saya menggunakan menemukan itu untuk memperbaiki bodoh hal izin: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever
1
Jangan lupa -permopsi finduntuk mencari file yang izinnya diatur dengan cara tertentu.
Dennis Williamson
8

Untuk kerang seperti bashdan ksh, Anda dapat membuat baris perintah merespons perintah navigasi seperti editor teks Anda:

set -o emacs

atau

set -o vi

akan memungkinkan Anda untuk mencari riwayat Anda dan bergerak tentang baris perintah dengan cara yang biasa Anda lakukan dalam file teks (misalnya dalam mode vi, menekan ESClalu mengetik /stringakan mencari perintah "string" sebelumnya - Anda dapat menggunakan ndan Nmemindahkan antara pertandingan)

Tim Whitcomb
sumber
Kesalahan ketik kecil: "test editor" seharusnya "text editor"
8

grep adalah temanku. Serius.

Daftar .rbfile yang berisi teks class foo:

grep -l "class foo" .rb

Daftar .rbfile yang tidak mengandung teks class foo:

grep -L "class foo" *.rb

Daftar .rbfile yang tidak mengandung foo atau bar (Anda dapat menggunakan regexp dengan -e, tetapi Anda harus melarikan diri dari operator):

grep -L -e "foo\|bar" *.rb
Sarah Mei
sumber
Anda mungkin tertarik pada alat yang disebut "ack", yang melakukan hal yang sama dengan grep tetapi hanya akan memindai sumber file secara rekursif. Cobalah (gratis): betterthangrep.com
8

Substitusi Shell dilakukan dengan ^:

/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
Eugene Morozov
sumber
2
Sebenarnya saya lebih suka "!!: gs / foo / bar" karena saya sering menemukan bahwa foo disebutkan lebih dari satu kali pada perintah sebelumnya dan saya ingin penggantian global (mis. "Mv foo.txt foo.bak").
user18911