IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ LinuxConsultez toutes les FAQ

Nombre d'auteurs : 56, nombre de questions : 260, dernière mise à jour : 27 juin 2022  Ajouter une question

 

Cette FAQ a été réalisée à partir des contributions des membres du forum Linux de Developpez.com et de l'équipe de rédaction. Merci à eux !

Nous sommes perpétuellement à l'écoute de vos suggestions et corrections, n'hésitez pas à nous en faire part sur le forum.

SommaireLe Shell (61)
précédent sommaire suivant
 

L'interpréteur de ligne de commande (ou "shell") est une interface en mode texte, qui permet à un utilisateur d'interagir avec le noyau afin d'effectuer des opérations diverses : afficher la date, lire un fichier, récupérer des données distantes...
Il comporte des commandes qui lui sont propres (commandes internes), et peut exécuter toutes les commandes disponibles sur le système (commandes externes) pourvu que les ressources soient disponibles : on ne peut pas lancer un programme X* (gedit, firefox...) si X* n'est pas démarré !
Certaines commandes internes de l'interpréteur de commandes sont aussi disponibles en tant que commandes externes : elles portent le même nom, mais n'ont pas obligatoirement les mêmes options, ou les mêmes options ne se comportent pas exactement de la même manière (c'est le cas de time).
Le fonctionnement apparent du shell est simple :
il attend que l'utilisateur appuie sur 'Entrée' après avoir saisi le nom d'une commande ;
il exécute la commande ;
il attend que l'utilisateur appuie sur 'Entrée'...

Les Shells principaux sont :

  • Bash (bourne Shell)
  • Csh (C shell)
  • Ksh (Korn Shell)

Mis à jour le 9 novembre 2017 chrtophe N_BaH

Contrairement à Windows, Linux peut être entièrement piloté en ligne de commande, par laquelle on a accès à toute sa puissance et toute sa configuration. L'interface graphique n'est qu'une couche applicative optionnelle, mais non nécessaire pour des serveurs par exemple (qui ne font basiquement que répondre à des requêtes réseau).

Un administrateur système se doit de maîtriser le Shell pour diverses raisons :

  • même si certaines distributions ou applications proposent des assistants de configuration graphiques, c'est en modifiant les fichiers de configuration textuels qu'on arrive à paramétrer le plus finement le système ;
  • le Shell et son langage sont très puissants, et bien souvent, il est très efficace de réaliser quelques scripts simples pour automatiser certains traitements sur des serveurs ou modifier des configurations de services à la volée ;
  • par sécurité, on évite d'installer tout élément non strictement nécessaire sur un serveur (exemple typique : une interface graphique), et son administration à distance se fera la plupart du temps en ssh, qui est un protocole d'accès sécurisé à la console par le réseau ;
  • la maîtrise du Shell permet de contrôler le système à 100 % (surveillance complète de l'activité de la machine, démarrage et arrêt d'applications, gestion du multitâche, recherches rapides, etc.) et est donc un moyen très efficace d'administrer une machine

Une autre raison est que sous Linux toute la configuration est transparente, stockée dans des fichiers textuels lisibles par tous et généralement bien documentés (commentaires). La configuration de pratiquement n'importe quel logiciel peut donc s'effectuer par un simple éditeur de texte ou à l'aide de scripts, où le langage Perl est assez populaire puisqu'il est spécialement dédié au traitement de chaînes de caractères.

Même pour une utilisation de Linux en tant que station de travail où des assistants graphiques vous facilitent les tâches courantes (configuration de base, installation de logiciels, etc.), un minimum de notions de Shell s'avéreront nécessaires dès que vous devrez vous plonger dans certaines configurations un peu plus complexes par exemple la modification des paramètres du noyau ou autres éléments du système.

Mis à jour le 23 octobre 2013 ok.Idriss ovh

Le Shell est un interpréteur de commande en mode texte (ou console). Il permet de passer des ordres (commandes) au système, et de "dialoguer" avec lui (on parle de shell interactif).
Il est possible de piloter entièrement Linux en ligne de commande : démarrer, suspendre et arrêter des programmes, gérer les services (programmes résidents en mémoire), configurer le système (édition de fichiers texte), gérer les tâches planifiées, le multitâche, etc.

Une des premières choses à apprendre sous Linux est le Shell et ses commandes de base, car cela permet d'avoir une totale maîtrise du système.

Techniquement, le Shell est une boucle infinie en C qui lit ce que l'utilisateur tape au clavier et réagit :

  • soit il s'agit d'une commande interne du shell qui est exécutée directement (fonction interne, ou builtin) ;
  • soit il lance un programme externe ;
  • il doit aussi interpréter les caractères spéciaux (redirection, pipes...).

Mis à jour le 27 octobre 2013 ok.Idriss ovh

Il existe plusieurs façons de procéder pour trouver un fichier sous Linux. La méthode la plus utilisée est la commande locate :

Code bash : Sélectionner tout
$ locate nom_du_fichier

Cette commande affichera toutes les occurrences trouvées. Que ce soit une partie du nom, d'un répertoire ou d'un fichier. Il se peut donc qu'il y ait beaucoup d'occurrences !

P.-S. Pour que la commande locate fonctionne, il faut préalablement créer sa base de données utile. Il faut pour cela exécuter la commande updatedb en tant que root. Cette commande permet également de mettre à jour la base de données (sinon les modifications du système de fichier ne seront pas prises en compte) : il est donc judicieux de l'exécuter régulièrement (via un cron), par exemple.

Une autre méthode est d'utiliser la commande find :
Code bash : Sélectionner tout
$ find / -name "fichier.txt"

Cette commande affichera tous les fichiers se nommant fichier.txt à partir du répertoire racine.
Il est possible d'utiliser les expressions régulières :
Code bash : Sélectionner tout
$ find / -name "toto*"

Le résultat sera tous les fichiers et répertoires commençant par toto, suivi de n'importe quelle occurrence.
Pour éviter d'avoir les "permission denied" sur des répertoires :
Code bash : Sélectionner tout
find / -type f -name "le_fichier_a_chercher" 2>/dev/null

find est très puissant, et permet aussi d'employer les expressions régulières, comme le montre l'exemple suivant qui permet de trouver tous les fichiers contenant une chaîne ou une regexp dans une arborescence :
Code bash : Sélectionner tout
1
2
find <repertoire_depart> -type f -exec grep -H "<chaine>" {} ; 
find <repertoire_depart> -type f -exec egrep -H "<regexp>" {} ;

Lorsqu'il s'agit de gros volumes de fichiers :
Code bash : Sélectionner tout
1
2
find <repertoire_depart> -type f | xargs grep -H "<chaine>" 
find <repertoire_depart> -type f | xargs egrep -H "<regexp>"

Renommer tous les fichiers contenant chaine en chene :
Code bash : Sélectionner tout
for f in ./*chaine*; do mv "$f" "${f/chaine/chene}"; done
---
En récursif sur une arborescence :
Code BASH : Sélectionner tout
1
2
shopt -s nullglob globstar 
for f in ./**/*chaine*; do mv "$f" "$(echo "$f" | sed 's/chaine/chene/')"; done
ou
Code bash : Sélectionner tout
find . -type f -name '*chaine*' -execdir sh -c 'echo mv "$1" "$(echo "$1" | sed "s/chaine/chene/")"' sh {} \;
cela mérite quelques explications : quand on appelle sh avec l'option -c, les paramètres positionnels commencent à zéro, c'est-à-dire que le premier argument sera le paramètre positionnel 0 ($0), alors que dans un script $0 est le nom du shell. Pour imiter ce comportement habituel, on ajoute la chaîne sh comme premier argument.
De plus, on utilise -execdir plutôt que -exec, pour éviter [...voir infra l'explication de jack-ft]

Il y a même moyen d'effectuer des opérations sur fichier en appelant des scripts externes ; par exemple : changer toutes les option=true en option=false dans tous les fichiers *.conf en récursif en gardant une copie de sauvegarde :
Code bash : Sélectionner tout
find . -type f -name "*.conf" | xargs perl -pi.save -e 's/option\=true/option\=false/'

Mis à jour le 23 octobre 2013 mathk nyal N_BaH ok.Idriss vosaray

Certes, mv permet de renommer des fichiers. Toutefois, l'outil n'est pas très adapté pour renommer un grand nombre de fichiers. Il est évident que vous pourriez rapidement écrire une boucle for, ou même un script pour arriver à votre fin, mais pourquoi s'embêter alors qu'un outil est là pour ça.
En effet, rename permet de renommer une multitude de fichiers et cela très facilement.

Voici un exemple d'utilisation, permettant de changer l'extension de tous les fichiers de foo à txt du dossier courant :

Code bash : Sélectionner tout
rename 's/.foo/.txt/' *

Comme vous le voyez, la syntaxe est simple. Voici l'usage :
Code bash : Sélectionner tout
rename [ -v ] [ -n ] [ -f ] perlexpr [ fichiers ]

L'outil utilise les expressions régulières de Perl.

Mis à jour le 23 juillet 2014 LittleWhite

La commande find pour trouver des fichiers propose l'option -size.
Ainsi pour trouver des fichiers de plus de 100 méga-octets, vous pouvez utiliser la commande :

Code bash : Sélectionner tout
find / -size +100M
On notera ici que la commande propose plusieurs suffixes :
  • b : pour des blocs de 512 octets ;
  • c : pour des octets ;
  • w : pour des mots de deux octets ;
  • k : pour des kilo-octets (unités de 1 024 octets) ;
  • M : pour des méga-octets (unités de 1 048 576 octets) ;
  • G : pour des giga-octets (unités de 1 073 741 824 octets) ;


Vous pouvez toujours effectuer une recherche plus précise en précisant plusieurs tailles :
Code bash : Sélectionner tout
find / -size +100M -size -1000M

Mis à jour le 22 août 2014 LittleWhite

Lorsqu'on lance un script à travers l'interface graphique, le terminal se ferme à la fin de l'exécution du script, et ce qu'il y eu une erreur ou non.
Vous pouvez empêcher la fermeture du terminal de multiples façons. En voici deux intéressantes :

Code bash : Sélectionner tout
1
2
echo "Appuyez sur entrée..." 
read
Et
Code bash : Sélectionner tout
$SHELL
La première méthode attend que l'utilisateur appuie sur la touche « Entrée » pour fermer le terminal. La seconde méthode va ouvrir un second shell (que ce soit Bash ou autre) et donc permettre à l'utilisateur d’interagir avec ce dernier.

Mis à jour le 26 novembre 2017 LittleWhite mm_71

Vous venez de créer un script shell et vous souhaitez vérifier les commandes exécutés par le script (avec leurs options). Pour cela, bash proposé l'option -x. En l'utilisant, bash écrira les commandes lancées par le script.
Par exemple, pour le script suivant :

Code shell : Sélectionner tout
1
2
3
4
FOLD=/tmp/toto 
touch main.c 
cd /tmp/ 
mkdir ${FOLD}
Tout en s'exécutant, le script affichera :
+ FOLD=/tmp/toto
+ touch main.c
+ cd /tmp/
+ mkdir /tmp/toto

Il est aussi possible d'activer cette fonctionnalité sur une portion précise du code avec set -x (pour activer la trace) et set +x pour désactiver.

Mis à jour le 30 mai 2020 LittleWhite

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.