Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

Tag - command line

Fil des billets - Fil des commentaires

vendredi 9 juin 2017

Complétion bash et utilisateur root

La complétion bash nous facilite bien la vie au quotidien puisqu'elle nous aide dans la saisie des options et paramètres des lignes de commandes sans avoir besoin de consulter les man pages.

Mais est t'elle toujours activée ?

J'ai fait le test avec Debian Stretch mais les résultats sont les mêmes avec Debian Jessie.

Lorsque j'utilise un utilisateur non root, la complétion bash est activée que j'utilise un Shell de login (avec Ctrl Alt F1) ou un Shell normal.

Si je tappe apt-get suivi de la touche TAB:

debian@stretch:~$ apt-get 
autoclean        changelog        dist-upgrade     install          source
autoremove       check            download         purge            update
build-dep        clean            dselect-upgrade  remove           upgrade

bash me propose bien la complétion qui convient à la commande apt-get.

Si maintenant je me connecte avec root, j'obtiens le résultat suivant:

debian@stretch:~$ su
Mot de passe : 
root@stretch:/home/debian# apt-get 
.bash_history         .dmrc                 .local/               Téléchargements/
.bash_logout          Documents/            Modèles/              Vidéos/
.bashrc               .gnupg/               Musique/              .Xauthority
Bureau/               .ICEauthority         .profile              .xsession-errors
.config/              Images/               Public/               .xsession-errors.old

Avec l'utilisateur "normal", ici debian, cela fonctionne car le fichier .bashrc par défaut de l'utilisateur se termine comme ceci:

debian@stretch:~$ tail .bashrc 
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

ce qui n'est pas le cas pour l'utilisateur root:

root@stretch:/home/debian# cat /root/.bashrc 
# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "`dircolors`"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

Cette section "enable bash completion in interactive shells" qui n'existe pas dans le fichier /root/.bashrc est bien présente dans le fichier /etc/bash.bashrc mais elle y est commentée:

root@stretch:/home/debian# tail -n 25 /etc/bash.bashrc  | head -n 8
# enable bash completion in interactive shells
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

Il suffit donc de la ré-activer pour que la complétion fonctionne aussi pour root.

Une fois cela fait, la section dans le .bashrc utilisateur n'est plus nécessaire.

mercredi 5 octobre 2016

Trouver de la documentation pour se former au scripting et à Bash

Lorsqu'on commence à écrire un script Shell sous Linux ou que l'on va devoir en maintenir un écrit depuis longtemps, on a souvent besoin de vérifier certaines syntaxes et parfois aussi envie de prendre le temps d'en découvrir d'autres.

Une simple recherche Google telle que "test string comparison shell" ne suffit pas toujours.

Mais alors quelles ressources consulter pour approfondir notre connaissance du Shell Linux et plus précisément de Bash, puisque c'est souvent ce dernier qu'on utilise désormais ?

La première réponse qui vient à l'esprit est évidemment:

Première méthode: RTFM !

man bash

Maintenant que https://manpages.debian.org/ n'est plus en ligne, on est quitte pour revenir au bon vieux terminal !

Deuxième méthode: Le site de GNU

On peut évidemment aussi consulter le manuel de Bash sur le site de GNU, mais l'avantage de la manpage contrairement au site de GNU c'est qu'elle est traduite dans ma langue, c'est à dire en Français ! D'où l'intérêt d'installer Linux en Français ...

Il y a aussi des ressources précieuses sur le site The Linux Documentation Project, par exemple:

Troisième méthode: The Linux Documentation Project

Le Bash Guide for Beginners est comme son nom l'indique conseillé aux novices du Bash. Son défaut évident est qu'il commence à dater puisqu'il est de 2008.

Toujours sur The Linux Documentation Project, vous trouverez un document beaucoup plus détaillé, à savoir le Advanced Bash-Scripting Guide qui est plus détaillé que le précédent, a un sommaire qui nous oriente facilement et en plus est plus à jour !

Quatrième méthode: Un bouquin !

Eh oui, les livres ça existe encore et des fois il y a aussi des nouvelles éditions !!! C'est le cas du Bash Pocket Reference de l'éditeur O'Reilly qui vient d'être ré-édité à un prix très raisonnable.

Si vous n'avez pas envie de débourser un centime, vous pouvez aussi vous tourner vers le livre de Michel Scifo, LES SCRIPTS AVEC LE SHELL BASH, qui présente les avantages suivants:

  1. Il est publié sous une license libre
  2. Il est récent
  3. Il est gratuit
  4. Il est en Français
  5. Il comporte des exercices

Enfin, il est recommandé par framboise314 !

Cinquième méthode: Un lint pour le Shell

C'est pas le tout d'écrire des scripts Bash, mais la syntaxe utilisée est-elle toujours correcte ? Pas de panique, l'outil Shellcheck est là, il existe en tant que paquet Debian et si vous voulez l'installer, tout est décrit ici dans un précédent post sur Shellcheck et la vérification de syntaxe en Shell.

samedi 18 avril 2015

Bien spécifier l'interpréteur de vos scripts Shell avec le Shebang

Considérons un script Shell très simple:

# script.sh

echo "Running script $0 with $SHELL"

Lors de son exécution en lançant ./script.sh, j'obtiens:

Running script ./script.sh with /bin/bash

Le script a été lançé avec l'interpréteur bash puisqu'il s'agit du Shell défini pour mon utilisateur.

Si maintenant, j'ajoute la ligne suivante au tout début de mon script:

#!/bin/ksh

J'obtiens à l'éxécution le message suivant:

bash: ./script.sh : /bin/ksh : mauvais interpréteur: Aucun fichier ou dossier de ce type

Pourquoi ? J'ai demandé au Shell bash, qui est mon Shell courant, de lancer le script avec le Korn Shell (/bin/ksh) qui n'est pas installé sur ma machine, et j'ai donc un message d'erreur.

Cette première ligne ajoutée s'appelle un "Shebang" et permet donc de changer d'interpréteur de commande localement dans un script. Le Shebang se compose donc des caractères "dièse" puis "point d'exclamation" suivis du chemin d'accès à l'interpréteur de commandes.

Notez que ce chemin doit être complet, ce qui est peut être gênant si nos scripts Shell doivent fonctionner sur des machines avec des Shells installés ailleurs que dans /bin. Même si c'est rare, cela peut arriver.

Maintenant, laissons tomber ksh puisqu'il n'est pas installé et considérons que notre script doit être exécuté avec bash.

Il y a un moyen de s'affranchir de ce chemin complet de l'interpréteur: il faut utiliser la commande env qui va utiliser la variable d'environnement PATH pour trouver le chemin de bash. On change donc le script comme suit:

#!/usr/bin/env bash
# script.sh

echo "Running script $0 with $SHELL"

L'interpréteur est bien trouvé parce que par défaut, le chemin /bin se trouve dans le PATH.

dimanche 18 janvier 2015

Les commandes zip et unzip sous Linux

La commande Linux zip permet de regrouper plusieurs fichiers en un seul fichier compressé au format du même nom inventé pour PKZIP.

Son utilisation est extrêmement simple.

Sous Debian, il faut commencer par l'installer ainsi que la commande correspondante pour la décompression (zip et unzip ne l'étant pas par défaut):

apt-get install zip unzip

Eventuellement précédé de sudo.

La façon la plus simple d'invoquer zip est la suivante:

zip archive.zip file1 file2 ...

qui produit un fichier archive.zip incluant l'ensemble des fichiers passés en paramètres.

Le suffixe .zip étant ajouté automatiquement au nom de l'archive, on peut simplifier la commande en:

zip archive file1 file2 ...

Si l'archive existait déjà, la commande zip ajoute les fichiers à cette dernière. Par exemple:

zip archive file3 file4 ...

va mettre à jour le fichier archive.zip et non le recréer. Ce dernier contiendra alors 4 fichiers. On peut le vérifier comme suit:

unzip -l archive.zip

Cette dernière commande permettant de lister le contenu d'une archive.

Pour vérifier l'intégrité d'une archive, on pourra utiliser:

zip -T archive.zip

Si maintenant, je veux inclure dans mon archive le contenu d'un ou plusieurs répertoires, il faut ajouter le flag -r:

zip -r archive folder1 folder2 ...

parce que zip n'inclue pas le contenu des répertoires par défaut.

Maintenant, pour extraire le contenu d'une archive zip dans le répertoire courant:

unzip archive.zip

ou

unzip archive

Cette dernière syntaxe étant moins utilisée puisque le Shell pourra ajouter le suffixe .zip par complétion.

Et si le répertoire courant ne nous convient pas:

unzip -d extraction_folder archive

Les commandes zip et unzip présentent bien évidemment de multiples options non décrites ici ; on pourra les découvrir comme suit:

zip --help

et

unzip --help

- page 1 de 3