Un Bloc Note pour débuter en ligne de commande¶
Présentation :¶
L'objectif de ce document est de vous faire découvrir par la pratique les supers pouvoirs de la ligne de commande (ce qui impliquent...).
Ainsi, vous saurez dialoguer avec le sytème d'exploitation, l'OS, de votre machine, sans recourir à une interface graphique, en mode console textuelle comme au temps de premiers ordinateurs. Mais figurez-vous que ceci n'appartient pas qu'à l'ère des "ordinosaures", bien au contraire...
Pour débuter vous allez mener les activités suivantes dans vos environnements usuels :
- sur votre iPad, installer les applications
a-Shell minietiSH Shelldepuis le self-service et les démarrer ; - sur le serveur jupyterhub accessible au lycée à l'adresse 10.1.3.50, se connecter puis cliquer sur le bouton
Nouveauen haut à droite de la page d'accueil puis choisirTerminal; - sur un PC du labo de SI, dans
Cortanarechercher l'applicationUbuntuet la démarrer ;
Cela à pour effet d'ouvrir une fenêtre qui émule un Terminal sur votre écran ;
Le caractère $ s'appelle un prompt, c'est-à-dire une invitation à entrer au clavier une commande système dans le Terminal.
uname
Le programme qui interprète les instructions de commandes système est appelé shell
Il existe une grande variété de shells comme sh, bash, dash, ksh, csh..., pour les systèmes de type UNIX ;
Notre serveur JupyterHub est installé sur une distribution Ubuntu Server, c'est un système d'exploitation de type GNU/Linux, aussi, le shell par défaut est donc le bash.
Les instructions de commandes de a-Shell mini sont un portage spécifique de commandes Unix pour iOS et sont volontairement réduites (mais extensibles). Le système d'exploitation installé sur votre iPad se nomme Darwin), aussi a-Shell utilise la version BSD : il y a donc des petites différences dans les options et le comportement des commandes par rapport au bash du projet GNU...
Malgré quelques légères variations d'un OS à l'autre, les instructions de commandes pour les systèmes de type UNIX sont restées les mêmes depuis les années 1960 et elles fonctionnent aussi bien sous Linux et Mac OS X que maintenant sous Windows 10 avec PowerShell et Windows Subsystem for Linux, WSL. Ainsi donc, l'apprentissage que vous allez faire ici est portable et sera très certainement durable...
Les instructions de commandes système s'écrivent donc dans un terminal après une invite et ont la forme suivante :
nom_de_la_commande -option(s) attribut(s)
Par exemple, depuis le serveur du lycée, on peut utiliser de telles commandes :
- pour télécharger un fichier disponible sur le web
wget URL_du_fichier; - ou pour cloner un dépot GitHub
git clone URL_du_depot.git.
A faire vous même n°1 :
Pour connaitre votre OS, saisir successivement sur iPad, PC et serveur, les instructions :
unamequi renvoie le nom du système d'exploitation de la machine ;uname -aqui complète avec d'autres informations concernant la version de l'OS et le hardware de la machine...et relever les différences :
... Les différences sont ipad: darwin, kernel pc: linux, microsoft
Avertissement, trucs à connaître :¶
- auto-complétion : après avoir tapé les premiers caractères, il est possible d'appuyer sur la touche
Tabqui permet d'ajouter la suite de la commande, du nom du répertoire ou du fichier. Cela évite les erreurs de frappe et est très appréciable pour éviter de saisir le nom de fichier parfois long et complexe comme le nom de certain paquet. Peut être utilisé plusieurs fois si plusieurs noms ont une partie commune. Attention, c'est sensible à la casse !
- historique de commande : les flèches haut et bas permettent de rappeler des anciennes commandes ; Pour la petite histoire, c'est Bill GATES qui a codé ces touches UNIX quand il était étudiant...
- Sur iPad, Nicolas Holzschuch, le développeur de a-Shell mini, a ajouté, comme dans
iSH Shell, un bandeau en bas de l'application avec des bouton qui assurent, entre autres, les fonctions d'auto-complétion et d'historique de commande.


Nicolas Holzschuch est Directeur de recherche à l’INRIA de Grenoble-Rhône-Alpes : https://maverick.inria.fr/Members/Nicolas.Holzschuch/, c'est également lui qui développe l'application Carnets.
Les commandes de bases à découvrir :¶
A faire vous même n°2 :
Pour aller plus avant, la suite de ce notebook présente d'autres commmandes de base à expérimenter dans un terminal...
A mesure que vous explorez ce bloc-note et que vous pratiquez la ligne de commande, compléter le tableau suivant pour établir votre synthèse des principales instructions à retenir :
| Commande | Option | Paramètre | Action |
|---|---|---|---|
| uname | -a | ... | montre l'OS utilisé |
| pwd | -l, -p | unix | ou je suis dans les dossiers |
| mkdir | ... | nomdu fichier | creer un fichier |
| whoami | ... | ... | dit ou je suis |
| touch | ... | .md | creer un fichier markdown |
| echo | ... | ecrit un message dans un fichier | |
| cat | ... | ... | concatener des fichiers |
| cowsay | ... | ... | |
| mv | fichier1 fichier2 | ... | renomme un fichier |
| cp | ... | ... | copie dans un autre fichier |
| cd | ... | ... | change de dossier |
| clear | ... | ... | efface laffichage du terminal |
| rm | ... | ... | supprimer un fichier |
| curl | ... | ... | telecharge un fichier web |
| unzip | fichier.zip | ... | dezipper un fichier |
| zip | ... | ... | zipper un fichier |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
Afficher le dossier courant, pwd = present working directory :¶
pwd
'/home/jupyter-alan'
Cette instruction permet de répondre à la question : où suis-je dans l'arborescence des dossiers ?
Sur le serveur du lycée, le texte
jupyter-pnom@r610b:~indique que vous êtes connecté sur la machiner610bsous le nom d'utilisateurjupyter-pnomet que le dossier de travail actuel est le dossier~, c'est-à-dire votre dossier personnel sur le serveur/home/jupyter-pnom.Le symbole
~est donc un raccourci pour désigner le dossier personnel de l'utilisateur ; de même les symboles.et..désignent respectivement le dossier courant et le dossier parent.Sur votre iPad, l'application a-Shell mini, comme chaque application, a son propre dossier
~, tel queprivate/var/mobile/Containers/Data/Application/1C49F07A-C30F-45E7-ADFD-8C350D68641A, et par défaut à l'ouverture d'une fenêtre de terminal a-Shell, le dossier courant est~/Documents
Deviner ce que renvoie l'instruction suivante, whoami = ... :¶
whoami=jupyter-alan
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-4-aa41e69ce1cb> in <module> ----> 1 whoami=jupyter-alan NameError: name 'jupyter' is not defined
Cette instruction permet de répondre à la question : Ou je suis
Créer un dossier, mkdir = make directory :¶
Au fur et à mesure que vous exécutérez les instructions de commande suivantes, observez leur effet sur le serveur JupyterHub dans l'onglet
Home Pageet sur votre iPad avec l'application Fichiers dans le dossier a-Shell mini et ajouter vos propres commentaires d'observation...
mkdir monDossier
Créer un fichier vide au format markdown :¶
touch monFichierMarkdown.md
File "<ipython-input-20-5a558aa77e4e>", line 1 touch monFichierMarkdown.md ^ SyntaxError: invalid syntax
Si le fichier existe déjà, la commande
touchactualise le timestamp (l'horadatage) d'accès au fichier.
Créer un fichier au format texte en y intégrant du contenu par redirection du flux :¶
echo "Salut le monde" > monFichierTexte.txt
echoest équivalent à unprint()en python ; ainsiecho "Salut le monde"affiche en console le messageSalut le monde.Le symbole
>fait une redirection du flux ; ainsi, avec la commandeecho "Salut le monde" > monFichierTexte.txt, la valeur renvoyée parecho "Salut le monde"est inscrite dans le fichiermonFichierTexte.txtqui est créé s'il n'existe pas préalablement.
Afficher le contenu d'un fichier :¶
cat monFichierTexte.txt
catest la contraction en anglais de catenate c'est à dire concaténer...
less monFichierTexte.txt # touche "Q" pour quitter l'affichage et revenir au prompt
Observer et expliquer ce que produisent les instruction suivantes :
cat monFichierTexte.txt > monAutreFichierTexte.txt cat monAutreFichierTexte.txt... Il nous renvoi ce quil se trouve dans le fichier
Observer et expliquer la différence entre les deux séquences d'instructions suivantes :
echo "Hello world" > monFichierTexte.txt cat monFichierTexte.txtet :
echo "Demat d'an holl" >> monFichierTexte.txt cat monFichierTexte.txt...
Observer et expliquer ce que produit l'instruction suivante :
cat monAutreFichierTexte.txt monFichierTexte.txt > monFichierMarkdown.md cat monFichierMarkdown.md...
Afficher avec la commande cowsay = ... :¶
cowsay 'Bonjour'
Décrire ce que produit l'instruction
cowsay: Linstruction cowsay dessine une vache avec une bulleObserver ce que produit l'instruction suivante sachant que le symbole
|, pipe en Anglais, permet de relier le flux de sortie d'une commande au flux d'entrée d'une autre : ...cat monAutreFichierTexte.txt | cowsay -p -T 'U 'Cela modifie la tete de la vache
Expliquer alors ce que produit l'instruction suivante en précisant que permet le symbole
;:cat monFichierMarkdown.md | cowsay > monFichierTexte.txt ; less monFichierTexte.txtCela transfere la vache dans un fichier texte
Déplacer un fichier, un dossier, mv = move :¶
mv monFichierTexte.txt /home/jupyter-pnom/monDossier/ # Sur le serveur, remplacer "pnom" par votre nom d'utilisateur
mv monFichierTexte.txt monDossier/ # Sur iPad
- Commentez pour la destination s'il s'agit d'un chemin absolu ou relatif ;
- Pensez à rafraichir l'affichage dans Fichiers sur iPad comme dans l'onglet
Home Pagesur le serveur.Remarque :
mv monFichierTexte.txt monDossier/toto.txtpermet de déplacer le fichier tout en le renommant.
Copier dans un autre dossier, cp = copy :¶
cp monFichierMarkdown.md monDossier/ # Sur le serveur
cp monFichierMarkdown.md ~/Documents/monDossier/ # Sur iPad
Changer de dossier courant, cd = change directory :¶
cd monDossier
Quelle commande permet de vérifier ce changement ?
...
# pour vérifier...
Copier et renommer un fichier :¶
cp monFichierTexte.txt monFichierTexteBis.txt
Lister le contenu d'un dossier¶
ls
ls -a
ls -l
ls -al
ls ..
Aller au dossier racine¶
cd /
ls *
Revenir au dossier utilisateur par défaut¶
cd
ls *
Effacer l'affichage du terminal¶
clear
Supprimer un fichier, rm = remove : ( ATTENTION ! C'est sans retour...)¶
rm monFichierMarkdown.md
Supprimer un dossier et tout son contenu : ( ATTENTION ! C'est radical et sans retour...)¶
rmdirpermet de supprimer un dossier seulement s'il est vide
rm -rf monDossier
rm --help
ou¶
man rm # touche "Q" pour quitterhelp
Pour obtenir l'aide général :¶
help
curl wttr.in/morlaix
Afficher l'entête d'une page web :¶
curl --head http://api.si.lycee.ecmorlaix.fr/APprentissageHtmlCss/
Copier le code d'une page web dans un fichier dans le dossier courant :¶
curl http://api.si.lycee.ecmorlaix.fr/APprentissageHtmlCss/ > maPage.html
Télécharger un fichier du web dans le dossier courant :¶
curl -O http://api.si.lycee.ecmorlaix.fr/APprentissageHtmlCss/zip/hyperliens.zip
Télécharger un fichier du web dans le dossier courant en le renommant :¶
curl -o monNotebookTerminal.ipynb https://raw.githubusercontent.com/ericECmorlaix/1NSI_2021-2022/main/docs/ipycanvas-Le_BN_pour_dessiner.ipynb
Dézipper un fichier :¶
Sur iPad, la commande
unzipn'est pas disponible de base dans a-Shell mini mais il est possible de l'y ajouter comme d'autres commandes à partir de la page https://github.com/holzschu/a-Shell-commands.Pour ce faire il faut créer un dossier nommé
bindans le dossier~/Documents/; Puis télécharger et déplacer le fichier correspondant à la commande souhaitée dans le dossier~/Documents/bin.Il est alors possible de l'utiliser comme sur le serveur :
unzip hyperliens.zip
Zipper des fichiers :¶
Sur iPad, il faut préalablement ajouter la commande
zipdans le dossier~/Documents/bin
zip -r monZip.zip monDossier # Compresse tout le contenu de monDossier dans un fichier monZip.zip
A faire vous même n°3 :
Renseigner vous avec le manuel et l'aide quant aux options des commandes date et cowsay pour créer un fichier contenant :
code
___________________________
< Nous sommes le 06/01/2021 >
---------------------------
\ / \ //\
\ |\___/| / \// \\
/0 0 \__ / // | \ \
/ / \/_/ // | \ \
@_^_@'/ \/_ // | \ \
//_^_/ \/_ // | \ \
( //) | \/// | \ \
( / /) _|_ / ) // | \ _\
( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
(( / / )) ,-{ _ `-.|.-~-. .~ `.
(( // / )) '/\ / ~-. _ .-~ .-~^-. \
(( /// )) `. { } / \ \
(( / )) .----~-.\ \-' .~ \ `. \^-.
///.----..> \ _ -~ `. ^-` ^-_
///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
/.-~
sudo apt install cowsay
cowsay -f dragon "la date daujourdhui est" $date
File "<ipython-input-17-381b58576c9f>", line 1 cowsay -f dragon "gg" ^ SyntaxError: invalid syntax
A faire vous même n°4 :
Pour vous entrainer en ligne de commande, résolvez ce jeu de piste : http://luffah.xyz/bidules/Terminus/
compléter votre tableau des commandes utilisées et réaliser un plan au fur et à mesure de votre quête...
Rechercher :¶
Pour de nombreuses commandes, il est souvent utile de faire appel à des méta-caractères :
- Il y a évidemment le caractère
*qui remplace un ou plusieurs caractères (ou même aucun !) ;- Il y a aussi
?pour ne remplacer qu'un caractère ;- Si vous avez besoin d'un caractère qui est aussi un méta-caractère, utilisez
\(anti-slash) devant. Cela évite au caractère d' être interprété par le shell. Il l'affiche seulement.
find :¶
find */*.ipynb
grep :¶
Rechercher ce que permet grep. Voici un exemple simple :
curl -O https://www.gutenberg.org/files/2650/2650-0.txt
grep Title 2650-0.txt
grep Author 2650-0.txt
grep -n madeleine 2650-0.txt
Références aux programmes :¶
Architectures matérielles et systèmes d’exploitation¶
| Contenus | Capacités attendues | Commentaires |
|---|---|---|
| Systèmes d’exploitation. | Identifier les fonctions d’un système d’exploitation. Utiliser les commandes de base en ligne de commande. Gérer les droits et permissions d’accès aux fichiers. |
Les différences entre systèmes d’exploitation libres et propriétaires sont évoquées. Les élèves utilisent un système d’exploitation libre. Il ne s’agit pas d’une étude théorique des systèmes d’exploitation. |
Ecrire des scripts¶
A noter qu'on peut également écrire des commandes système dans et les exécuter depuis une cellule de code ipython mais dans ce cas il faut les faire précéder d'un
!.
# Code à tester dans un notebook sur le serveur ou dans l'interpréteur ipython d'a-Shell mini sur votre iPad
def Lister_le_contenu_de_ce_dossier():
liste_du_contenu = !ls
return liste_du_contenu
Lister_le_contenu_de_ce_dossier()
Ressources :¶
Pour conforter et aller plus loin en ligne de commande :¶
Une application sympathique à faire sur une Raspberry Pi : https://projects.raspberrypi.org/en/projects/pacman-terminal
https://doc.ubuntu-fr.org/tutoriel/console_ligne_de_commande
https://linux.goffinet.org/administration/le-shell/la-ligne-de-commande/
Pour tester en ligne :¶
- http://weblinux.univ-reunion.fr
- https://itsfoss.com/online-linux-terminals/
- https://www.onworks.net/
Sur Windows 10, installer WSL, les instructions se trouvent ici :¶
- https://docs.microsoft.com/fr-fr/windows/wsl/install-win10#manual-installation-steps
- https://doc.ubuntu-fr.org/wsl
- https://docs.microsoft.com/fr-fr/windows/terminal/
- https://devblogs.microsoft.com/commandline/
- https://devblogs.microsoft.com/commandline/getting-started-with-windows-terminal/
- https://searchitoperations.techtarget.com/tip/On-Windows-PowerShell-vs-Bash-comparison-gets-interesting

Ce document est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
Pour toute question, suggestion ou commentaire : eric.madec@ecmorlaix.fr