Best practice e suggerimenti per la riga di comando di Linux?


112

Vorrei aprire una discussione che accumulerebbe le migliori pratiche e suggerimenti sulla riga di comando di Linux (CLI).

Ho cercato una discussione del genere per condividere il commento qui sotto ma non ne ho trovato uno, quindi questo post.

Spero che tutti potremmo imparare da questo.

Ti invitiamo a condividere i tuoi suggerimenti Bash, grep, sed, AWK, / proc e tutte le altre amministrazione di sistema Linux / Unix correlate, le migliori pratiche di programmazione della shell a beneficio di tutti noi.


Perché solo Linux? Molti consigli possono essere utili su quasi tutti i gusti di Unix.
mouviciel,

Questa domanda potrebbe essere un po 'ampia - ci sono abbastanza buone pratiche da linea di comando Linux / Unix per riempire interi libri ...
Jonik

Sono d'accordo sul fatto che anche i suggerimenti unix che possono essere applicati a Linux sono i benvenuti, ho scritto Linux perché A. Questo è ciò con cui lavoriamo qui. B. perché sta guadagnando un'esposizione pubblica più ampia di unix negli ultimi anni.
Maxim Veksler,

Penso che sia un'ottima idea comporre un elenco dei comandi più utili e interessanti che le persone usano.

Qualcuno di questi è rilevante? refspecs.freestandards.org

Risposte:


111

Usa lo schermo , un multiplexer terminale gratuito sviluppato dal Progetto GNU che ti permetterà di avere diversi terminali in uno.

È possibile avviare una sessione e i terminali verranno salvati anche quando si perde la connessione, in modo da poter riprendere in seguito o da casa.


2
Gli switch più comuni che utilizzo sono 'screen -D -R' per staccare e riprendere la mia ultima sessione dello schermo e 'screen -x' per visualizzare la stessa sessione dello schermo da più accessi. Inoltre, procuratevi un bel .screenrc da dotfiles.org/.screenrc
Nick Devereaux

4
Un'altra cosa bella dello schermo è che puoi condividere un terminale con altre persone quando vuoi collaborare a qualcosa, usando lo schermo -x
gareth_bowles

101

SSH!
SSH è il comando di dio - penso che sia il comando più prezioso da imparare. Le opzioni possono essere piuttosto scoraggianti, ma sembra che io impari costantemente ad usare nuove opzioni della riga di comando per SSH che non avrei mai pensato fossero necessarie. Potrei averli usati tutti a questo punto.

Più lo usi, più ne impari. Puoi usarlo per fare alcune cose INCREDIBILI.

Nota: TUTTE queste cose sono eseguibili in remoto senza alcuna configurazione sul server tranne che per avere il server SSH in esecuzione.

Montare un file system su Internet

cerca in rete SSHFS

Comandi avanzati .

Il protocollo SVN + SSH è Subversion da un client remoto a un server su cui NON è in esecuzione DEAMON! Il comando SVN avvia il server attraverso la shell ssh e passa le informazioni avanti e indietro attraverso la pipe esistente. Il programma rsync fa la stessa cosa, gira su un server senza alcun rsync deamon avviandolo da solo tramite SSH. È facile scrivere i tuoi file bash per fare trucchi simili.

Catena per superare i firewall

Lo uso sempre per passare dal mio server Linux a casa al mio mac.

Porte forward:
sembra solo moderatamente utile finché non ti rendi conto che puoi rimbalzare attraverso il firewall di casa e configurare il router a casa dal lavoro come se lo stessi facendo all'interno della tua rete domestica).

Inoltra richieste X:

Questo è un altro fantastico. Con o senza un server X in esecuzione sul tuo sistema remoto, puoi eseguire un programma x-windows e la finestra apparirà sullo schermo locale. Basta usare l'interruttore -X, tutto qui!

Poiché non è necessario disporre di un server X in esecuzione sul server remoto, l'impatto della CPU sul server è minimo, è possibile disporre di un server TINY Linux che offra enormi app al tuo potente PC di gioco con Windows e Cygwin / X.

Naturalmente VI ed EMACS funzionano su SSH, ma quando corro a casa, a volte ne voglio di più. Uso ssh -X per avviare una copia di Eclipse! Se il tuo server è più potente del tuo laptop, hai la GUI posizionata proprio lì sul tuo laptop, ma le compilazioni sono fatte sul tuo server, quindi non preoccuparti del caricamento del sistema.

Esegui in file batch

(significa eseguire un file batch locale che "fa cose" su altri sistemi):

Due cose si combinano per rendere questo fantastico. Uno è che è possibile eliminare le richieste di password utilizzando chiavi di crittografia (più sicure). Il secondo è che è possibile specificare un comando sulla CLI SSH. L'ho usato in alcuni modi interessanti - Come quando una compilazione fallisce sul server remoto, la vorrei inserire nel mio computer e riprodurre un file audio).

Ricorda che puoi reindirizzare l'output dal comando remoto e usarlo all'interno del tuo file batch locale, in modo da poter anche localizzare localmente una compilazione in esecuzione sul tuo server.

Integrato su Mac

Sia il server che il client sono integrati sia in mac che in linux. Nel caso di Mac e Ubuntu, abilitare un server è semplice come trovare la casella di controllo corretta.

Su un PC installa cygwin o cygwin / X (cygwin / X ti consentirà di inoltrare l'output di x-window dal tuo computer Linux al tuo PC Windows - installa un server X)

Suggerimenti / file di configurazione importanti

Non utilizzare mai la porta 22 sul firewall. Avrai un sacco di tentativi di hacking, non ne vale la pena. Chiedi al firewall di inoltrare una porta diversa al tuo server.

Esistono numerose opzioni di configurazione che ti consentono di semplificare in modo significativo i tuoi comandi ssh. Ecco un mio esempio al lavoro:

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

Quando digito "ssh home" (nient'altro), si comporta come se avessi digitato:

ssh -p 12345 bill@billshome.hopto.org

e quindi inoltra la mia porta locale 1025 al mio sistema "mac" a casa. Il motivo è che ho un'altra voce nel mio file:

Host mac
    hostname localhost
    port=1025

così una volta che ho fatto una "ssh home" e ho ancora la finestra aperta, posso digitare "ssh mac" e il computer al lavoro qui proverà effettivamente a connettersi alla propria porta 1025 che è stata inoltrata a "mac: 22 "dall'altro comando, quindi si collegherà al mio Mac a casa attraverso il firewall.

Modifica - bel copione!

Ho scoperto una vecchia sceneggiatura che adoro, dovevo tornare e pubblicarla per chiunque fosse interessato. Lo script si chiama "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

Se hai questo script nella tua home directory e c'è un host a cui puoi connetterti (tramite ssh), allora puoi digitare "./authMe hostName".

Se necessario, creerà una coppia di chiavi pubblica / privata per te, quindi si sposterà sull'altra macchina e copierà la tua chiave pubblica (il comando ssh ti chiederà una password ...)

Dopodiché, il comando SSH non dovrebbe più chiedere la tua password quando ti colleghi a quel sistema remoto, userà la coppia di chiavi pubblica / privata.

Se il tuo computer remoto non è sempre sicuro, dovresti considerare di impostare una "passphrase" quando richiesto.

È inoltre possibile configurare il server SSH sul lato remoto per non consentire le password di testo (solo chiavi) per maggiore sicurezza.


4
+1 post molto bello e compatto
Karsten

2
Una piccola nota su SSH sulla porta 22: a condizione che tu abbia una buona password di root e che i tuoi utenti non abbiano password terribili, basta eseguire fail2ban (o qualcosa di simile) per evitare tentativi di crack. Ho trovato davvero fastidioso mantenere SSH su un'altra porta.
David Wolever,

1
A volte può essere irritante, ma il volume delle connessioni era spaventoso. So che non dovrebbero passare, ma è un po 'come se avessi qualcuno che camminava fino a casa tua e giocava con la maniglia della porta ogni minuto - solo snervante.

C'è una versione integrata del tuo ultimo comando nella maggior parte delle versioni di ssh al giorno d'oggi, si chiama ssh-copy-ided è semplice comessh-copy-id user@someserver
JamesHannah,

Un altro modo di fare il tuo trucco 'ssh mac' è usare una direttiva ProxyCommand nel tuo file .ssh / config. Host mac ProxyCommand ssh -q home "nc% h% p" Questo eseguirà netcat (nc) su home e reindirizzerà la tua connessione ssh direttamente su mac. Trovo quelli più facili da incatenare (ad esempio se è necessario connettersi a 'home' per arrivare a 'work bastion' per arrivare a 'work web server'.
toppledwagon

73

Mi piace usare

cd -

per passare alla directory precedente. Molto utile!


6
Non l'ho mai saputo! Grazie! In una nota correlata, pushd e popd fanno qualcosa di simile, costruendo una pila di dirs. Questo tipo di trucchi aiuta quando si naviga in una struttura di dir profonda.

Questa è pura illuminazione.
Manuel Ferreria,

69

Recentemente ho scoperto il pvcomando (pipe viewer) che è come cat ma con dettagli di trasferimento.

Quindi invece di

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

Puoi usare

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

Quindi, invece di non avere idea di quando l'operazione finirà, ora lo saprai!

Per gentile concessione di Peteris Krumins


$ gzip -c access.log> access.log.gz Perché non solo: $ gzip access.log

Oh, funziona :) Ho appena preso l'esempio dal sito Web di Peteris.
Nick Devereaux,

Sembra un buon vecchio tee(1).
Daniel C. Sobral,

Utilità estremamente utile, di cui mi dimentico sempre :-(
Patrick


46

Premi Ctrl-R e inizia a digitare un comando (o parte di esso): cerca nella cronologia dei comandi. Premi di nuovo Ctrl-R per passare alla corrispondenza successiva, invio esegue il comando attualmente visualizzato e la freccia destra (almeno) ti permetterà di modificarlo per primo.

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

Avevo usato Linux per 7 anni come il mio sistema operativo principale prima di conoscerlo, ma ora che lo so, è abbastanza utile.


Grazie. Ho usato la ricerca inversa, ma non sono stato in grado di capire come passare alla partita successiva.
Adam

Ctrl-S passa alla corrispondenza successiva. Potresti dover fare stty -ixonprima di tutto per disattivare il significato del controllo di flusso XON / XOFF (questo rende anche Ctrl-Q disponibile, per impostazione predefinita è mappato per essere lo stesso di Ctrl-V quoted-insert, ma puoi cambiarlo in qualcos'altro ). Vedi man sttye man readlineper maggiori informazioni. Il sttycomando può essere aggiunto al tuo~/.bashrc
Dennis Williamson il

45

La riga di comando è una cosa divertente. Penso che puoi imparare così tanto da solo e tutto il resto che impari per caso guardando qualcun altro usando una riga di comando.

Per anni ho usato la shell digitando scrupolosamente i nomi delle directory a mano. Un giorno stavo guardando un amico fare casino su un sistema e continuava a premere il tasto Tab. Ho chiesto "perché stai colpendo scheda?". Risposta: tenta di completare la directory o il nome file. Chi avrebbe indovinato - completamento tab! Digita un po 'del file o della directory, premi la scheda e proverà a finire ciò che hai digitato (il comportamento dipende da quale shell però).

Un giorno, un amico ha detto che mi stava guardando dalla riga di comando e mi ha visto digitare qualcosa del tipo:

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

Chi avrebbe indovinato !? Non ha mai saputo di popd/ pushd. Immagino che siamo persino ...


1
Per me il completamento delle schede sembra qualcosa di "ovvio", molto semplice, ma non ho mai saputo neanche di popd / pushd. Davvero divertente. :)
Jonik

3
Si veda anche questa risposta per essere in grado di completare tab-molto di più di comandi, file e directory: stackoverflow.com/questions/603696//603919#603919
Jonik

1
È così vero. Ho imparato a conoscere la storia-ricerca-indietro di bash (ctrl-r) guardando qualcuno. In seguito mi sono reso conto che si trattava di una funzione readline e ho funzionato allo stesso modo in altri programmi che incorporano readline (mysql, gdb, python -i, clisp ecc.).
sigjuice,

2
Come hai potuto usare "la shell" per anni e non conoscere il completamento delle schede?
prestomation

Quando si ha a che fare con pushd / popd, non dimenticare di menzionare i dirs di comando . Mostra cosa c'è nello stack pushd / popd.
slm,

41

Scopri Vim.

È (senza dubbio) il miglior editor, ma sicuramente il miglior editor disponibile su un server Linux nudo.


1
gvim è anche il miglior browser di file su Windows;)

Questo è anche estremamente utile poiché una volta che conosci vim, puoi mettere la maggior parte delle shell in modalità vi e la navigazione diventa estremamente facile e veloce
Patrick

38

A volte è utile lasciare un programma in esecuzione anche dopo aver effettuato il logout. Ho visto alcune soluzioni che usano nohup o addirittura lo schermo per quello scopo. Il più semplice che conosco è:

$ your_command_here & disown

Puoi anche staccare un programma in esecuzione:

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

6
L'uso dello schermo è fantastico perché puoi "riconnetterti" a quell'app da qualsiasi luogo in un secondo momento.
prestomation

+1, non avevo sentito parlare di rinnegamento.
user18911

ripeto, anche se faccio già lo stesso con lo schermo
Andy,

38

Quando voglio essere sicuro di utilizzare un comando effettivo e non un alias, utilizzo una barra rovesciata iniziale:

\rm -rf ~/tmp

è lo stesso di "command rm -rf ~ / tmp"?
Maxim Veksler,

Non sapevo "comando", ma sembra lo stesso.
mouviciel,

4
Beh, sì, a meno che il "comando" non sia alias nel qual caso dovresti usare \ command rm -rf ~ / tmp in quel caso \ rm -rf ~ / tmp è meglio
Jamol

@presario e pensi che sarebbe possibile creare un alias per "/"? Che peccato non poter votare i commenti :)

Vedi anche il comando simile " builtin".
Dennis Williamson,

38

Questo suggerimento renderà la tua CLI più comoda (almeno per me):

creare il file ~ / .inputrc con i seguenti contenuti:

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

Ricarica bash (ad esempio digitando "exec bash"). Quando si digita un prefisso di un comando e si preme la freccia su, verranno visualizzati i comandi che iniziano con il prefisso, ad esempio se si digita ssh verranno visualizzate le connessioni precedenti con shell remote. Se il tuo prompt è vuoto, la freccia su sfoglierà la cronologia in modo normale.


3
Di solito li associo a \ e [5 ~ e \ e [6 ~ (aka pageup e pagedown) invece di ricollegare le frecce, ma è più conveniente di Ctrl-R / Ctrl-S :)
effimero

+1. Ho legato questi a F8 e Shift-F8 per imitare cmd.exe, ma si applica lo stesso principio.
user18911

4
+1 perexec bash
Dennis Williamson,

È anche istruttivo leggere man readlinee memorizzare le scorciatoie predefinite
SaveTheRbtz,

Puoi anche fare bind -f ~/.inputrcper ricaricare inputrc senza dover iniziare una nuova bash e cancellare il tuo ambiente attuale.
Patrick

36

Utilizzare &&invece di ;quando si eseguono più comandi contemporaneamente. Si interrompe quando si verifica un errore e non esegue gli altri comandi.

Esempio classico:

./configure && make && make install

1
Questa pratica è così sottovalutata! Dovrebbe essere prassi normale terminare ogni riga di uno script di shell con && e usare "true" come comando finale.
user18911

3
la cosa divertente è che non sapevo del ';' comando prima - Avevo SEMPRE usato '&&'.
Nick Klauer,

4
È possibile avviare gli script di shell con "#! / Bin / sh -e". Questo si interrompe se una linea fallisce.
stribika,

3
Puoi usare una doppia pipe per la clausola "else":dosomething && echo "success" || echo "teh fail"
Dennis Williamson,

2
C'è stata una recente nota su Planet Debian secondo cui è una cattiva pratica usare -e sulla linea shebang. Usa invece set -e nel corpo dello script. In questo modo lo script non funziona in modo diverso se qualcuno si imbatte in sh $ nomefile.
ptman,

32

Quando scrivo loop sulla riga di comando in bash, spesso ho il prefisso comandi rischiosi con il comando 'echo'.

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

In questo modo riesco a vedere il "qualcosa di rischioso" per intero prima di impegnarmi a eseguirlo. Aiuta quando il tuo comando rischioso include espansioni e globs variabili. E 'set -x' è molto utile quando si scrivono script bash.

'set -x' abilita il debug. Vedi http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html per informazioni sul debug di bash.


3
Faccio anche questo, trucco molto utile!
user18911

1
+1 Questo può essere un salvavita! o risparmiatore di dati ...
David Oneill

31

Requisiti

È necessario testare la massima larghezza di banda tra 2 server.


Soluzione

Su SERVER1 eseguire:

nc -u -l 54321 > /dev/null

Su SERVER2 fai:

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

Vedrai un output come:

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

117 MB / s è il fattore interessante qui, che mostra l'effettiva larghezza di banda del trasferimento di rete.

Spiegazione :

Man mano che il pacchetto inizierà a fluire sulla rete, sarà possibile visualizzare le statistiche sulla larghezza di banda su SERVER2, che è una stima abbastanza buona della larghezza di banda massima effettiva possibile tra i 2 server.

Copia da UDP (per evitare l'overhead TCP).

Copia dalla memoria (/ dev / zero) su SERVER1 alla memoria (/ dev / null) su SERVER2, evitando così che l'I / O del disco diventi il ​​collo di bottiglia.


4
Assicurati che ssh non sia configurato per usare la compressione in .ssh / config ', comunque. Altrimenti otterrai numeri davvero belli che sono molto lontani dalla verità ;-)
Joachim Sauer

LOL si. E SSH martellerà la tua crittografia e decrittografia della CPU, il che eliminerà anche i numeri.

usa invece netcat
bendin

+1 per netcat. il sovraccarico di SSH
inclinerà i

Rifattorizzato per modificare i suggerimenti di @saua, @Daniel Von Fange e @bendin. Grazie per i vostri suggerimenti ragazzi.
Maxim Veksler

23

Vedere le strutture delle directory dei colori è più semplice.

alias ls="ls --color=tty"

modificare

alias ls="ls --color=auto"

5
Preferisco --color = auto perché non ha inviato caratteri di controllo della spazzatura se il reindirizzamento al file è possibile anche fare alias grep = "grep --color = auto" per evidenziare i pattern corrispondenti.

+1 per --color = auto; qualcuno potrebbe aumentare la risposta con quello?
Jonik

Penso che tty faccia la stessa cosa di auto qui.
joshudson,

Aggiornato per riflettere il colore = auto
Suroot

Stranamente, la colorazione rende le cose molto meno leggibili per me. Il giallo su bianco, ad esempio, non è una buona scelta di colorazione.

20

Alcuni piccoli suggerimenti relativi alla visualizzazione dei registri:

  1. Puoi usare tail -F per continuare a guardare il registro dopo che è stato troncato (ad esempio log4j).
  2. Puoi usare meno: Apri meno, fai clic MAIUSC + F per emulare il comportamento della coda. Anche una combinazione utile è -S per disabilitare il ritorno a capo. less ti consentirà di cercare nei registri.

1
E con tail -fte puoi guardare più registri contemporaneamente! Ad esempio:tail -f log1.txt -f log2.txt
Stu Thompson,

@StuThompson: grazie. non lo sapevo. Inoltre, potresti voler controllare vanheusden.com/multitail
Maxim Veksler,

20

Ho imparato un trucco da un amico molto tempo fa per cambiare facilmente l'estensione di un file:

mv my_filename.{old,new}

L'espansione della shell lo espanderà a:

mv my_filename.old my_filename.new

Questo può anche essere usato per rinominare un file in altri modi, come aggiungere qualcosa in:

mv my_{,cool_}filename

6
Basta essere sicuri di non inserire caratteri jolly o altre espressioni di pattern nello stesso comando, altrimenti il ​​glob potrebbe espandersi a più di 2 soli argomenti! mv *. {vecchio, nuovo} probabilmente produrrà risultati davvero sorprendenti.

Sì, d'accordo - questo è un avvertimento importante :)

2
Puoi anche digitare, ad esempio, ls -l /bin/cquindi premere Alt-Shift- {e lo completerà con qualcosa di simile ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}a te.
Dennis Williamson,

19

Utilizzare "tar xf" per estrarre archivi compressi. J per bzip2 e z per gzip non sono necessari, poiché tar rileverà il tipo di file del tuo archivio. Né è il segno "-" prima degli argomenti. Risparmierai molto tempo (oltre un millennio ;-)).

Meglio ancora usare unfoo per estrarre qualsiasi archivio con un singolo comando senza argomenti inutili.


Sì, ho alias ut="tar xf"- rende l'estrazione degli archivi ancora più semplice.
David Wolever,

Questo non riesce su alcune distribuzioni RHEL, se le usi.
pvsnp,

Il nuovo tar ha anche un interruttore "J" per la compressione in archivi xz (basati su 7zip)
Hubert Kario

Oppure installa unp: packages.debian.org/sid/unp . Immagino sia simile a unfoo.
Zitrax,

17

Installa il pacchetto bash-completamento. Contiene una serie di regole di completamento predefinite per la shell. Abilitalo digitando "source / etc / bash_completion" se la distro non lo fa per te. Quindi, ad esempio ogni volta che completi dopo kpdf vedrai solo un elenco di directory e file PDF. È intelligente come completare i file remoti dopo scp ssh: // server / XXX (se hai abilitato gli accessi senza password).


17

Uso costantemente questi

ALT-. (ESC +. In alcuni terminali) copia l'ultimo argomento usato (super utile)

CTRL-W cancella la parola

Terminale clear CTRL-L (come comando clear ma più veloce)

ALT-B (ESC + B in alcuni terminali) si sposta indietro di una parola

ALT-F (ESC + F in alcuni terminali) si sposta in avanti di una parola

CTRL-E passa a EOL

CTRL-A passa a BOL

Ricerca CTRL-R nella cronologia


1
Grazie per aver condiviso le scorciatoie! Non riesco a far funzionare ALT-B / F su Mac.
Léo Léopold Hertz

Uomo fantastico ....
Daud Ahmad Khokhar

16

In bash, uso molto ! $ . Ripete l'ultimo argomento dell'ultimo comando:

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

Eseguirà ls, quindi se si desidera modificarlo, non è necessario riscriverlo, basta usare! $. Questo è davvero utile per nomi di file / percorsi lunghi. Inoltre ,! * Ripete tutti gli argomenti del comando precedente. Non lo uso tanto, ma sembra utile.

Sapevo che sono stati menzionati, ma uso vim, screen e cd - molto.

Ho dimenticato noclobber:

set -o noclobber

Da man bash :

Se impostato, bash non sovrascrive un file esistente con gli operatori di reindirizzamento>,> & e <>. Questo può essere ignorato durante la creazione di file di output utilizzando l'operatore di reindirizzamento> | invece di>.


6
Non uso $ !, poiché è davvero facile ingrassare il dito, ma mi piace colpire ^ [-. (periodo di fuga) per ottenere lo stesso effetto.
David Wolever,

7
A seconda della tastiera, ecc., Puoi anche fare Alt-..
Dennis Williamson,

Oh mio Dio, piccolo orgasmo, amico Dennis!
Artifex

14

Passa da bash a zsh e vedi migliorare la tua produttività:

  • Completamento della scheda davvero intelligente e programmabile. Completa non solo le righe di comando ma tutte le opzioni, i nomi delle pagine man, i nomi dei pacchetti (per apt-get / emerge ecc.) E cosa avete. E fornisce una spiegazione utile delle opzioni durante il completamento. Tutto questo senza utilizzare alcuno spazio di scorrimento dopo che il comando è stato emesso.
  • Completamento con schede dei caratteri jolly; scrivi cat * .txt, premi tab e scegli tra tutti i file che corrispondono all'espressione.
  • Cambia directory semplicemente digitandone il nome.
  • Diverse modalità di modifica delle righe. Può comportarsi come vi o emacs se lo desideri.
  • Associazioni chiave personalizzabili per fare ciò che desideri.
  • Richieste tematiche, inclusa la possibilità di inserire informazioni rapide sul lato destro dello schermo e di nasconderle automaticamente quando si digita un comando lungo

Google ti dirà molti altri vantaggi.


1
dovresti dare più di un link. sembra interessante, ma vendilo a me amico!

Sono riusciti a includere il supporto Unicode?

@Cory Va bene, non volevo solo plagiare e mi è sembrato ridondante scrivere il mio quando ci sono così tante cose buone già scritte da altri :)

@kyku sì, c'è un adeguato supporto Unicode da forse un anno fa.

sembra fico. ci proverò!

13

Vecchia scuola, spostando un albero di directory da un posto a un altro, preservando collegamenti simbolici, permessi e tutte quelle cose buone:

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

o attraverso la rete

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

Nuova scuola:

rsync -urltv . /destination

o attraverso la rete

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

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Un po 'meno digitando e più facile da usare su ssh.
effimero

1
-a è uguale a '-rlptgoD', ovvero recurse, copia i symlink come symlink, preserva i permessi, preserva i timestamp, preserva i gruppi, preserva i proprietari, copia i file del dispositivo e file speciali come dispositivi e file speciali. Inoltre, tra le macchine, -z (comprime i file prima dell'invio, decomprime dopo la ricezione) è utile. rsync -avz [-e ssh] è tuo amico :-)
dr-jan,

-Z fa qualcosa di buono su ssh? Non la penso così.
Paul Tomblin,

rsync -avhè la cosa migliore su un singolo computer: hgarantisce che i collegamenti reali vengano trasferiti correttamente senza trasformare ciascun collegamento in un file separato, sebbene se si dispone di un numero enorme di file, può usare molta memoria. rsync -avzh . foo.com/destinationè l'equivalente per la rete e di solito non è necessario -e sshpoiché rsync saprà usare ssh.
RichVel,

In realtà, in questi giorni sto usandorsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin il

13

Requisito : si dispone di una directory contenente un ampio elenco di file che si desidera eliminare. rm -r fallirà!

esempio

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

Soluzione :

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

Spiegazione :

Modifica: spiegazione della correzione dopo il commento @ephemient.

find fornirà argomenti a rm con gli argomenti massimi consentiti. Ciò consentirà a rm di eliminare i file in batch, che è la tecnica più veloce che io conosca senza usare l'operazione -delete di find stesso. È equivalente a

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

che potresti trovare utile se il tuo findnon supporta -exec ... +.


5
Sostituisci \;con +: quindi findfarà ciò che xargsfa per impostazione predefinita, ovvero raggruppa gli argomenti il ​​più possibile (senza correre oltre il limite dell'elenco degli argomenti). O semplicemente usa -deleteintead of -exec rm(GNU Findutils necessario per entrambi)
effimero

Un buon consiglio: non conoscevo il '+'.
codeinthehole,

@ephemient: buon commento, ho modificato il post.
Maxim Veksler

2
Interessante, non avevo sentito parlare di "+".
user18911

o semplicemente find ... -delete, se la tua ricerca è così dotata.
David Wolever,

11

Uso questi due suggerimenti così spesso che ho pensato che sarebbe una buona idea condividere:

!foo

Avvia l'ultimo comando nel file della cronologia che inizia con "pippo" (lo uso spesso durante la compilazione, !gccad esempio.)

L'altra è una scorciatoia da tastiera (Ctrl + O invece di Return) che eseguirà il comando E visualizzerà il comando successivo nel file della cronologia. Ad esempio, quando compilo e collaudo un file, eseguo sempre 3 o 4 comandi, eseguo cd nella directory del test, eseguo il test cd nella directory del makefile. Usando Ctrl + O questo rende questo compito molto più semplice :)

Spero che questo aiuto!


1
+1 per Ctrl-O
Dennis Williamson,

10

Come usare la sovversione in Linux senza l'aiuto di fantasiose interfacce grafiche che potrebbero non essere disponibili.

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

Questo impedisce a molti sviluppatori di usare Linux, stranamente.


rapidsvn è una bella piccola interfaccia grafica per svn sotto Linux.

Sono certamente disponibili molte GUI fantasiose e potenti (come quella in IntelliJ IDEA), ma mi piace la possibilità di utilizzare sia quelli che la riga di comando (anche potenti, ma in modo diverso) - qualunque si adatti meglio alla situazione attuale
Jonik

Il mio preferito di gran lunga è NautilusSVN (molto simile a TortoiseSVN): code.google.com/p/nautilussvn
user7655

10

Comando di vecchia scuola più trascurato: find

Ieri ho riparato un bug di permessi lordi:

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

Sì! Impara il comando find. Trova mescolato con xargs, sed e awk crea un juggernaut per l'elaborazione dei file!
Jonathon Watney,

Concordato! Anche se non ricordo mai nulla di sed e awk, ho sempre bisogno di riapprenderlo! Dovrei davvero stampare un cheatheet.

Sì, ma non dimenticare di usare -print0 e l'opzione -0 per xargs per evitare problemi complicati che coinvolgono nomi di file contenenti caratteri insoliti (ad esempio barra rovesciata).
user18911

Yup, probabilmente la metà del tempo che uso trova è di sistemare le cose stupide permessi: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Non dimenticare l' -permopzione per findindividuare i file con autorizzazioni impostate in un determinato modo.
Dennis Williamson,

8

Per shell come bashe ksh, puoi far rispondere la riga di comando ai comandi di navigazione come il tuo editor di testo:

set -o emacs

o

set -o vi

ti consentirà di cercare nella cronologia e di spostarti nella riga di comando come sei abituato a fare nei file di testo (ad es. in modalità vi, premendo ESCquindi digitando /stringcercherai "stringhe" nei tuoi comandi precedenti - puoi usare ne Nmuoverti tra le partite)


Errore di battitura minore: "editor di test" dovrebbe essere "editor di testo"

8

grep è mio amico. Sul serio.

Elenca i .rbfile che contengono il testo class foo:

grep -l "class foo" .rb

Elenca i .rbfile che non contengono il testo class foo:

grep -L "class foo" *.rb

Elenca i .rbfile che non contengono foo o bar (puoi usare qualsiasi regexp con -e, ma devi sfuggire agli operatori):

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

Potresti essere interessato a uno strumento chiamato "ack", che fa la stessa cosa di grep ma scansionerà in modo ricorsivo solo i file dei sorgenti. Provalo

8

La sostituzione della shell viene eseguita con ^:

/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
In realtà preferisco "!!: gs / foo / bar" poiché trovo spesso che foo sia menzionato più di una volta nel comando precedente e voglio una sostituzione globale (ad esempio "mv foo.txt foo.bak").
user18911
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.