Meilleures pratiques et astuces en ligne de commande Linux?


112

J'aimerais ouvrir une discussion qui accumulerait vos meilleures pratiques et astuces sur la ligne de commande Linux.

J'ai cherché une telle discussion pour partager le commentaire ci-dessous mais je n'en ai pas trouvé, d'où ce post.

J'espère que nous pourrons tous apprendre de cela.

Nous vous invitons à partager vos astuces Bash, grep, sed, AWK, / proc et tous les autres processus d’administration système Linux / Unix, ainsi que les meilleures pratiques de programmation shell dans l’intérêt de tous.


Pourquoi Linux uniquement? De nombreux conseils peuvent être utiles sur presque tous les goûts d'Unix.
mouviciel

Cette question pourrait être un peu large - il y a assez de bonnes pratiques de ligne de commande Linux / Unix pour remplir des livres entiers ...
Jonik

Je conviens que les astuces Unix pouvant être appliquées à Linux sont également les bienvenues, j’ai écrit Linux parce que A. C’est ce avec quoi nous travaillons ici. B. parce qu’il gagne une plus grande visibilité auprès du public qu’unix ces dernières années.
Maxim Veksler

Je pense que c’est une bonne idée de dresser une liste des commandes les plus utiles et les plus intéressantes que les gens utilisent.

Est-ce que certains d'entre eux sont pertinents? refspecs.freestandards.org

Réponses:


111

Use screen , un multiplexeur de terminaux libre développé par le projet GNU, vous permettra d’avoir plusieurs terminaux en un.

Vous pouvez démarrer une session et vos terminaux seront sauvegardés même en cas de perte de votre connexion. Vous pourrez ainsi les reprendre plus tard ou de chez vous.


2
Les commutateurs les plus courants que j'utilise sont 'screen -D -R' pour détacher et reprendre ma dernière session d'écran et 'screen -x' pour afficher la même session d'écran à partir de plusieurs connexions. En outre, procurez-vous un joli .screenrc de dotfiles.org/.screenrc
Nick Devereaux

4
Une autre bonne chose à propos de screen est que vous pouvez partager un terminal avec d'autres personnes lorsque vous souhaitez collaborer sur quelque chose, à l'aide de screen -x
gareth_bowles

101

SSH!
SSH est le commandement divin - je pense que c'est le commandement global le plus précieux à apprendre. Les options peuvent être assez décourageantes, mais il semble que j'apprenne constamment à utiliser de nouvelles options de ligne de commande pour SSH que je n'aurais jamais pensé nécessaires. Je les ai peut-être tous utilisés à ce stade.

Plus vous l'utilisez, plus vous en apprenez. Vous pouvez l'utiliser pour faire des choses étonnantes.

Remarque: TOUTES ces opérations sont réalisables à distance sans configuration sur votre serveur, à l'exception du serveur ssh en cours d'exécution.

Monter un système de fichiers sur Internet

recherche sur le net pour SSHFS

Commandes en avant .

Le protocole SVN + SSH est Subversion d’un client distant à un serveur sur lequel NO DEAMON est exécuté! La commande SVN démarre le serveur via le shell ssh et fait passer les informations dans le canal existant. Le programme rsync fait la même chose, fonctionne sur un serveur sans démon rsync en en démarrant un lui-même via SSH. Il est facile d'écrire vos propres fichiers bash pour faire des trucs similaires.

Chaîne pour passer à travers les pare-feu

Je l’utilise tout le temps pour passer de mon serveur Linux à la maison à mon Mac.

Transférer des ports:
semble modérément utile jusqu’à ce que vous réalisiez que vous pouvez rebondir à travers votre pare-feu domestique et configurer votre routeur à la maison depuis votre bureau comme si vous le faisiez depuis votre réseau domestique).

Transférer les demandes X:

Ceci est un autre étonnant. Avec ou sans un serveur X s'exécutant sur votre système distant, vous pouvez exécuter un programme x-windows et la fenêtre apparaîtra sur votre écran local. Il suffit d'utiliser le commutateur -X, c'est tout!

Étant donné que vous n'avez pas besoin de faire fonctionner un serveur X sur votre serveur distant, l'impact du processeur sur votre serveur est minime, vous pouvez avoir un serveur TINY Linux qui sert d'énormes applications à votre puissant PC de jeu fonctionnant sous Windows et cygwin / X.

Bien sûr, VI et EMACS fonctionnent sur SSH, mais lorsque je cours à la maison, je veux parfois plus. J'utilise ssh -X pour démarrer une copie d'Eclipse! Si votre serveur est plus puissant que votre ordinateur portable, l'interface graphique est installée sur votre ordinateur portable, mais les compilations sont effectuées sur votre serveur. Ne vous inquiétez donc pas de la charge du système.

Exécuter en batch

(ce qui signifie exécuter un fichier de commandes local qui "fait des choses" sur d'autres systèmes):

Deux choses se combinent pour rendre celui-ci cool. La première est que vous pouvez éliminer les invites de mot de passe en utilisant des clés de cryptage (plus sécurisées). La seconde est que vous pouvez spécifier une commande sur la CLI SSH. Je l'ai utilisé de manière intéressante - comme lorsqu'une compilation échoue sur le serveur distant, je l'aurais en SSH sur mon ordinateur et lirait un fichier son).

N'oubliez pas que vous pouvez rediriger la sortie de la commande distante et l'utiliser dans votre fichier de traitement par lots local. Vous pouvez donc également exécuter une compilation en cours d'exécution sur votre serveur.

Construit pour Mac

Le serveur et le client sont intégrés dans mac et linux. Dans le cas du Mac et de Ubuntu, l'activation d'un serveur est aussi simple que de trouver la bonne case à cocher.

Sur un ordinateur, installez cygwin ou cygwin / X (cygwin / X vous permettra de transférer votre sortie x-window de votre machine Linux vers votre PC Windows - il installe un serveur X)

Conseils importants / fichier de configuration

N'utilisez jamais le port 22 sur votre pare-feu. Vous aurez beaucoup de tentatives de piratage, ça n'en vaut pas la peine. Demandez simplement à votre pare-feu de transmettre un port différent à votre serveur.

De nombreuses options de configuration vous permettent de simplifier considérablement vos commandes ssh. Voici un exemple de mon travail

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

Quand je tape "ssh home" (rien d’autre), c’est comme si j’avais tapé:

ssh -p 12345 bill@billshome.hopto.org

puis transmet mon port local 1025 à mon système "mac" à la maison. La raison en est que j'ai une autre entrée dans mon dossier:

Host mac
    hostname localhost
    port=1025

de sorte que, une fois que j'ai fait une "maison ssh" et que la fenêtre est toujours ouverte, je peux taper "ssh mac" et l'ordinateur au travail essaiera en réalité de se connecter à son propre port 1025 qui a été transféré à "mac: 22 "par l’autre commande, il se connectera donc à mon Mac chez moi à travers le pare-feu.

Edit - script cool!

J'ai déterré un vieux script que j'aime vraiment - je devais revenir et le poster à quiconque ici serait intéressé. Le script s'appelle "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

Si vous avez ce script dans votre répertoire personnel et si vous pouvez vous connecter à un hôte (via ssh), vous pouvez taper "./authMe hostName".

Si nécessaire, il créera une paire de clés publique / privée, puis ssh sur l'autre machine et copiera votre clé publique (la commande ssh vous demandera un mot de passe ...).

Après cela, la commande SSH ne devrait plus vous demander votre mot de passe lors de la connexion à ce système distant, elle utilisera la paire de clés publique / privée.

Si votre ordinateur distant n'est pas toujours sécurisé, vous devez envisager de définir une "phrase secrète" lorsque vous y êtes invité.

Vous pouvez également vouloir configurer le serveur ssh sur le serveur distant pour ne pas autoriser les mots de passe textuels (uniquement les clés) pour une sécurité supplémentaire.


4
+1 poste très agréable et compact
Karsten

2
Petite remarque sur SSH sur le port 22: à condition d’avoir un bon mot de passe root et que vos utilisateurs n’ont pas de mots de passe terribles, le simple fait d’exécuter fail2ban (ou quelque chose de similaire) suffit pour éviter les tentatives de crack. Je trouvais vraiment ennuyeux de garder SSH sur un autre port.
David Wolever

1
Cela peut parfois être irritant, mais le volume de connexions était effrayant. Je sais qu'ils ne sont pas censés passer à travers, mais c'est un peu comme si vous aviez quelqu'un qui marchait jusqu'à votre maison et qui tripotait votre poignée de porte à chaque minute - juste énervant.

Il existe une version intégrée de votre dernière commande dans la plupart des versions de ssh de nos jours, elle s'appelle ssh-copy-id, et c'est aussi simple quessh-copy-id user@someserver
JamesHannah

Une autre façon de faire votre astuce "ssh mac" consiste à utiliser une directive ProxyCommand dans votre fichier .ssh / config. Hôte mac ProxyCommand ssh -q home "nc% h% p" Ceci exécutera netcat (nc) à la maison et redirigera votre connexion ssh directement vers mac. Je trouve cela plus facile à chaîner (par exemple, si vous devez vous connecter à «home» pour accéder à «work bastion», puis à «work web server».
toppledwagon

73

J'aime utiliser

cd -

pour passer au répertoire précédent. Très utile!


6
Je n'ai jamais su ça! Merci! Sur une note connexe, pushd et popd font quelque chose de similaire, en construisant une pile de répertoires. Ces astuces vous aident lorsque vous naviguez dans une structure de dir profonde.

C'est l'illumination pure.
Manuel Ferreria

69

J'ai récemment découvert la pvcommande (pipe viewer) qui ressemble à chat mais avec des détails de transfert.

Donc au lieu de

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

Vous pouvez utiliser

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

Donc, au lieu de ne pas avoir la moindre idée du moment où votre opération se terminera, vous saurez maintenant!

Gracieuseté de Peteris Krumins


$ gzip -c access.log> access.log.gz Pourquoi pas seulement: $ gzip access.log

Oh ça marche :) Je viens de prendre l'exemple du site Web de Peteris.
Nick Devereaux

Cela ressemble au bon vieux tee(1).
Daniel C. Sobral

Utilité extrêmement utile, celle que j'oublie toujours :-(
Patrick


46

Appuyez sur Ctrl-R et commencez à taper une commande (ou une partie de celle-ci) - elle effectue une recherche dans l'historique des commandes. Appuyez à nouveau sur Ctrl-R pour passer au match suivant, enter exécute la commande actuellement affichée et une flèche vers la droite (au moins) vous permettra de l'éditer en premier.

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

J'avais utilisé Linux pendant environ 7 ans comme système d'exploitation principal avant d'apprendre cette technique, mais maintenant que je le sais, c'est assez pratique.


Merci. J'ai utilisé la recherche inversée, mais je n'ai pas été en mesure de trouver comment passer au prochain match.
Adam

Ctrl-S passe au match suivant. Vous devrez peut-être stty -ixoncommencer par désactiver le sens du contrôle de flux XON / XOFF (cela rend également Ctrl-Q disponible. Par défaut, il est mappé de la même manière que Ctrl-V quoted-insert, mais vous pouvez le remplacer par autre chose. ). Voir man sttyet man readlinepour plus d'informations. La sttycommande peut être ajoutée à votre~/.bashrc
Dennis Williamson

45

La ligne de commande est une chose amusante. Je pense que vous ne pouvez apprendre que tant de choses par vous-même et le reste que vous apprenez par accident en regardant quelqu'un d'autre en utilisant une ligne de commande.

J'utilisais la coque pendant des années en tapant minutieusement les noms de répertoires à la main. Un jour, je regardais un ami bousiller un système et il continuait d'appuyer sur la touche de tabulation. J'ai demandé "pourquoi tu frappes l'onglet?". Réponse: il essaie de compléter le répertoire ou le nom du fichier. Qui l'aurait deviné - onglet achèvement! Tapez un morceau du fichier ou du répertoire, appuyez sur la touche Tab, et il essaiera de finir ce que vous avez tapé (le comportement dépend de quel shell).

Un jour, ledit ami me regardait sur la ligne de commande et me regardait taper quelque chose comme:

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

Qui aurait deviné!? Il n'a jamais su à propos de popd/ pushd. Devinez nous sommes même ...


1
Pour moi, la complétion des onglets semble quelque chose d '"évident", très basique, mais je n'ai jamais rien su de popd / pushd. C'est vraiment drôle. :)
Jonik

3
Voir aussi cette réponse pour pouvoir compléter beaucoup plus que les commandes, fichiers et répertoires: stackoverflow.com/questions/603696//603919#603919
Jonik

1
C'est tellement vrai. J'ai appris sur la recherche en arrière de l'histoire de bash (ctrl-r) en regardant quelqu'un. J'ai par la suite réalisé qu'il s'agissait d'une fonctionnalité readline et fonctionnait de la même manière dans d'autres programmes intégrant readline (mysql, gdb, python -i, clisp, etc.).
sigjuice

2
Comment pouvez-vous utiliser "la coquille" pendant des années sans savoir comment remplir les onglets?
prestomation

Lorsque vous traitez avec pushd / popd ne pas oublier de mentionner la commande dirs . Il montre ce qu'il y a sur la pile pushd / popd.
slm

41

Apprenez Vim.

C'est (sans doute) le meilleur éditeur, mais certainement le meilleur éditeur disponible sur un serveur Linux nu.


1
gvim est également le meilleur navigateur de fichiers sur Windows;)

Ceci est également extrêmement utile car une fois que vous connaissez vim, vous pouvez mettre la plupart des obus en mode vi et la navigation devient extrêmement facile et rapide
Patrick

38

Il est parfois utile de laisser un programme en cours même après votre déconnexion. J'ai vu des solutions qui utilisent nohup ou même l'écran à cette fin. Le plus simple que je connaisse est:

$ your_command_here & disown

Vous pouvez également détacher un programme en cours d'exécution:

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

6
Utiliser l'écran est génial car vous pouvez vous "reconnecter" à cette application à partir de n'importe où plus tard.
prestomation

+1, je n'avais pas entendu parler de désaveu.
user18911

idem re désavouer, bien que je fasse déjà la même chose avec l'écran
Andy

38

Lorsque je veux m'assurer que j'utilise la commande réelle et non un alias, j'utilise une barre oblique inverse:

\rm -rf ~/tmp

est-ce la même chose que "command rm -rf ~ / tmp"?
Maxim Veksler

Je ne savais pas "commande", mais ça a l'air pareil.
mouviciel

4
Eh bien, oui, à moins que la "commande" ne soit pas un alias, auquel cas vous devriez utiliser \ command rm -rf ~ / tmp dans ce cas, \ rm -rf ~ / tmp est préférable
Jamol

@ presario et vous pensez qu'il serait possible de créer un alias pour "/"? Quel dommage que je ne puisse pas upvoter les commentaires :)

Voir aussi la commande similaire " builtin".
Dennis Williamson

38

Cette astuce rendra votre interface de ligne de commande plus confortable (du moins cela me convient):

créer un fichier ~ / .inputrc avec le contenu suivant:

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

Rechargez bash (par exemple en tapant "exec bash"). Lorsque vous tapez le préfixe d'une commande et que vous appuyez sur la flèche dirigée vers le haut, vous parcourez les commandes commençant par votre préfixe. Par exemple, si vous tapez ssh, vos anciennes connexions seront affichées avec des shells distants. Si votre invite est vide, la flèche vers le haut parcourra l'historique de manière normale.


3
Habituellement, je lie ceux-ci à \ e [5 ~ et \ e [6 ~ (alias pageup et pagedown) au lieu de relier les flèches, mais c'est plus pratique que Ctrl-R / Ctrl-S :)
éphémère

+1 Je les ai liés à F8 et à Maj-F8 pour imiter cmd.exe, mais le même principe s'applique.
user18911

4
+1 pourexec bash
Dennis Williamson

Il est également instructif de lire man readlineet de mémoriser ses raccourcis par défaut
SaveTheRbtz

Vous pouvez également bind -f ~/.inputrcrecharger le fichier inputrc sans avoir à démarrer une nouvelle bash et à effacer votre environnement actuel.
Patrick

36

Utilisez &&au lieu de ;lors de l'exécution de plusieurs commandes à la fois. Il s'arrête lorsqu'une erreur se produit et n'exécute pas les autres commandes.

Exemple classique:

./configure && make && make install

1
Cette pratique est tellement sous-estimée! La pratique standard consiste à terminer chaque ligne d'un script shell avec && et à utiliser "true" comme commande finale.
user18911

3
Ce qui est drôle, c'est que je ne connaissais pas le ';' commande avant - j'avais TOUJOURS utilisé '&&'.
Nick Klauer

4
Vous pouvez démarrer des scripts shell avec "#! / Bin / sh -e". Cela s’arrête si une ligne échoue.
Stribika

3
Vous pouvez utiliser un double tuyau pour la clause "else":dosomething && echo "success" || echo "teh fail"
Dennis Williamson le

2
Il y avait une note récente sur Planet Debian selon laquelle il est déconseillé d’utiliser le -e sur la ligne shebang. Utilisez plutôt set -e dans le corps du script. De cette façon, le script ne fonctionnera pas différemment si quelqu'un s'exécute avec sh $ filename.
ptman

32

Lors de l'écriture de boucles sur la ligne de commande dans bash, je préfixe souvent les commandes risquées avec la commande 'echo'.

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

De cette façon, je peux voir le «quelque chose de risqué» dans son intégralité avant de m'engager à l'exécuter. Aide lorsque votre commande à risque inclut des extensions et des variables variables. Et 'set -x' est très utile pour écrire des scripts bash.

'set -x' active le débogage. Voir http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html pour plus d'informations sur le débogage de bash.


3
Je fais ça aussi, astuce très pratique!
user18911

1
+1 Cela peut vous sauver la vie! ou économiseur de données ...
David Oneill

31

Exigence

Vous devez tester la bande passante maximale entre 2 serveurs.


Solution

Sur SERVEUR1 faire:

nc -u -l 54321 > /dev/null

Sur SERVER2 faire:

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

Vous verrez des résultats tels que:

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

Le facteur intéressant ici est 117 Mo / s. Il indique la bande passante réelle du transfert réseau.

Explication :

Comme les paquets commenceront à circuler sur le réseau, vous pourrez voir les statistiques de bande passante sur SERVER2, ce qui est une assez bonne estimation de la bande passante maximale possible réelle entre les 2 serveurs.

Copie par UDP (pour éviter la surcharge de TCP).

Copier de la mémoire (/ dev / zéro) du serveur 1 à la mémoire (/ dev / null) du serveur 2, empêchant ainsi les entrées / sorties du disque de devenir le goulot d'étranglement.


4
Assurez-vous que ssh n'est pas configuré pour utiliser la compression dans .ssh / config, cependant. Sinon, vous aurez de très bons chiffres qui sont très loin de la vérité ;-)
Joachim Sauer

MDR oui. Et SSH va marteler votre CPU en cryptant et en décryptant, ce qui va également effacer les numéros.

utiliser netcat à la place
Bendin

+1 pour netcat. les frais généraux de SSH
fausseront

Refactored pour modifier les suggestions de @saua, @Daniel Von Fange et @bendin. Merci pour vos suggestions les gars.
Maxim Veksler

23

Voir les structures de répertoires de couleur est plus facile.

alias ls="ls --color=tty"

Modifier

alias ls="ls --color=auto"

5
Je préfère --color = auto car il n’envoie pas de caractères de contrôle des ordures en cas de redirection vers un fichier. Vous pouvez également créer un alias grep = "grep --color = auto" pour que les motifs correspondants soient mis en surbrillance.

+1 pour --color = auto; quelqu'un pourrait-il augmenter la réponse avec cela?
Jonik

Je pense que tty fait la même chose que auto ici.
joshudson

Mise à jour pour refléter la couleur = auto
Suroot

Étrangement, la coloration rend les choses beaucoup moins lisibles pour moi. Le jaune sur blanc, par exemple, n'est pas un bon choix de coloration.

20

Quelques petits points concernant la consultation des journaux:

  1. Vous pouvez utiliser tail -F pour continuer à regarder le journal après l'avoir tronqué (par exemple, log4j).
  2. Vous pouvez utiliser moins: Ouvrez moins, cliquez sur Maj + F pour émuler le comportement de la queue. La combinaison -S est également utile pour désactiver le retour à la ligne. less vous permettra de rechercher dans les journaux.

1
Et avec tail -fvous pouvez regarder plusieurs journaux à la fois! Exemple:tail -f log1.txt -f log2.txt
Stu Thompson le

@StuThompson: Merci. ne savait pas que. De plus, vous voudrez peut-être payer sur vanheusden.com/multitail
Maxim Veksler le

20

J'ai appris un tour depuis longtemps avec un ami pour changer facilement l'extension d'un fichier:

mv my_filename.{old,new}

L’expansion de Shell étendra ceci à:

mv my_filename.old my_filename.new

Cela peut également être utilisé pour renommer un fichier de différentes manières, par exemple en ajoutant quelque chose dans:

mv my_{,cool_}filename

6
Veillez simplement à ne mettre aucun caractère générique ou autre expression de modèle dans la même commande, sinon le glob pourrait être étendu à plus de 2 arguments! mv *. {old, new} est susceptible de produire des résultats vraiment surprenants.

Oui, d'accord - c'est une mise en garde importante :)

2
Vous pouvez également taper, par exemple, ls -l /bin/cpuis appuyer sur Alt-Maj- {et cela complétera ceci pour quelque chose comme ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}pour vous.
Dennis Williamson

19

Utilisez "tar xf" pour extraire les archives compressées. Les j pour bzip2 et z pour gzip ne sont pas nécessaires, car tar détectera le type de fichier de votre archive. Le signe '-' n'est pas non plus avant les arguments. Vous gagnerez beaucoup de temps (plus d'un millénaire ;-)).

Mieux encore, utilisez unfoo pour extraire n'importe quelle archive avec une seule commande sans aucun argument inutile.


Oui, j'ai alias ut="tar xf"- facilite l'extraction des archives.
David Wolever

Cela échoue sur certaines distributions RHEL, si vous les utilisez.
Pvsnp

Le nouveau fichier tar contient également un commutateur "J" pour la compression dans les archives xz (basée sur 7zip)
Hubert Kario le

Ou installez unp: packages.debian.org/sid/unp . Je suppose que cela ressemble à unfoo.
Zitrax

17

Installez le package bash-completion. Il contient un certain nombre de règles d'achèvement prédéfinies pour le shell. Activez-le en tapant "source / etc / bash_completion" si votre distribution ne le fait pas pour vous. Ensuite, par exemple, chaque fois que vous terminez après kpdf, vous ne verrez qu'une liste de répertoires et de fichiers PDF. C'est aussi intelligent que de terminer les fichiers distants après scp ssh: // serveur / XXX (si vous avez activé les connexions sans mot de passe).


17

J'utilise constamment ceux-ci

ALT-. (ESC +. Dans certains terminaux) copie le dernier argument utilisé (super utile)

CTRL-W supprime le mot

CTRL-L terminal vide (comme la commande clear mais plus rapide)

ALT-B (ESC + B dans certains terminaux) recule d'un mot

ALT-F (ESC + F dans certains terminaux) avance d'un mot

CTRL-E saute à EOL

CTRL-A saute à BOL

Recherche CTRL-R dans l'historique


1
Merci de partager les raccourcis! Je n’ai pas réussi à faire fonctionner ALT-B / F sur Mac.
Léo Léopold Hertz

Awesome man ....
Daud Ahmad Khokhar le

16

En bash, je l' utilise ! $ Beaucoup. Il répète le dernier argument de la dernière commande:

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

Il lancera le ls, alors si vous voulez le modifier, vous n'avez pas à le retaper, utilisez simplement! $. Ceci est vraiment utile pour les noms de chemin / fichier longs. De plus ,! * Répète tous les arguments de la commande précédente. Je ne l'utilise pas autant, mais cela semble utile.

Je sais qu'ils ont été mentionnés, mais j'utilise beaucoup vim, screen et cd.

J'ai oublié noclobber:

set -o noclobber

De l' homme bash :

Si défini, bash n'écrase pas un fichier existant avec les opérateurs de redirection>,> & et <>. Cela peut être remplacé lors de la création de fichiers de sortie à l'aide de l'opérateur de redirection> | au lieu de>.


6
Je n'utilise pas $ !, car il est très facile d'adhérer au gros doigt, mais j'aime frapper ^ [-. (période d’échappement) pour obtenir le même effet.
David Wolever

7
En fonction de votre clavier, etc., vous pouvez également le faire Alt-..
Dennis Williamson

Omg, petit orgasme, ty Dennis!
artifex

14

Passez de bash à zsh et constatez une amélioration de votre productivité:

  • Réalisation d'onglet scriptable vraiment intelligente. Il complète non seulement les lignes de commande, mais également toutes les options, les noms de pages de manuel, les noms de paquets (pour apt-get / emerge, etc.) et ainsi de suite. Et fournit une explication utile des options lors de l'achèvement. Tout cela sans utiliser aucun espace de défilement après que la commande a été émise.
  • Onglet complétion des jokers; écrivez cat * .txt, appuyez sur la touche de tabulation et choisissez l’un des fichiers correspondant à l’expression.
  • Changer de répertoire simplement en tapant leur nom.
  • Plusieurs modes d'édition de ligne. Peut se comporter comme vi ou emacs si vous le souhaitez.
  • Des raccourcis clavier personnalisables pour faire ce que vous voulez.
  • Thémeable invite, y compris la possibilité de mettre des informations d'invite sur le côté droit de l'écran et de le masquer automatiquement lors de la saisie d'une longue commande

Google vous en dira beaucoup plus.


1
vous devriez donner plus qu'un lien. Cela semble intéressant, mais vendez-le-moi mec!

Ont-ils réussi à inclure le support unicode?

@Cory Très bien, je ne voulais tout simplement pas plagier et il me semblait superflu d'écrire le mien quand il y a déjà tant de bonnes choses écrites par d'autres :)

@kyku oui, le support unicode est correct depuis peut-être un an.

ça a l'air cool. Je vais tenter le coup!

13

Vieille école, déplacer une arborescence de répertoires d'un endroit à un autre, en préservant les liens symboliques, les autorisations et tous ces bons éléments:

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

ou sur le réseau

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

Nouvelle école:

rsync -urltv . /destination

ou sur le réseau

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

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Un peu moins de frappe, et plus facile à utiliser sur ssh.
éphémence

1
-a est identique à '-rlptgoD' - c’est-à-dire recurse, copier les liens symboliques en tant que liens symboliques, conserver les permanentes, conserver les horodatages, conserver les groupes, conserver les propriétaires, copier les fichiers de périphérique et les fichiers spéciaux en tant que périphériques et fichiers spéciaux. De plus, entre les machines, -z (compresser les fichiers avant l'envoi, décompresser après la réception) est utile. rsync -avz [-e ssh] est votre ami :-)
dr-jan

Est-ce que -z fait du bien sur ssh? Je ne pense pas.
Paul Tomblin

rsync -avhIl est préférable d'utiliser un seul hordinateur: il garantit que les liens physiques sont transférés correctement sans transformer chaque lien en un fichier séparé. Toutefois, si vous avez un nombre considérable de fichiers, vous pouvez utiliser beaucoup de mémoire. rsync -avzh . foo.com/destinationest l'équivalent pour le réseau, et généralement vous n'avez pas besoin de ce -e sshque rsync saura utiliser ssh.
RichVel

En fait, ces jours-ci j'utilisersync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

Condition préalable : vous avez un répertoire contenant une longue liste de fichiers que vous souhaitez supprimer. rm -r va échouer!

exemple

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

Solution :

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

Explication :

Edit: Correction de l'explication après le commentaire @ephemient.

find fournira des arguments à rm par le nombre maximal d'arguments autorisés. Cela permettra à rm de supprimer des fichiers par lots, ce qui est la technique la plus rapide que je connaisse sans utiliser l'opération -delete de find elle-même. C'est équivalent à

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

que vous pouvez trouver utile si votre findne supporte pas -exec ... +.


5
Remplacer \;par +: then findfera ce qu'il xargsfaut par défaut, c'est-à-dire grouper les arguments autant que possible (sans dépasser la limite de la liste des arguments). Ou tout simplement utilisez -deleteintead de -exec rm(GNU Findutils nécessaire pour les deux)
éphémiente

Bon conseil - je ne connaissais pas le «+».
codeinthehole

@ ephemient: Bon commentaire, j'ai édité le post.
Maxim Veksler

2
Intéressant, je n'avais pas entendu parler de '+'.
user18911

ou juste find ... -delete, si votre trouvaille est si douée.
David Wolever

11

J'utilise ces deux astuces si souvent que j'ai pensé que ce serait une bonne idée de partager:

!foo

Lance la dernière commande de l'historique commençant par "foo" (je l'utilise souvent lors de la compilation, !gccpar exemple).

L'autre est un raccourci clavier (Ctrl + O au lieu de Retour) qui exécutera la commande ET affichera la commande suivante dans le fichier d'historique. Par exemple, lorsque je compile et teste un fichier, je fais toujours 3 ou 4 commandes, make, cd dans le répertoire du test, lance le test, cd dans le répertoire du fichier makefile. L'utilisation de Ctrl + O rend cette tâche beaucoup plus facile :)

J'espère que cette aide!


1
+1 pour Ctrl-O
Dennis Williamson

10

Comment utiliser Subversion sous Linux sans l'aide d'interfaces graphiques sophistiquées qui pourraient ne pas être disponibles.

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

Cela empêche étrangement beaucoup de développeurs d’utiliser Linux.


rapidsvn est un bon petit gui pour svn sous Linux.

De nombreuses interfaces graphiques sophistiquées et puissantes sont certainement disponibles (comme dans IntelliJ IDEA), mais j'aime bien la possibilité d'utiliser celles-ci ou la ligne de commande (également puissante, mais différemment) - celle qui convient le mieux à la situation actuelle
Jonik

Mon préféré est de loin NautilusSVN (un peu comme TortoiseSVN): code.google.com/p/nautilussvn
user7655

10

Commandement old school le plus négligé: find

Hier, j'ai réparé un bug d'autorisations grossières:

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

Oui! Apprenez la commande de recherche. Trouver mélangé avec xargs, sed et awk fait pour un mastodonte de traitement de fichier!
Jonathon Watney

D'accord! Bien que je ne me souvienne jamais de Sed et Awk, je dois toujours le réapprendre! Je devrais vraiment imprimer une feuille de triche.

Oui, mais n'oubliez pas d'utiliser -print0 et l'option -0 de xargs pour éviter les problèmes complexes liés aux noms de fichiers contenant des caractères inhabituels (par exemple, une barre oblique inversée).
user18911

Eh oui, probablement la moitié du temps que j'utilise le trouver est de réparer les choses de permission stupide: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
N'oubliez pas l' -permoption permettant findde localiser les fichiers disposant d'autorisations définies d'une certaine manière.
Dennis Williamson

8

Pour les shells tels que bashet ksh, vous pouvez faire en sorte que la ligne de commande réponde aux commandes de navigation telles que votre éditeur de texte:

set -o emacs

ou

set -o vi

vous permettra de rechercher dans votre historique et de vous déplacer sur la ligne de commande comme vous le faites habituellement dans les fichiers texte (par exemple, en mode vi, appuyer ESCpuis taper /stringva rechercher dans les commandes précédentes la "chaîne" - vous pouvez utiliser net Ndéplacer entre les matchs)


Erreur typographique: "éditeur de test" doit être "éditeur de texte"

8

grep est mon ami. Sérieusement.

Répertoriez les .rbfichiers contenant le texte class foo:

grep -l "class foo" .rb

Liste les .rbfichiers qui ne contiennent pas le texte class foo:

grep -L "class foo" *.rb

Liste les .rbfichiers qui ne contiennent ni foo ni bar (vous pouvez utiliser n'importe quelle expression rationnelle avec -e, mais vous devez échapper aux opérateurs):

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

Vous pourriez être intéressé par un outil appelé "ack", qui fait la même chose que grep mais n'analyse de manière récursive que les fichiers sources. Essayez-le (c'est gratuit): betterthangrep.com

8

La substitution de shell est effectuée avec ^:

/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
En fait, je préfère "!!: gs / foo / bar" car je trouve souvent que foo est mentionné plus d'une fois dans la commande précédente et je souhaite un remplacement global (par exemple "mv foo.txt foo.bak").
user18911
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.