Orange / IT&Labs
développeur Java / architecte logiciel
admin système Linux
15 ans Linux
bash$ ls -1 /bin /usr/bin | wc -l 3280
~/.bashrc
, ~/.inputrc
, ...)CTRL-GAUCHE
/ CTRL-DROITE
: mot précédent / mot suivantCTRL-A
/ CTRL-E
: va au début / à la fin de la ligneCTRL-W
: supprime le mot précédentCTRL-U
/ CTRL-K
: supprime la ligne jusqu'au début / jusqu'à la finCTRL-C
: arrête la commande en coursCTRL-Z
: gèle la commande en coursCTRL-D
: quitte le shellCTRL-A
, #
, ENTRÉE
)TAB
complète la ligne en cours avec soit :
bash_completion
$ git <TAB> add commit instaweb rm am config l s ...
/etc/bash_completion.d/
)dans le fichier ~/.inputrc
$include /etc/inputrc
# ignore la case
set completion-ignore-case on
# treats hyphens ('-') and underscores ('_') as equivalent
set completion-map-case on
# ignorer les fichiers cachés
set match-hidden-files off
# affiche directement les completions possibles (évite de taper TAB
2 fois)
set show-all-if-ambiguous on
~/.bash_history
HAUT
/ BAS
: commande précédente / suivante
CTRL-R
: recherche mot-clé dans l'historiqueALT-.
: répère le dernier argument de la commande précédenteHAUT
/ BAS
(dans ~/.inputrc
)"\e[A": history-search-backward "\e[B": history-search-forward
~/.bashrc
)HISTSIZE=20000 HISTFILESIZE=20000
yoann@computer:~/breizhcamp-bashetmoi $
PS1
, évaluée à chaque affichage
~/.bashrc
liquidprompt
cd
, mkdir
, rmdir
, ...)[yoann:~]$ mkdir test [yoann:~]$ cd test [yoann:~/test]$ ls [yoann:~/test]$
ls
, cp
, mv
, rm
, ..)[yoann:~]$ ls template.html [yoann:~]$ cp template.html template.html.old [yoann:~]$ ls template.html template.html.old [yoann:~]$ rm template.html
[yoann:~]$ echo ${PWD} /home/yoann [yoann:~]$ echo * template.html.old
[yoann:~]$ for i in {1..5}; do echo -n "$i "; done 1 2 3 4 5
man
bash$ man ls
-h
ou --help
bash$ ls --help Utilisation : ls [OPTION]... [FILE]... Afficher des renseignements sur les FILEs (du répertoire actuel par défaut). Trier les entrées alphabétiquement si aucune des options -cftuvSUX ou --sort ne sont utilisées. Les arguments obligatoires pour les options longues le sont aussi pour les options courtes. -a, --all ne pas ignorer les entrées débutant par . -A, --almost-all ne pas inclure . ou .. dans la liste
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2 3682 cd 2967 ls
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2 ^ ^ ^ ^ ^
command A | command B
A
vers l'entrée de B
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2
history
: affiche l'historique$ history 497 ls 498 vi .inputrc 499 cat /etc/inputrc 500 ls 501 history
awk
: traitement de chaines (recherches, remplacements, transformations)$ history | awk '{print $2}' ls vi cat ...
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2
sort
: tri le texte entrée$ history | awk '{print $2}' | sort cat history ls ls vi
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2
uniq
: supprime les doublons consécutifs
-c
: préfixe avec le compte$ history | awk '{print $2}' | sort | uniq -c 1 cat 1 history 2 ls 1 vi
$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -2 2 ls 1 cat
sort
: tri le texte entrée
-k1,1
: clé de tri => 1ère colonne-n
: tri numérique-r
: inverse le trihead
: affiche le début$ history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr > hist-$(date +%Y%m).txt $ head hist-201405.txt 3682 cd 2967 ls 2364 git ...
>
: redirige la sortie standard dans un fichier$(command)
: substitue l'argument par la sortie standard de l'exécution de command
git
ayant une branche nommée mybranch$ find * -name ".git" | while read d ; do d=${d%.git} ; ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; done
git
ayant une branche nommée mybranch$ find * -name ".git" | while read d ; do d=${d%.git} ; ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; done dépot-3/ dépot-5/ dépot-8/
git
ayant une branche nommée mybranch$ find * -name ".git" | while read d ; do d=${d%.git} ; ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; done dépot-3/ dépot-5/ dépot-8/
reformattons !
$ find * -name ".git" | \ while read d ; do \ d=${d%.git} ; \ ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
le caractère \
permet d'échapper le retour chariot
git
ayant une branche nommée mybranch-> $ find * -name ".git" | \ while read d ; do \ d=${d%.git} ; \ ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
*
remplacé par la liste des fichiers dans le répertoire courantfind
: recherche récursive de fichiers par critères$ find * -name ".git" dépot-1/.git dépot-2/.git dir-1/dépot-Z/.git ...
git
ayant une branche nommée mybranch$ find * -name ".git" | \ -> while read d ; do \ ... -> done
while x; do command ; done
command
tant que la commande x
réussi;
sépare une liste de commandes exécutées séquentiellementread var
var
une ligne lue depuis l'entrée standardnote : construction fonctionnant avec des noms de fichiers ayant des espaces
git
ayant une branche nommée mybranch$ find * -name ".git" | \ while read d ; do \ -> d=${d%.git} ; \ ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
varname = value
${variable%word}
enlève word
à la fin de variable
${variable#word}
enlève word
du début de variable
git
ayant une branche nommée mybranch$ find * -name ".git" | \ while read d ; do \ d=${d%.git} ; \ -> ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
sous shell : ( command )
command
dans un nouveau process bash$ ps | grep bash | wc -l 1 $ ( ps | grep bash | wc -l ) 2
git
ayant une branche nommée mybranch$ find * -name ".git" | \ while read d ; do \ d=${d%.git} ; \ -> ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
liste de commandes
command A && command B
: exécute B
si A
a réussie (ET logique)command A || command B
: exécute B
si A
a échouée (OU logique)command A ; command B
: exécute A
puis B
git
ayant une branche nommée mybranch$ find * -name ".git" | \ while read d ; do \ -> d=${d%.git} ; \ ( cd "$d" && git branch --list | grep -q mybranch && echo "$d" ) ; \ done
grep
: recherche de pattern dans un fichier ou l'entrée standard
-q
: mode silencieux (quiet)echo
: affiche les arguments passés$ git diff --submodule=log $COMMIT_START $COMMIT_END | \ sed -n -r 's|^Submodule ([^ ]+) ([0-9a-f]{7}\.?\.\.[0-9a-f]{7})[: ].*|\1 \2|p' | \ while read sm vv ; do \ v1=${vv%%..*} ; v2=${vv##*..} ; \ echo ">>> ${sm} (${v1}..${v2})" >&2 ; \ if [[ ${v1} = 0000000 ]] ; then \ cat "${sm}/debian/changelog" ; \ else \ git --git-dir="${sm}/.git" diff "${v1}..${v2}" -- debian/changelog | \ sed -n '/^+++/!s:^+::p' ;\ fi ;\ done
chmod +x myscript.sh
#!/bin/bash
#!/bin/bash function usage { echo 'Salut le BreizhCamp'; exit 1 } [[ $# == 0 ]] && usage echo "$@"
{mot1,mot2}
$ echo mv realllylongname.cpp{,-old} mv realllylongname.cpp realllylongname.cpp-old
$ cd -
$ rename 's/old/new/' *.java
<(command)
: expose le flux de sortie de command
comme un fichier$ diff <(sort -u file1) <(sort -u file2)
sed
(stream editor) : outil de manipulation de texte permettant d'inserer, de supprimer, de chercher et replacer du texte
$ sed -e 's/foo/bar/' myfile.txt
$ sed -n 's/^search //p' /etc/resolv.conf
jq
(JSON processor) : équivalent de sed pour des données JSONsponge
: l'éponge à fichier (paquet moreutils
)
bash$ sort test.csv | sponge test.csv
raccourcis vers une commande ou pré-configuration
alias l='ls -CF' alias ..='cd ..' alias ...='cd ../..' # accès rapide au répertoire du projet foo alias cdf='cd ~/Projets/foo'
généralement définis dans ~/.bash_aliases
tmux
: un multiplexeur de terminaltmux
: un multiplexeur de terminalscreen
Chocolatey
apt-get
ou yum
ConsoleZ
: une vrai console (copier / coller, redimensionnement, ...)c:\> cinst ConsoleZ
MinGW
: Minimalistic GNU for Windowsc:\> cinst mingw
Cygwin
: couche de compatibilité Linux pour Windowsc:\> cinst Cygwin