Les traits cachés de Bash

Les scripts Shell

sont souvent utilisés comme colle, pour l'automatisation et les tâches simples et ponctuelles. Quelles sont certaines de vos fonctionnalités "cachées" préférées du langage shell/scripting Bash?

  • une caractéristique par réponse
  • donner un exemple et une brève description de la fonctionnalité, pas seulement un lien vers la documentation
  • étiqueter la caractéristique en utilisant le titre en caractères gras comme première ligne

voir aussi:

  • "1519140920 des fonctionnalités Cachées de C
  • Caché fonctionnalités de C#
  • Caché fonctionnalités de C++
  • "1519260920 des fonctionnalités Cachées de Delphes
  • "1519300920 des fonctionnalités Cachées de Python
  • "1519340920 des fonctionnalités Cachées de Java
  • "1519380920 des fonctionnalités Cachées de JavaScript
  • "1519420920 des fonctionnalités Cachées de Ruby
  • "1519460920 des fonctionnalités Cachées de PHP
  • "1519500920 des fonctionnalités Cachées de Perl
  • "1519540920 des fonctionnalités Cachées de VB.Net
72
demandé sur Robert Harvey 2008-10-17 12:14:02
la source

30 ответов

inscrire le paramètre final de la ligne précédente

alt - . la plus utile combinaison de touche jamais, essayer et voir, pour une raison que personne ne sait à ce sujet.

appuyez dessus encore et encore pour sélectionner les derniers paramètres plus anciens.

super quand tu veux faire quelque chose d'autre à quelque chose que tu as utilisé il y a juste un instant.

69
répondu chillitom 2009-09-22 17:49:11
la source

si vous voulez garder un processus en cours après vous déconnecter:

disown -h <pid>

est un bash utile intégré. Contrairement à nohup , vous pouvez exécuter disown sur un processus déjà en cours.

tout d'abord, arrêtez votre travail avec control-Z, obtenez le pid de ps (ou utilisez echo $! ), utilisez bg pour l'Envoyer à l'arrière-plan, puis utilisez disown avec le drapeau-H.

N'oubliez pas de mettre en arrière plan votre travail ou il sera tué quand vous vous déconnectez.

40
répondu Alex Reynolds 2009-02-25 15:12:59
la source

presque tout ce qui est énuméré sous la section EXPANSION dans le manuel

en particulier, expansion du paramètre:

$ I=foobar
$ echo ${I/oo/aa} #replacement
faabar
$ echo ${I:1:2}   #substring
oo
$ echo ${I%bar}   #trailing substitution
foo
$ echo ${I#foo}   #leading substitution
bar
38
répondu Vinko Vrsalovic 2010-05-13 11:28:39
la source

mon préféré:

sudo !!

renvoie la commande précédente avec sudo.

35
répondu GloryFish 2009-06-30 18:17:16
la source

plus de combinaisons de touches magiques:

  • Ctrl + R commence une "recherche incrémentale inversée" à travers votre historique de commandes. Comme vous continuez à taper, il récupère la commande la plus récente qui contient tout le texte que vous saisissez.

  • Tab complète le mot que vous avez tapé jusqu'à présent si il est sans ambiguïté.

  • Onglet Onglet "1519100920 la liste de tous les complétions pour le mot que vous avez tapé jusqu'à présent.

  • Alt + * inserts toutes les complétions possibles, ce qui est particulièrement utile, disons, si vous venez d'entrer une commande potentiellement destructive avec des caractères génériques:

    rm -r source/d*.c Alt + *

    rm -r source/delete_me.c source/do_not_delete_me.c

  • Ctrl + Alt + e effectue des extensions d'alias, d'historique et de shell sur la ligne courante. En d'autres termes, la ligne courante est redisplayée car elle sera traitée par le shell:

    ls $HOME/tmp Ctrl Alt + e

    ls -N --color=tty -T 0 /home/cramey

27
répondu Adam Liss 2009-09-13 01:01:46
la source

récupérer l'historique des commandes et des arguments

il est possible d'accéder sélectivement aux commandes et arguments précédents en utilisant l'opérateur ! . C'est très utile lorsque vous travaillez avec de longs chemins.

, Vous pouvez vérifier vos dernières commandes avec history .

vous pouvez utiliser les commandes précédentes avec !<n> étant n l'index de la commande dans history , les nombres négatifs comptent à l'envers depuis la dernière commande de l'histoire.

ls -l foo bar
touch foo bar
!-2

vous pouvez utiliser les arguments précédents avec !:<n> , Zéro est la commande, >= 1 sont les arguments.

ls -l foo
touch !:2
cp !:1 bar

et vous pouvez combiner les deux avec !<n>:<m>

touch foo bar
ls -l !:1 !:2
rm !-2:1 !-2:2
!-2

vous pouvez également utiliser les gammes d'arguments !<n>:<x>-<y>

touch boo far
ls -l !:1-2

autres ! les modificateurs spéciaux sont:

  • * pour tous les arguments

    ls -l foo bar
    ls !*
    
  • ^ pour le premier argument ( !:1 == !^ )

  • $ pour le dernier argument

    ls -l foo bar
    cat !$ > /dev/null
    
24
répondu Jaime Soriano 2012-02-23 02:29:25
la source

j'aime la fonctionnalité-x, permettant de voir ce qui se passe dans votre script.

bash -x script.sh 
20
répondu stephanea 2008-10-17 12:33:29
la source

SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"

secondes

Chaque fois que ce paramètre est Référencé, le nombre de secondes depuis shell invocation est de retour. Si une valeur est assignée à Secondes, la valeur retournée par la suite références est le nombre de secondes depuis la cession et de la valeur assigner. Si secondes est désactivé, il perd ses propriétés spéciales, même si il est par la suite réinitialiser.

19
répondu Daenyth 2010-10-17 00:53:23
la source

Voici un de mes favoris. Cela permet de définir l'achèvement de l'onglet de ne pas être sensible à la casse. C'est vraiment génial pour taper rapidement des chemins de répertoires, surtout sur un Mac où le système de fichiers n'est pas sensible à la casse par défaut. J'ai mis ça dans .inputrc dans mon dossier d'accueil.

set completion-ignore-case on
17
répondu danieljimenez 2011-01-16 03:58:53
la source

la variable spéciale random:

if [[ $(($RANDOM % 6)) = 0 ]]
    then echo "BANG"
else
    echo "Try again"
fi   
16
répondu Vinko Vrsalovic 2008-10-17 12:31:15
la source

expression Régulière de la manipulation

les versions récentes de bash présentent une correspondance régulière des expressions, vous pouvez donc faire:

if [[ "mystring" =~ REGEX ]] ; then  
    echo match
fi

où REGEX est une expression régulière brute dans le format décrit par man re_format.

les correspondances de n'importe quelle partie entre crochets sont stockées dans le tableau BASH_REMATCH, à partir de l'élément 1 (l'élément 0 est la chaîne correspondante dans son intégralité), donc vous pouvez utiliser ceci pour faire regex alimenté l'analyse.

13
répondu th_in_gs 2008-12-18 17:03:24
la source

Ctrl x Ctrl e

ceci chargera la commande courante dans l'éditeur défini dans la variable VISUAL. C'est vraiment utile pour les commandes longues comme celles énumérées ici.

pour utiliser vi comme votre éditeur:

export VISUAL=vi
13
répondu Robin 2010-05-13 11:36:22
la source

Quick & Dirty correction de fautes de frappe (surtout utile pour les longues commandes sur des connexions lentes où à l'aide de la commande de l'histoire et le défilement à travers elle serait horrible):

$ cat /proc/cupinfo
cat: /proc/cupinfo: No such file or directory
$ ^cup^cpu

aussi essayer !:s/old/new qui remplace ancien avec nouveau dans la commande précédente une fois.

si vous voulez substituer beaucoup d'occurrences, vous pouvez faire une substitution globale avec !:gs/old/new .

vous pouvez utiliser le gs et Commandes s avec n'importe quel événement historique, p.ex.

!-2:s/old/new

pour remplacer old par new (une fois) dans l'avant-dernière commande.

13
répondu Slomojo 2010-10-19 04:12:22
la source

voici deux de mes favoris:

pour vérifier la syntaxe sans vraiment exécuter le script utiliser:

bash -n script.sh

retourner au dernier répertoire (Oui je sais pushd et popd, mais c'est plus rapide)

cd -
10
répondu André 2008-10-17 20:45:48
la source

Utilisant Les Opérateurs Booléens Infix

d'Envisager le simple si:

if [ 2 -lt 3 ]
    then echo "Numbers are still good!"
fi

ça a l'air moche. Pas très moderne. Si vous utilisez des crochets doubles autour de votre expression booléenne vous pouvez les opérateurs booléens normaux!

if [[ 2 < 3 ]]
    then echo "Numbers are still good!"
fi
8
répondu Patrick 2008-10-17 12:15:08
la source

tableaux:

#!/bin/bash

array[0]="a string"
array[1]="a string with spaces and \"quotation\" marks in it"
array[2]="a string with spaces, \"quotation marks\" and (parenthesis) in it"

echo "There are ${#array[*]} elements in the array."
for n in "${array[@]}"; do
    echo "element = >>${n}<<"
done

plus de détails sur les tableaux (et d'autres trucs avancés de bash scripting) peuvent être trouvés dans le Advanced Bash-Scripting Guide .

8
répondu JesperE 2008-10-17 13:17:31
la source

exécuter une commande avant d'afficher l'invite de bash

définit une commande dans la variable env" PROMPT_COMMAND " et elle sera exécutée automatiquement avant chaque invite. Exemple:

[[email protected]]$ export PROMPT_COMMAND="date"
Fri Jun  5 15:19:18 BST 2009
[[email protected]]$ ls
file_a  file_b  file_c
Fri Jun  5 15:19:19 BST 2009
[[email protected]]$ ls

pour les prochains april fools, ajouter" export PROMPT_COMMAND=cd " à quelqu'un .bashrc puis asseyez-vous et regarder la confusion se dérouler.

8
répondu Shawn Chin 2009-06-05 18:23:04
la source

la Magie des combinaisons de touches à partir de la bash man pages:

  • Ctrl + un et Ctrl + e déplacer le curseur au début et à la fin de la ligne courante, respectivement.

  • Ctrl + t et Alt + t transposer le caractère et le mot avant le curseur avec le curseur actuel, puis déplacer le curseur en avant.

  • Alt + u et Alt + l convertissez le mot courant (du curseur à la fin) en majuscules et minuscules.

    Indice: Press Alt + suivi de l'une ou l'autre de ces commandes pour convertir le commençant du mot courant.



Bonus man conseils:

  • lors de l'affichage de man pages, utilisez / pour rechercher du texte dans les pages. Utiliser n pour sautez à l'avance au prochain match ou N pour le match précédent.

  • Accélérez votre recherche d'une commande ou d'une sous-section particulière dans les pages man en profitant de leur formatage:

    O au lieu de taper / expansion de l'histoire pour trouver cette section, essayez / ^histoire , en utilisant le caret ( ^ ) pour trouver seulement les lignes qui commencer avec "de l'histoire."

    o Essayer / lire , avec quelques espaces, à la recherche pour que builtin commande. Les Builtins sont toujours indentés dans les pages man .

8
répondu Adam Liss 2009-09-13 00:43:23
la source

export TMOUT=$((15*60))

terminer bash après 15 minutes de ralenti, réglé à 0 pour désactiver. J'ai l'habitude de mettre cela à ~/.bashrc sur la racine de mes comptes. C'est pratique lorsque l'administration de vos boîtes et vous pouvez oublier de vous déconnecter avant de quitter le terminal.

7
répondu Mike Nelson 2009-12-10 18:53:05
la source

Annuler

C-S-- changement de contrôle moins annulation des actions de Dactylographie.

Kill / Yank

supprimer toute opération C-w (supprimer le mot précédent), C-k (supprimer à la fin de la ligne), C-u (supprimer au début de la ligne) etc... la copie du texte supprimé de la tuer anneau, vous pouvez coller la dernière tue: C-y et en cycle (coller) l'anneau des éléments supprimés avec Alt-a

7
répondu Slomojo 2010-10-17 01:20:51
la source

vous pouvez ignorer certains fichiers tout en tabulant remplir en définissant la variable FIGNORE .

par exemple, si vous avez un repo subverion et vous voulez naviguer plus facilement faire

export FIGNORE=".svn"

maintenant vous pouvez cd sans être bloqué par les répertoires .svn .

7
répondu Sionide21 2010-10-19 04:03:15
la source

utilisant l'arithmétique:

if [[ $((2+1)) = $((1+2)) ]]
    then echo "still ok"
fi
5
répondu Vinko Vrsalovic 2008-10-17 12:31:59
la source

Accolade de l'expansion

extension Standard avec {x, y, z}:

$ echo foo{bar,baz,blam}
foobar foobaz fooblam
$ cp program.py{,.bak}  # very useful with cp and mv

expansion de la séquence avec {X..y}:

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {a..f}{0..3}
a0 a1 a2 a3 b0 b1 b2 b3 c0 c1 c2 c3 d0 d1 d2 d3 e0 e1 e2 e3 f0 f1 f2 f3
5
répondu Tom 2011-08-13 08:09:37
la source

j'ai lu récemment Csh de Programmation Considéré comme Nocif qui contenait cet incroyable bijou:

d'Envisager le pipeline:

A | B | C

vous voulez savoir le statut de C, Eh bien, c'est facile: il est en $?, ou $statut en csh. Mais si tu le veux de A, Tu n'as pas de chance ... vous êtes dans les csh, qui est. Dans le Bourne shell, vous pouvez l'obtenir, bien que cela est une peu délicate. Il y a quelque chose que j'ai dû faire là où j'ai couru dd's stderr dans un tuyau grep-v pour se débarrasser des enregistrements in/out bruit, mais avait pour retourner le statut de sortie du dd, pas celui du grep:

device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)$'
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) |
    egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status;
4
répondu Greg Hewgill 2008-10-17 12:29:51
la source

Tronquer le contenu d'un fichier (fichier de mise à zéro)

> file

en particulier, c'est très bon pour tronquer les fichiers journaux, lorsque le fichier est ouvert par un autre processus, qui peut encore écrire dans le fichier.

4
répondu Thevs 2008-11-01 18:48:03
la source

pas vraiment une fonctionnalité mais plutôt une direction: j'ai trouvé de nombreuses "fonctionnalités cachées", des secrets et divers Bash utilité à commandlinefu.com . Beaucoup des réponses les mieux notées à ces réponses, je les ai appris sur ce site :)

4
répondu Agos 2009-12-10 18:55:46
la source

un autre petit: Alt + #

commente la ligne courante et la déplace dans le tampon d'historique.

Ainsi, lorsque vous assemblez une ligne de commande et que vous devez émettre une commande intérimaire pour, par exemple, trouver un fichier, vous n'avez qu'à cliquer sur alt+#, lancer l'autre commande, remonter dans l'historique, décommenter et procéder.

4
répondu neurolabs 2010-11-23 17:55:18
la source

bretelles au lieu de do et done dans pour boucle

For corps de boucle sont généralement dans do...done (juste un exemple):

for f in *;
do
    ls "$f";
done

, Mais nous pouvons utiliser un style C en utilisant des accolades:

for f in *; {
    ls "$f";
}

je pense que ça a l'air mieux que do...done et je préfère celui-ci. Je n'ai pas encore trouvé dans la documentation de Bash, donc c'est vraiment une fonctionnalité cachée.

4
répondu fossilet 2012-01-15 17:40:37
la source

expressions numériques de style C:

let x="RANDOM%2**8"
echo -n "$x = 0b"
for ((i=8; i>=0; i--)); do
  let n="2**i"
  if (( (x&n) == n )); then echo -n "1"
  else echo -n "0"
  fi
done
echo ""
3
répondu Steve Baker 2008-10-17 17:56:40
la source

ces propriétés sont une autre de mes préférées.

export HISTCONTROL=erasedups
export HISTSIZE=1000

le premier fait en sorte que bash ne logue pas les commandes plus d'une fois, va vraiment améliorer l'utilité de history . L'autre étend la taille de l'histoire à 1000 à partir de la valeur par défaut de 100. J'ai réglé ça à 10000 sur mes machines.

3
répondu danieljimenez 2009-06-06 20:13:31
la source

Autres questions sur scripting bash hidden-features shell