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_historyHAUT / 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
~/.bashrcliquidprompt
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
manbash$ man ls
-h ou --helpbash$ 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 commandgit 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 variablegit 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 Bgit 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 terminal
tmux : un multiplexeur de terminalscreenChocolatey
apt-get ou yumConsoleZ : 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