Linux komut satırı en iyi uygulamalar ve ipuçları?


112

Linux komut satırınızı (CLI) en iyi uygulamalarını ve ipuçlarını biriktirecek bir tartışma açmak istiyorum.

Aşağıdaki yorumu paylaşmak için böyle bir tartışma aradım ancak bu yazıyı bulamadım.

Umarım hepimiz bundan öğrenebiliriz.

Bash ipuçlarını, grep, sed, AWK, / proc ve diğer tüm Linux / Unix sistem yönetimini, kabuk programlama en iyi uygulamalarını hepimiz yararına paylaşmak için bekliyoruz.


Neden sadece Linux? Unix'in hemen hemen tüm lezzetlerinde birçok ipucu faydalı olabilir.
mouviciel

Bu soru biraz geniş olabilir - tüm kitapları doldurmak için Linux / Unix komut satırının en iyi uygulamalarına yetecek kadar var ...
Jonik

Linux'a uygulanabilecek unix ipuçlarının da memnuniyetle karşılanacağını kabul ediyorum, çünkü linux yazdım. B. Çünkü son yıllarda daha geniş kitlelere maruz kalıyor ve daha sonra tek kelimeyle bir araya geliyor.
Maxim Veksler

İnsanların kullandığı en yararlı ve ilginç komutların bir listesini birleştirmek için harika bir fikir.

Bunlardan herhangi biri alakalı mı? refspecs.freestandards.org

Yanıtlar:


111

GNU Project tarafından geliştirilen ve aynı anda birden fazla terminale sahip olmanızı sağlayacak ücretsiz bir terminal çoklayıcı olan ekranı kullanın .

Bir oturumu başlatabilirsiniz ve bağlantılarınız kaybolduğunda bile terminalleriniz kaydedilir, böylece daha sonra veya evden devam edebilirsiniz.


2
Kullandığım en yaygın anahtarlar, son ekran oturumumu ayırmak ve sürdürmek için 'screen -D -R' ve aynı ekran oturumunu birden fazla oturumdan görüntülemek için 'screen -x'. Ayrıca, dotfiles.org/.screenrc adresinden
Nick Devereaux

4

101

SSH!
SSH tanrı emridir - bence öğrenilecek en değerli genel emirdir. Seçenekler oldukça göz korkutucu olabilir, ancak SSH için sürekli yeni komut satırı seçeneklerini kullanmayı öğrendiğimi sanıyordum. Hepsini bu noktada kullanmış olabilirim.

Ne kadar çok kullanırsanız, o kadar çok şey öğrenirsiniz. İNANILMAZ bazı şeyler yapmak için kullanabilirsiniz.

Not: Tüm bunlar, ssh sunucusunu çalıştırmak dışında, sunucunuzda hiçbir kurulum yapmadan uzaktan yapılabilir.

İnternet üzerinden bir dosya sistemi kurun

SSHFS'de ağda arama

İleri komutlar .

SVN + SSH protokolü, uzaktaki istemciden NO DEAMON üzerinde çalışan bir sunucuya Subversion'dur! SVN komutu sunucuyu ssh kabuğuyla başlatır ve bilgileri mevcut borudan ileri ve geri iletir. Rsync programı aynı şeyi yapar, kendisini SSH ile başlatarak rsync deamon'u bulunmayan bir sunucuya karşı çalışır. Benzer numaralar yapmak için kendi bash dosyalarınızı yazmak kolaydır.

Güvenlik duvarlarından geçmek için zincir

Bunu her zaman evdeki linux sunucumdan mac bilgisayarıma atlamak için kullanıyorum.

Yönlendirme bağlantı noktaları:
Ev güvenlik duvarınızdan sıçrayabileceğinizi ve yönlendiricinizi evde işteyken ev ağınızdan yaptığınız gibi yapılandırabileceğinize kadar, yalnızca orta derecede yararlı görünüyor).

X isteklerini ilet:

Bu başka bir şaşırtıcı. Uzak sisteminizde çalışan bir X sunucusu olsun veya olmasın, bir x-windows programını çalıştırabilirsiniz; pencere yerel ekranınızda belirir. Sadece -X anahtarını kullanın, hepsi bu!

Uzak sunucunuzda çalışan bir X sunucunuzun olması gerekmediğinden, sunucunuzdaki CPU etkisi minimumdur, Windows ve cygwin / X çalıştıran güçlü oyun PC'nizde muazzam uygulamalar sunan bir TINY Linux sunucunuz olabilir.

Tabii ki VI ve EMACS SSH üzerinden çalışıyor, ama ben evde koşarken bazen daha fazlasını istiyorum. Eclipse'in bir kopyasını başlatmak için ssh -X kullanıyorum! Sunucunuz dizüstü bilgisayarınızdan daha güçlüyse, GUI'yi dizüstü bilgisayarınızda oturdurabilirsiniz, ancak derleyiciler sunucunuzda yapılır, bu nedenle sistem yükü hakkında endişelenmeyin.

Toplu iş dosyalarında çalıştır

(yani, diğer sistemlerde "iş yapan" yerel bir toplu iş dosyasını çalıştırın):

Bunu serinletmek için iki şey birleştirilir. Birincisi (daha güvenli) şifreleme anahtarlarını kullanarak şifre taleplerini ortadan kaldırabilmenizdir. İkincisi, SSH CLI'sine bir komut belirleyebilirsiniz. Bunu bazı ilginç şekillerde kullandım - Uzak sunucuda bir derleme başarısız olduğunda, bilgisayarıma SSH koyardım ve bir ses dosyası çalardım).

Çıktıyı uzak komuttan yeniden yönlendirebileceğinizi ve yerel toplu iş dosyanızda kullanabileceğinizi unutmayın, böylece yerel olarak sunucunuzda çalışan bir derlemeyi takip ediyor olabilirsiniz.

Mac'te yerleşik

Hem sunucu hem de istemci hem mac'a hem de linux'a yerleştirilmiştir. Mac ve Ubuntu söz konusu olduğunda, bir sunucuyu etkinleştirmek doğru onay kutusunu bulmak kadar kolaydır.

Bir PC'de cygwin veya cygwin / X kurulumunu yapın (cygwin / X, x-window çıktınızı Linux makinenizden Windows PC'nize iletmenize izin verir - bir X sunucusu kurar)

Önemli İpuçları / config dosyası

Güvenlik duvarınızda asla 22 numaralı bağlantı noktasını kullanmayın. Çok fazla deneme girişiminde bulunacaksınız, buna değmez. Güvenlik duvarınızın sunucunuza farklı bir bağlantı noktası iletmesini sağlayın.

Ssh komutlarınızı önemli ölçüde basitleştirmenize izin veren kapsamlı yapılandırma seçenekleri vardır. İşte işte benim bir örnek:

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

"Ssh home" (başka hiçbir şey) yazdığımda yazmışım gibi davranıyor:

ssh -p 12345 bill@billshome.hopto.org

ve daha sonra yerel 1025 portumu sistemimdeki "mac" sistemime iletiyor. Bunun nedeni, dosyama başka bir giriş yapmam:

Host mac
    hostname localhost
    port=1025

Böylece bir kez "ssh home" yaptım ve hala pencereyi açtım, "ssh mac" yazabiliyorum ve burada çalışan bilgisayar aslında mac'una yönlendirilen kendi 1025 portuna bağlanmaya çalışacak: 22 "öteki komutla, bu yüzden evde Mac'ime firewall ile bağlanacak.

Düzenleme - harika script!

Sevdiğim eski bir senaryoyu kazdım - geri gelmek ve ilgisini çekebilecek biri için buraya göndermek zorunda kaldım. Betik adı "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

Bu komut dosyasını giriş dizininizde varsa ve bağlanabileceğiniz bir ana bilgisayar varsa (ssh aracılığıyla), sonra "./authMe hostName" yazabilirsiniz.

Gerekirse, sizin için bir kamu / özel keypair oluşturacak, sonra diğer makineye ssh açacak ve genel anahtarınızı üzerine kopyalayacaktır (ssh komutu sizi bir parola isteyecektir ...)

Bundan sonra, SSH komutu artık bu uzak sisteme eklerken şifrenizi istememelidir, genel / özel anahtar takımını kullanacaktır.

Uzaktaki bilgisayarınız her zaman güvenli değilse, istendiğinde bir "parola" ayarlamayı düşünmelisiniz.

Ayrıca, ek güvenlik için metin şifrelerine (sadece anahtarlar) izin vermeyecek şekilde ssh sunucusunu uzak uçtan yapılandırmak isteyebilirsiniz.


4
+1 çok güzel ve kompakt bir yazı
Karsten

2
22 numaralı bağlantı noktasındaki SSH hakkında küçük bir not: iyi bir root şifreniz olması ve kullanıcılarınızın korkunç şifreler olmaması kaydıyla, sadece fail2ban (veya benzeri bir şey) çalıştırmak, çatlak girişimlerini engellemek için yeterlidir. SSH'yi başka bir limanda tutmanın can sıkıcı olduğunu gördüm.
David Wolever,

1
Zaman zaman tahriş edici olabilir, ancak bağlantıların hacmi sadece korkunçtu. Bunların üstesinden gelmemeleri gerektiğini biliyorum, ama sanki bir dakika evinize doğru yürürken ve kapı tokmakınızla dalga geçiyorsanız, sadece sinir bozucu biri olsaydı.

Günümüzde ssh'ın çoğu sürümünde son komutunuzun yerleşik bir sürümü var, denir ssh-copy-idve bu kadar basitssh-copy-id user@someserver
JamesHannah

'Ssh mac' hilenizi gerçekleştirmenin bir başka yolu da .ssh / config dosyanızda bir ProxyCommand yönergesi kullanmaktır. Ana bilgisayar mac ProxyCommand ssh -q home "nc% h% p" Bu, evdeki netcat'i (nc) çalıştırır ve ssh bağlantınızı doğrudan mac'a yönlendirir. Zincirleme işini daha kolay buluyorum (örneğin, 'web sunucusu çalışmak' için 'iş
bodrumunu

73

Kullanmayı severim

cd -

önceki dizine geçmek için. Çok kullanışlı!


6
Bunu asla bilemedim! Teşekkürler! İlgili bir notta, bir yığın kir biriktirerek bastır ve çıkar benzer bir şey yap. Bu tür hileler, derin bir dir yapısı etrafında gezinirken yardımcı olur.

Bu tam bir aydınlanma.
Manuel Ferreria

69

Geçenlerde pv, kedi gibi olan ancak aktarma ayrıntılarını içeren komutu (boru görüntüleyici) keşfettim .

Yani yerine

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

Kullanabilirsiniz

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

Operasyonun ne zaman biteceği hakkında hiçbir fikriniz yerine şimdi anlayacaksınız!

Peteris Krumins'in İzniyle


$ Gzip -c access.log> access.log.gz Neden sadece: $ gzip access.log

Oh işe yarıyor :) Ben sadece örnek Peteris'in web sitesinden aldım.
Nick Devereaux,

Eski güzel görünüyor tee(1).
Daniel C. Sobral

Son derece yararlı bir yardımcı program, her zaman unutacağım bir :-(
Patrick


46

Ctrl-R tuşlarına basın ve bir komut yazmaya başlayın (veya herhangi bir bölümünü) - komut geçmişini arar. Ctrl-R tuşlarına tekrar basmak bir sonraki eşleşmeye atlayacaktır, o anda görüntülenen komutu yerine getirecektir ve sağ ok (en azından) önce onu düzenlemenize izin verecektir.

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

Bunu öğrenmeden önce Linux'u ana işletim sistemim olarak 7 yıl gibi bir şey için kullanmıştım, ama şimdi bildiğim için oldukça kullanışlı.


Teşekkürler. Geriye doğru aramayı kullanıyorum ancak bir sonraki maça nasıl atlayacağımı bulamadım.
Adam

Ctrl-S bir sonraki maça atlar. stty -ixonÖncelikle XON / XOFF akış kontrolü anlamını kapatmak için yapmanız gerekebilir (bu aynı zamanda Ctrl-Q 'yu da kullanılabilir kılar, varsayılan olarak Ctrl-V alıntılanmış uçla aynı olacak şekilde eşleştirilir, ancak bunu başka bir şeyle değiştirebilirsiniz) ). Daha fazla bilgi için man sttyve bölümüne bakınız man readline. sttyKomutu eklenebilir~/.bashrc
Dennis Williamson

45

Komut satırı komik bir şey. Komut satırını kullanarak bir başkasını izlerken, yalnızca kendi başınıza ve kazara öğrendiğiniz geri kalanı çok fazla şey öğrenebileceğinizi düşünüyorum.

Kabuğu yıllarca özenle dizinde elle yazarak kullanıyordum. Bir gün bir sistemde bir arkadaşın karışıklığını izliyordum ve sekme tuşuna basmaya devam ediyordu. "Neden sekmeyi vuruyorsun?" Diye sordum. Cevap: dizini veya dosya ismini tamamlamaya çalışır. Kim tahmin ederdi - tab tamamlandı! Bir dosya veya dizinin bir kısmını yazın, sekmeyi tıklayın ve yazdıklarınızı bitirmeye çalışın (davranış olsa da hangi kabuğa bağlıdır).

Bir gün, arkadaşım beni komut satırında izliyordu ve şöyle bir şey yazmamı izledi:

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

Kim tahmin ederdi ki? O hakkında hiç bilmediğim popd/ ' pushd. Sanırım biz bile ...


1
Bana göre sekme tamamlama çok açık, basit bir şey gibi görünüyor, ama popd / pushd'yi de hiç bilmiyordum. Gerçekten de komik. :)
Jonik

3
Ayrıca komutlardan, dosyalardan ve dizinlerden çok daha fazlasını tamamlayabilmek için bu cevaba bakınız: stackoverflow.com/questions/603696//603919#603919
Jonik

1
Bu çok doğru. Bash'ın geriye doğru tarih araştırmasını (ctrl-r) birini izleyerek öğrendim. Daha sonra bir readline özelliği olduğunu fark ettim ve aynı şekilde readline (mysql, gdb, python -i, clisp vb.) İçeren diğer programlarda çalıştı.
sigjuice

2
Yıllar boyunca "kabuğu" nasıl kullanabildin ve sekme tamamlamayı bilmiyorsun?
Prestomation

Pushd / popd ile uğraşırken komut direklerinden bahsetmeyi unutmayın . Pushd / popd yığınında ne olduğunu gösterir.
slm

41

Vim'i öğren.

En iyi editördür (tartışmalı), ancak kesinlikle Linux sunucusunda bulunan en iyi editördür.


1
gvim, aynı zamanda pencerelerde en iyi dosya tarayıcısıdır;)

Bu aynı zamanda, bir keresinde vim'i tanıdığınızdan, çoğu kabuğunu vi-modaya geçirebileceğiniz ve navigasyonun son derece kolay ve hızlı olduğu gibi son derece kullanışlıdır
Patrick

38

Oturumu kapattıktan sonra bile bir programı çalışır durumda bırakmak yararlı olabilir. Bu amaçla nohup veya ekran kullanan bazı çözümler gördüm. Bildiğim en basit şey:

$ your_command_here & disown

Çalışan bir programı da çıkarabilirsiniz:

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

6
Ekranı kullanmak harika çünkü bu uygulamaya daha sonra herhangi bir yerden "yeniden bağlanabilirsiniz".
Prestomation

+1, pişmanlık duymadım.
user18911,

aynen ekranla aynı şeyi yapmama rağmen hayal kırıklığına uğrattım
Andy

38

Takma adı yerine gerçek komutu kullandığımdan emin olmak istediğimde, ters eğik çizgi kullanıyorum:

\rm -rf ~/tmp

Bu "command rm -rf ~ / tmp" ile aynı mı?
Maxim Veksler

"Komut" u bilmiyordum, ama aynı görünüyor.
mouviciel

4
Eh, evet "komutu" Eğer bu durumda \ rm-rf ~ / tmp \ komut rm-rf ~ / tmp kullanması gerekir ki bu durumda takma daha iyi değil sürece
Jamol

@presario ve bunun "/" için bir takma isim yapmasının mümkün olacağını mı düşünüyorsunuz? Ne yazık ki yorumlardan vazgeçemiyorum :)

Ayrıca " builtin" komutuna bakınız .
Dennis Williamson

38

Bu ipucu CLI'nızı daha konforlu hale getirecektir (en azından benim için yapar):

aşağıdaki içeriklere sahip ~ / .inputrc dosyası oluşturun:

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

Bash'i yeniden yükleyin (örneğin, "exec bash" yazarak). Bir komutun ön ekini yazıp yukarı oka basarsanız, ön ekinizden başlayan komutlara göz atacaksınız, örneğin ssh yazdıysanız, eski bağlantılarınızı uzak mermilerle gösterecektir. İsteminiz boşsa, yukarı ok normal tarihe göz atar.


3
Genellikle, bu e [5 ~ ve \ e [6 ~ (aka PAGEUP ve Pagedown) yerine yeniden bağlama oklar \ bağlanan, ancak :) Ctrl-R / CTRL + S daha uygundur
ephemient

+1. Bunları F8'e ve Shift-F8'e cmd.exe'yi taklit etmek için bağladım, ancak aynı prensip geçerli.
user18911,

4
+1 içinexec bash
Dennis Williamson

Aynı zamanda man readlinevarsayılan kısayollarını okumak ve ezberlemek için de
eğiticidir

bind -f ~/.inputrcYeni bir bash başlatmanız ve mevcut ortamınızı silmeniz gerekmeden inputrc'yi yeniden yüklemek için de yapabilirsiniz .
Patrick

36

Aynı anda birden fazla komut yürütürken &&yerine kullanın ;. Bir hata oluştuğunda durur ve diğer komutları yerine getirmez.

Klasik örnek:

./configure && make && make install

1
Bu uygulama çok underrated! Bir kabuk betiğinin her satırını && ile sonlandırmak ve son komut olarak "true" kullanmak standart bir uygulama olmalıdır.
user18911,

3
komik olan ';' hakkında bilmediğim şeydi. daha önce komut - HER ZAMAN '&&' kullandım.
Nick Klauer

4
Kabuk komut dosyalarını "#! / Bin / sh -e" ile başlatabilirsiniz. Bu, herhangi bir hat başarısız olursa durur.
stribika

3
"Else" cümlesi için çift boru kullanabilirsiniz:dosomething && echo "success" || echo "teh fail"
Dennis Williamson

2
Gezegen Debian'da -e'yi shebang hattında kullanmanın kötü bir uygulama olduğuna dair son bir not vardı. Bunun yerine set -e'yi betiğin gövdesinde kullanın. Bu şekilde, sh $ dosyaadı kullanılarak çalışan biri olursa komut dosyası farklı şekilde çalışmaz.
ptman

32

Bash komut satırında döngüler yazarken sık sık 'echo' komutuyla riskli komutları ön eklerim.

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

Bu şekilde, çalıştırmayı taahhüt etmeden önce 'riskli bir şeyi' tam olarak görebiliyorum. Riskli komutunuzun değişken açılımlar ve küreler içerdiğinde yardımcı olur. Ve 'set -x', bash scriptleri yazarken çok kullanışlıdır.

'set -x' hata ayıklamayı mümkün kılar. Keskin hata ayıklama hakkında bilgi için http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html adresini ziyaret edin.


3
Bunu ben de yapıyorum, çok kullanışlı bir numara!
user18911,

1
+1 Bu bir hayat kurtarıcı olabilir! veya veri tasarrufu ...
David Oneill

31

gereklilik

2 sunucu arasındaki maksimum bant genişliğini test etmeniz gerekir.


Çözüm

On Sunucu1 yapın:

nc -u -l 54321 > /dev/null

On Sunucu2'de yapın:

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

Çıktıları göreceksiniz:

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

117 MB / s , gerçek ağ aktarım bant genişliğini gösteren ilginç bir faktördür.

Açıklama :

Paket ağ üzerinden akmaya başlayacağından, SERVER2 üzerinde bant genişliği istatistiklerini görebileceksiniz; bu, 2 sunucu arasındaki gerçek maksimum bant genişliğinin oldukça iyi bir tahminidir.

UDP ile kopyalama (TCP ek yükünü önlemek için).

Kopyalama ile ilgili Sunucu1 bellek (/ dev / zero) için Sunucu2'ın bellek (/ dev / null), böylece dar boğaz haline disk I / O önlenmesi.


4
Yine de, ssh'ın .ssh / config içinde sıkıştırma kullanacak şekilde yapılandırılmadığından emin olun. Aksi taktirde gerçeklerden çok uzakta olan gerçekten güzel rakamlar elde edersiniz ;-)
Joachim Sauer

Evet. Ve SSH, CPU şifreleme ve şifre çözme işlemlerini hızlandıracak, bu da sayıları azaltacak.

yerine netcat kullanın
49'da 3.09

Netcat için +1. SSH
tepegözünüzün

@Saua, @Daniel Von Fange ve @bendin tarafından yapılan önerileri değiştirmek için refactored. Önerileriniz için teşekkür ederim çocuklar.
Maxim Veksler

23

Renk dizini yapılarını görmek kolaydır.

alias ls="ls --color=tty"

Düzenle

alias ls="ls --color=auto"

5
Ben - color = auto'yu tercih ederim, çünkü eğer dosyaya yönlendirilirse çöp kontrol karakterleri göndermez, aynı zamanda eşleşen desenleri vurgulamak için alias grep = "grep --color = auto" komutunu da kullanabilirsiniz.

-Renk = otomatik için +1; Birisi bunun cevabını arttırabilir mi?
Jonik

Bence tty burada otomatik olarak aynı şeyi yapıyor.
joshudson

Rengi yansıtacak şekilde güncellendi = otomatik
Suroot

Garip bir şekilde, renklendirme benim için işleri daha az okunabilir kılıyor. Örneğin sarı-beyaz, iyi bir renklendirme seçeneği değil.

20

Günlük görüntüleme ile ilgili bazı küçük işaretçiler:

  1. Kuyruğu -F'yi , kesildikten sonra günlüğü izlemeye devam etmek için kullanabilirsiniz (örneğin log4j).
  2. Daha az kullanabilirsiniz: Daha az açın, kuyruk davranışını taklit etmek için ÜSTKRKT + F tuşlarına basın. Diğer faydalı bir kombinasyon olup , -S satır kaydırma kaldırmak için. daha az kayıtlarda arama yapmanızı sağlar.

1
Ve tail -faynı anda birden fazla kayıt izleyebilirsin! Örneğin:tail -f log1.txt -f log2.txt
Stu Thompson,

@StuThompson: Teşekkürler. bunu bilmiyordum. Ek olarak, vanheusden.com/multitail
Maxim Veksler

20

Bir dosyanın uzantısını kolayca değiştirmek için bir süredir arkadaştan bir numara öğrendim :

mv my_filename.{old,new}

Kabuk genişlemesi bunu şu şekilde genişletir:

mv my_filename.old my_filename.new

Bu, bir dosyayı başka bir şey eklemek gibi başka şekillerde de yeniden adlandırmak için de kullanılabilir:

mv my_{,cool_}filename

6
Aynı komutta herhangi bir joker karakter veya başka desen ifadeleri koymamaya dikkat edin, yoksa küre sadece 2 argümandan daha fazlasını genişletebilir! mv *. {eski, yeni} gerçekten şaşırtıcı sonuçlar doğurabilir.

Evet, kabul etti - bu önemli bir uyarıdır :)

2
Ayrıca, örneğin, ls -l /bin/cAlt-Shift- {tuşlarına basarak da yazabilirsiniz ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}.
Dennis Williamson

19

Sıkıştırılmış arşivleri çıkarmak için "tar xf" kullanın. Bzip2 için j ve gzip için z gerekli değildir, çünkü tar, arşivinizin dosya türünü algılar. Bağımsız değişkenlerden önce '-' işareti de yoktur. Çok fazla zaman kazandıracak (bir binyıl ;-)).

Daha da iyisi, gereksiz argümanlar olmadan tek bir komut ile herhangi bir arşivi çıkarmak için unfoo kullanın.


Evet, var alias ut="tar xf"- arşivlerin çıkartılmasını daha da kolaylaştırıyor.
David Wolever,

Kullanırsanız, bazı RHEL dağıtımlarında bu başarısız olur.
pvsnp

Yeni katran ayrıca xz (7zip tabanlı) arşivlere sıkıştırmak için "J" anahtarına da sahip
Hubert Kario

: Ya unp yüklemek packages.debian.org/sid/unp . Sanırım unfoo'ya benziyor.
Zitrax,

17

Bash tamamlama paketini kurun. Kabuk için önceden tanımlanmış bir takım tamamlama kuralları içerir. Distro sizin için yapmazsa "source / etc / bash_completion" yazarak etkinleştirin. Daha sonra, örneğin, kpdf'den sonra ne zaman tamamladığınızda yalnızca bir dizin ve PDF dosyası listesi göreceksiniz. Scp ssh: // server / XXX komutundan sonra uzaktaki dosyaları tamamlamak kadar akıllıdır (eğer şifresiz girişleri etkinleştirdiyseniz).


17

Bunları sürekli kullanırım

ALT-. (ESC +. Bazı terminallerde) son kullanılan argümanı kopyalar (çok kullanışlı)

CTRL-W sözcüğü siler

CTRL-L terminali temizle (net komut gibi ama daha hızlı)

ALT-B (bazı terminallerde ESC + B) bir kelime geriye doğru gider

ALT-F (bazı terminallerde ESC + F) bir kelime ileri gider

CTRL-E, EOL'ye atlar

CTRL-A BOL’a atlama

Tarihte CTRL-R araması


1
Kısayolları paylaştığınız için teşekkür ederiz! ALT-B / F'nin Mac'te çalışmasını almadım.
Léo Léopold Hertz

Korku veren adam ....
Daud Ahmad Khokhar

16

Kısacası, ben kullanırım ! $ Çok. Son komutun son argümanını tekrarlar:

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

Ls'yi çalıştıracak, sonra düzenlemek istiyorsanız, yeniden yazmak zorunda değilsiniz! Bu, uzun yol / dosya adları için gerçekten kullanışlıdır. Ayrıca ,! * Önceki komutun tüm argümanlarını tekrarlar. Bunu pek kullanmıyorum, ama işe yarar görünüyor.

Bahsettiklerini biliyordum ama vim, screen ve cd kullanıyorum.

Noclobber'ı unuttum:

set -o noclobber

Gönderen adam bash :

Ayarlanırsa, bash,>,> & ve <> yeniden yönlendirme işleçleriyle mevcut bir dosyanın üzerine yazmaz. Yeniden yönlendirme işlecini kullanarak çıktı dosyaları oluştururken bu geçersiz kılınabilir> | yerine>.


6
$! Kullanmıyorum, çünkü parmağınızı yağlamak gerçekten çok kolay, ancak vurmaktan hoşlanıyorum ^ [-. (kaçış dönemi) aynı etkiyi elde etmek için.
David Wolever,

7
Klavyenize, vb. Bağlı Alt-.olarak da yapabilirsiniz .
Dennis Williamson

Omg, küçük orgazm, Ty Dennis!
artifex 11.03.2010

14

Bash'dan zsh'ye geçin ve verimliliğinizi artırın:

  • Gerçekten akıllı, komut dosyası oluşturulabilir sekme tamamlama. Sadece komut satırlarını değil tüm seçenekleri, man sayfalarının adlarını, paket adlarını (apt-get / emerge vb. İçin) tamamlar ve neyin var. Ve tamamlama sırasındaki seçeneklerin yararlı bir açıklamasını sağlar. Bütün bunlar komut verildikten sonra herhangi bir kaydırma alanı kullanmadan.
  • Joker karakterlerin sekmesi; cat * .txt yazın, sekme tuşuna basın ve ifadeyle eşleşen dosyalar arasında seçim yapın.
  • Sadece isimlerini yazarak dizinleri değiştirin.
  • Birkaç satır editörü modu. İsterseniz vi ya da emacs gibi davranabilirsiniz.
  • Özelleştirilebilir anahtar bağlantıları, istediğiniz şeyi yapın.
  • Ekranın sağ tarafına bilgi istemi koyma ve uzun komut yazarken otomatik olarak gizlenmesini sağlama dahil olmak üzere tematik bilgi istemleri

Google size daha fazla fayda sağlayacaktır.


1
daha sonra bir link vermelisin. ilginç geliyor, ama bana sat adamım!

Unicode desteği eklemeyi başardılar mı?

@Cory Tamam, sadece intihal etmek istemedim ve zaten başkaları tarafından yazılmış çok güzel şeyler varken kendi

@kyku evet, belki bir yıl öncesinden beri uygun bir unicode desteği var.

havalı görünüyor. Bir şans vereceğim!

13

Eski okul, bir dizin ağacını bir yerden diğerine taşımak, sembolik bağları, izinleri ve tüm bu iyi şeyleri korumak:

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

veya ağ üzerinden

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

Yeni okul:

rsync -urltv . /destination

veya ağ üzerinden

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

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Biraz daha az yazarak ve ssh üzerinde kullanımı daha kolay.
efemient

1
-a '-rlptgoD' ile aynıdır - bu yinelemelidir, sembolik bağlantıları sembolik olarak kopyalamak, izinleri korumak, zaman damgalarını korumak, grupları korumak, sahipleri korumak, cihaz dosyalarını kopyalamak ve özel dosyaları cihaz ve özel dosyalar olarak kullanmaktır. Ayrıca, makineler arasında, -z (göndermeden önce dosyaları sıkıştır, aldıktan sonra sıkıştırmayı aç) yararlıdır. rsync -avz [-e ssh] arkadaşın :-)
dr-jan

-Z ssh üzerinde bir şey yapar mı? Ben öyle düşünmezdim.
Paul Tomblin

rsync -avhTek bir makinede en iyisidir - hçok sayıda dosyaya sahipseniz çok fazla bellek kullanabiliyor olsa da, her bağlantıyı ayrı bir dosyaya dönüştürmeden sabit bağlantıların doğru şekilde aktarılmasını sağlar. rsync -avzh . foo.com/destinationağ için eşdeğerdir ve genellikle -e sshrsync komutunun ssh kullanacağını bilmesi gerekmez .
RichVel

Aslında, bugünlerde kullanıyorumrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

Gereksinim : Silmek istediğiniz büyük dosya listesini içeren bir dizininiz var. rm -r başarısız olacak!

örnek

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

Çözüm :

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

Açıklama :

Düzenleme: @ephemient yorumunu izleyen açıklama düzeltildi.

find, izin verilen maksimum argümanlarla rm'ye argüman sağlayacak. Bu, rm'nin bulmayı kendisinin -delete işlemini kullanmadan bildiğim en hızlı teknik olan kümelerdeki dosyaları silmesine olanak tanır. Eşittir

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

hangi senin eğer yararlı olabilecek finddesteklemez -exec ... +.


5
Değiştir \;ile +: o zaman findne yapacaksın xargsmümkün olduğunca (argüman listesi sınırı üzerinde çalışan olmadan) kadar toplu yukarı argümanlar olduğu varsayılan olarak yapar. Ya da sadece kullanmak -deleteKoşma -exec rm(her ikisi için gerekli GNU Findutils)
ephemient

İyi ipucu - '+' tanesini bilmiyordum.
codeinthehole

@ephemient: İyi yorum, yazıyı düzenledim.
Maxim Veksler

2
İlginç, '+' duymadım.
user18911,

ya da sadece find ... -delete, eğer bu kadar bilginiz varsa.
David Wolever,

11

Bu iki ipucunu o kadar sık ​​kullanıyorum ki paylaşmanın iyi bir fikir olacağını düşündüm:

!foo

"Foo" ile başlayan tarihçe dosyasında son komutu çalıştıracak ( !gccÖrneğin , derlerken sıklıkla kullanıyorum .)

Diğeri klavye kısayoludur (Dönüş yerine Ctrl + O), bu işlem HİÇBİRİ komutunu çalıştıracak ve geçmiş dosyasında bir sonraki komutu görüntüleyecektir. Örneğin, bir dosyayı derlerken ve test ederken her zaman 3 veya 4 komut yaparım, make, testin dizinine cd yapın, testi çalıştırın, cd'nin makefile dizinine. Ctrl + O kullanmak bu görevi çok kolaylaştırıyor :)

Umarım bu yardım!


1
Ctrl-O için +1
Dennis Williamson

10

Linux'ta yıkımı, mümkün olamayacak olan fantezi grafiksel arayüzlerin yardımı olmadan kullanma.

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

Bu, birçok geliştiricinin yeterince garip bir şekilde Linux kullanmasını engellemektedir.


rapidsvn, Linux altında svn için güzel bir küçük gui.

Pek çok fantezi, güçlü GUI kesinlikle mevcuttur (IntelliJ IDEA'da olduğu gibi), ancak bu ya da komut satırını kullanma olasılığını seviyorum (aynı zamanda güçlü, ama farklı şekilde) - hangisi mevcut duruma daha
uygunsa

Şimdiye kadar en sevdiğim NautilusSVN (çok TortoiseSVN gibi): code.google.com/p/nautilussvn
user7655

10

En çok gözden kaçırılan eski okul emri: find

Dün brüt izinler hatasını tamir ettim:

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

Evet! Find komutunu öğrenin. Xargs ile karışık bul, sed ve awk bir dosya işleme juggernaut'u hazırlar!
Jonathon Watney

Kabul! Sed ve awk hakkında hiçbir şey hatırlamama rağmen - her zaman yeniden öğrenmeye ihtiyacım var! Gerçekten bir kopya kağıdı basmalıyım.

Evet, ancak olağandışı karakterler içeren dosya adlarını içeren zorlu problemleri önlemek için xargs'a -print0 ve -0 seçeneğini kullanmayı unutmayın.
user18911,

Evet, muhtemelen kullanmak yarım saat aptalca izin şeyleri düzeltmek için var bulmak: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
İzinleri belirli bir şekilde belirlenmiş olan dosyaları bulma -permseçeneğini unutmayın find.
Dennis Williamson

8

Gibi kabukları için bashve ksh, komut satırı, metin editörü gibi navigasyon komutlarına yanıt yapabilirsiniz:

set -o emacs

veya

set -o vi

Geçmişinizde arama yapmanıza ve komut satırında metin dosyalarında yaptığınız gibi hareket etmenize olanak sağlar (örneğin vi modunda, ESCdaha sonra yazarak /string"string" için önceki komutlarınızı arar - kullanabilirsiniz nve Ntaşımak için maçlar arasında)


Küçük yazım hatası: "test editörü" "metin editörü" olmalı

8

grep benim arkadaşım. Ciddi anlamda.

.rbMetni içeren dosyaları listele class foo:

grep -l "class foo" .rb

Liste .rbdosyaları yok metni içeren class foo:

grep -L "class foo" *.rb

Liste .rbdosyaları yok foo veya çubuğu içeriyor (eğer -e ile herhangi Regexp'i kullanabilirsiniz, ancak operatörler kaçmak gerekir):

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

Grep ile aynı şeyi yapan ancak yinelemeli olarak sadece kaynak dosyaları tarayacak olan "ack" adlı bir araçla ilgilenebilirsiniz. Bir deneyin (ücretsiz): betterthangrep.com

8

Kabuk değişimi ile yapılır ^:

/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
Aslında "!!: gs / foo / bar" ı tercih ederim, çünkü foo'nun önceki komutta birden fazla defadan söz edildiğini ve genel bir değiştirme (örneğin "mv foo.txt foo.bak") istediğimi buldum.
user18911,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.