Linux |
CentOS 5.3 |
|
tcsh(1) |
tcsh − shell C avec complètement des noms de fichiers et édition de lignes de commandes |
tcsh [−bcdefFimnqstvVxX]
[−Dnom[=valeur]] [arg ...] |
tcsh est une version améliorée mais complètement compatible du shell C du UNIX de Berkeley, csh(1). C’est un interpréteur de langage de commandes utilisable à la fois comme shell de connexion interactif et comme processeur de commandes de scripts shell. Il inclut un éditeur de ligne de commandes complet (voyez L’éditeur de ligne de commandes), un complètement des mots programmable (voyez Complètement et listage), une correction orthographique (voyez Correction orthographique), un mécanisme d’historique (voyez Substitution d’historique), un contrôle des travaux (voyez Travaux) et une syntaxe semblable à celle du C. La section NOUVELLES FONCTIONNALITÃS décrit les améliorations majeures de tcsh par rapport à csh(1). Tout au long de ce manuel, les fonctionnalités de tcsh qu’on ne trouve pas dans la plupart des implémentations de csh (spécifiquement le csh de BSD4.4) sont marquées par un « (+) », et les fonctionnalités qui sont présentes dans csh(1) mais qui ne sont généralement pas documentées sont marquées par un « (u) ». |
Traitement de la liste d’arguments |
Si le premier argument (argument 0) du shell est « − », alors c’est un shell de connexion. Un shell de connexion peut également être spécifié en invoquant le shell avec l’option −l pour seul argument. Les autres arguments options sont interprétés comme suit : |
−b |
Forcer une « cassure » lors du traitement des options, en faisant en sorte que tout argument ultérieur soit traité comme un argument non option. Les arguments restants ne seront pas interprétés comme des options du shell. Cela peut être utile pour passer des options à un script shell en évitant une confusion ou un éventuel subterfuge. Le shell n’exécutera pas de script SUID sans cette option. |
||
−c |
Les commandes sont lues à partir de l’argument suivant (qui doit être présent, et qui doit être seul), stockées dans la variable shell command pour pouvoir être référencées, et exécutées. Tous les arguments restants sont placés dans la variable shell argv. |
||
−d |
Le shell charge la pile de répertoires à partir de ~/.cshdirs comme décrit dans Démarrage et arrêt, que ce soit un shell de connexion ou non. (+) |
−Dnom[=valeur] |
Fournit une valeur à la variable d’environnement nom. (Domain/OS uniquement) (+) |
−e |
Le shell se termine si une des commandes invoquées se termine anormalement ou produit une valeur de retour non nulle. |
||
−f |
Le shell ignore ~/.tcshrc, et démarre ainsi plus rapidement. |
||
−F |
Le shell utilise fork(2) au lieu de vfork(2) pour créer des processus. (Convex/OS uniquement) (+) |
||
−i |
Le shell est interactif et demande une entrée de haut niveau, même si elle ne semble pas provenir d’un terminal. Les shells sont interactifs sans cette option si leurs entrées et sorties sont des terminaux. |
||
−l |
Le shell est un shell de connexion. Applicable uniquement si −l est la seule option spécifiée. |
||
−m |
Le shell charge ~/.tcshrc même s’il n’appartient pas à l’utilisateur effectif. Des versions plus récentes de su(1) peuvent passer −m au shell. (+) |
||
−n |
Le shell analyse les commandes mais ne les exécute pas. Cela aide au débogage des scripts shell. |
||
−q |
Le shell accepte SIGQUIT (voyez Traitement des signaux) et agit quand il est utilisé sous un débogueur. Le contrôle des travaux est désactivé. (u) |
||
−s |
Les commandes d’entrée sont lues à partir de l’entrée standard. |
||
−t |
Le shell lit et exécute une ligne d’entrée. Un « \ » peut être utilisé pour protéger le saut de ligne (« \n ») et continuer sur une autre ligne. |
||
−v |
Définit la variable shell verbose, afin que l’entrée de la commande soit renvoyée en écho après la substitution d’historique. |
||
−x |
Définit la variable shell echo, afin que les commandes soient renvoyées en écho juste avant leur exécution. |
||
−V |
Définit la variable shell verbose avant même d’exécuter ~/.tcshrc. |
||
−X |
Est à −x ce que −V est à −v. |
Après le traitement des arguments options, s’il reste des arguments mais qu’aucune des options −c, −i, −s ou −t n’est fournie, le premier argument est supposé être le nom d’un fichier de commandes, c.-à -d. le « script » à exécuter. Le shell ouvre ce fichier et sauvegarde son nom pour une éventuelle re-substitution pour « $0 ». Puisque de nombreux systèmes utilisent les shells standard version 6 ou 7 dont les scripts ne sont pas compatibles avec ce shell, celui-ci utilise un tel shell « standard» pour exécuter un script dont le premier caractère n’est pas un « #», c.-à -d. qui ne commence pas par un commentaire. Les arguments restants sont placés dans la variable shell argv. |
Démarrage et arrêt |
Un shell de connexion démarre en exécutant les commandes des fichiers système /etc/csh.cshrc et /etc/csh.login. Il exécute ensuite les commandes des fichiers situés dans le répertoire personnel (home) de l’utilisateur : d’abord ~/.tcshrc (+) ou, s’il n’est pas trouvé, ~/.cshrc ; ensuite ~/.history (ou la valeur de la variable shell histfile) ; puis ~/.login ; et finalement ~/.cshdirs (ou la valeur de la variable shell dirsfile) (+). Le shell peut lire /etc/csh.login avant plutôt qu’après /etc/csh.cshrc, et ~/.login avant plutôt qu’après ~/.tcshrc ou ~/.cshrc et ~/.history, s’il est compilé ainsi ; voyez la variable shell version. (+) Les shells non de connexion ne lisent que /etc/csh.cshrc et ~/.tcshrc ou ~/.cshrc au démarrage. Pour des exemples de fichiers de démarrage, veuillez consulter http://tcshrc.sourceforge.net. Les commandes comme stty(1) et tset(1), qui ne doivent être exécutées qu’une fois par connexion, sont habituellement situées dans un des fichiers ~/.login. Les utilisateurs qui doivent utiliser le même jeu de fichiers pour csh(1) et tcsh peuvent n’avoir qu’un seul ~/.cshrc qui vérifie l’existence de la variable shell tcsh avant d’utiliser des commandes spécifiques à tcsh, ou peuvent avoir à la fois un ~/.cshrc et un ~/.tcshrc qui emploient comme source (voyez la commande intégrée) le fichier ~/.cshrc. Le reste de ce manuel utilisera « ~/.tcshrc » pour vouloir dire « ~/.tcshrc » ou, si ~/.tcshrc n’est pas trouvé, « ~/.cshrc ». Normalement, le shell commence à lire des commandes à partir du terminal, en affichant l’invite « > ». (Le traitement des arguments et l’utilisation du shell pour traiter les fichiers contenant des scripts de commandes seront décrits plus tard.) Le shell effectue à plusieurs reprises la boucle suivante : il lit une ligne d’entrée de commande, la découpe en mots, la place dans la liste d’historique de commandes, l’analyse et exécute chaque commande de la ligne. On peut se déconnecter en tapant « ^D » sur une ligne vide, en tapant « logout » ou « login », ou encore via le mécanisme de déconnexion automatique du shell (voyez la variable shell autologout). Quand un shell de connexion se termine, il donne la valeur appropriée (« normal » ou « automatic ») à la variable shell logout, et exécute ensuite les commandes des fichiers /etc/csh.logout et ~/.logout. Le shell peut ignorer le DTR à la déconnexion si cela est compilé ; voyez la variable shell version. Les noms des fichiers de connexion et de déconnexion varient selon les systèmes pour assurer la compatibilité avec les différentes variantes de csh(1) ; voyez FICHIERS. |
Ãdition |
Nous décrivons d’abord L’éditeur de ligne de commandes. Les sections Complètement et listage et Correction orthographique décrivent deux ensembles de fonctionnalités qui sont implémentées sous forme de commandes d’éditeur, mais qui méritent un traitement spécifique. Finalement, la section Commandes de l’éditeur liste et décrit les commandes d’éditeur spécifiques au shell et leurs liaisons par défaut. |
L’éditeur de ligne de commandes (+) |
L’entrée de la ligne de commandes peut être éditée en utilisant des séquences de touches semblables à celles employées dans GNU Emacs ou vi(1). L’éditeur n’est actif que lorsque la variable shell edit est définie, ce qui est le cas par défaut dans les shells interactifs. La commande intégrée bindkey peut afficher et modifier les liaisons de touches. Des liaisons de touches de style Emacs sont utilisées par défaut (à moins que le shell n’ait été compilé différemment ; voyez la variable shell version), mais bindkey peut modifier les liaisons de touches pour utiliser un style vi. Le shell associe toujours les touches fléchées (comme définies dans la variable d’environnement TERMCAP) à |
bas |
down-history |
|||
haut |
up-history |
|||
gauche |
backward-char |
|||
droite |
forward-char |
à moins que procéder ainsi n’altère une autre liaison de caractère. On peut donner aux séquences d’échappement de touches fléchées la valeur « chaîne vide » ("") en utilisant settc pour empêcher ces liaisons. Les séquences ANSI/VT100 pour les touches fléchées sont toujours liées. Les autres liaisons de touches sont, pour la plupart, celles auxquelles les utilisateurs d’emacs(1) et de vi(1) s’attendent et peuvent facilement être affichées par bindkey, de sorte qu’il n’est pas nécessaire de les lister ici. De même, bindkey peut lister les commandes d’éditeur accompagnées d’une courte description de chacune d’entre elles. Notez que les commandes d’éditeur n’ont pas la même notion de « mot » que celle qu’a le shell. L’éditeur délimite les mots par n’importe quel caractère non alphanumérique ne faisant pas partie de la variable shell wordchars, alors que le shell ne reconnaît que les caractères d’espacement et certains des caractères ayant une signification spéciale pour lui, qui sont listés dans Structure Lexicale. |
Complètement et listage (+) |
Le shell est souvent capable de compléter des mots quand on lui fournit une abréviation unique. Tapez une partie d’un mot (par exemple « ls /usr/lost ») et appuyez sur la touche tab pour lancer la commande d’éditeur complete-word (compléter-mot). Le shell complète le nom de fichier « /usr/lost » en « /usr/lost+found/ », en remplaçant le mot incomplet par le mot complet dans le tampon d’entrée. (Note sur le « / » terminal : le complètement ajoute un « / » à la fin des répertoires complétés, et une espace à la fin des autres mots complétés, pour accélérer la frappe et fournir un indicateur visuel d’un complètement réussi. La variable shell addsuffix peut être indéfinie pour éviter cela.) Si aucune correspondance n’est trouvée (« /usr/lost+found » n’existe peut-être pas), la sonnerie du terminal retentit. Si le mot est déjà complet (il y a peut-être un « /usr/lost » sur votre système, ou vous avez peut-être pensé trop loin et avez déjà tapé le mot en entier), un « / » ou une espace est ajouté(e) à la fin si il/elle n’y était pas déjà . Le complètement fonctionne partout sur la ligne, et pas uniquement à la fin ; le texte complété pousse le reste de la ligne sur la droite. Le complètement au milieu d’un mot résulte souvent en des caractères excédentaires à la droite du curseur qui devront être effacés. Les commandes et les variables peuvent être complétées d’une façon fort similaire. Par exemple, taper « em[tab] » complète « em » en « emacs » si emacs est la seule commande sur votre système débutant par « em ». Le complètement peut trouver une commande si elle est située dans n’importe quel répertoire du path, ou bien si on lui fournit un nom de chemin complet. Taper « echo $ar[tab] » complète « $ar » en « $argv » si aucune autre variable ne commence par « ar ». Le shell examine le tampon d’entrée pour déterminer si le mot que vous voulez compléter doit être complété en tant que nom de fichier, commande ou variable. Le premier mot du tampon et le premier mot suivant « ; », « | », « |& », « && » ou « || » sont considérés être des commandes. Un mot débutant par « $ » est considéré être une variable. Tout le reste est considéré être un nom de fichier. Une ligne vide est « complétée » en tant que nom de fichier. Vous pouvez lister les complètements possibles d’un mot à tout moment en tapant « ^D » pour lancer la commande d’éditeur delete-char-or-list-or-eof. Le shell liste les complètements possibles en utilisant la commande intégrée ls−F et réaffiche l’invite et la ligne de commandes non terminée, par exemple : |
> ls /usr/l[^D] |
lbin/ lib/ local/ lost+found/ |
Si la variable shell autolist est définie, le shell liste les choix restants (s’il y en a) à chaque fois que le complètement échoue : |
> set autolist |
> nm /usr/lib/libt[tab] |
Si autolist vaut « ambiguous », les choix ne sont listés que lorsque le complètement échoue et n’ajoute aucun nouveau caractère au mot en cours de complètement. Un nom de fichier à compléter peut contenir des variables, votre répertoire personnel ou celui d’autres personnes abrégé en « ~ » (voyez Substitution des noms de fichiers), et des entrées de la pile de répertoires abrégées avec « = » (voyez Substitution de pile de répertoires). Par exemple, |
> ls ~k[^D] |
kahn kas kellogg |
ou |
> set local = /usr/local |
> ls $lo[tab] |
Notez que les variables peuvent également être développées explicitement via la commande d’éditeur expand-variables. delete-char-or-list-or-eof liste uniquement à la fin de la ligne ; au milieu d’une ligne, elle efface le caractère situé sous le curseur et, sur une ligne vide, provoque la déconnexion ou, si ignoreeof est définie, ne fait rien. « M-^D », lié à la commande d’éditeur list-choices, liste les complètements possibles n’importe où sur une ligne, et list-choices (ou n’importe laquelle des commandes d’éditeur apparentées qui effacent ou non, listent et/ou déconnectent, qui sont listées sous delete-char-or-list-or-eof), peut être liée à « ^D » avec la commande intégrée bindkey si vous le souhaitez. Les commandes d’éditeur complete-word-fwd et complete-word-back (qui ne sont liées à aucune touche par défaut) peuvent être utilisées pour cycler entre les différents complètements possibles, en remplaçant le mot courant par le mot suivant ou précédent dans la liste. La variable shell fignore peut être définie en tant que liste de suffixes à ignorer lors du complètement. Considérez le cas suivant : |
> ls |
Makefile condiments.h~ main.o side.c |
« main.c~ » et « main.o » sont ignorés lors du complètement (mais pas par le listage), car ils se terminent par un des suffixes de fignore. Notez qu’un « \ » est nécessaire devant « ~ » pour éviter qu’il ne soit développé en home comme décrit dans Substitution des noms de fichiers. fignore est ignoré si un seul complètement est possible. Si la variable shell complete vaut « enhance », le complètement 1) ignore la casse et 2) considère les points, tirets et caractères de soulignement (« . », « − » et « _ ») comme étant des séparateurs de mots, et que les tirets et les caractères de soulignement sont équivalents. Si vous aviez les fichiers |
comp.lang.c comp.lang.perl comp.std.c++ |
comp.lang.c++ comp.std.c |
et que vous aviez tapé « mail −f c.l.c[tab] », cela serait complété en « mail −f comp.lang.c », et ^D listerait « comp.lang.c » et « comp.lang.c++ ». « mail −f c..c++[^D] » listerait « comp.lang.c++ » et « comp.std.c++ ». Taper « rm a−−file[^D] » dans le répertoire suivant |
A_silly_file a-hyphenated-file another_silly_file |
listerait tous les trois fichiers, car la casse est ignorée et les tirets et caractères de soulignement sont équivalents. Les points ne sont néanmoins pas équivalents aux tirets et aux caractères de soulignement. Le complètement et le listage sont affectés par beaucoup d’autres variables shell : recexact peut être définie pour ne compléter que vers la correspondance unique la plus courte possible, même si taper plus de caractères peut résulter en une correspondance plus longue : |
> ls |
fodder foo food foonly |
émet juste un bip, car « fo » peut être développé en « fod » ou « foo », mais si nous tapons un autre « o », |
> rm foo[tab] |
> rm foo, |
le complètement se fait vers « foo », même si « food » et « foonly » correspondent également. autoexpand peut être définie pour lancer la commande d’éditeur expand-history avant chaque tentative de complètement, autocorrect peut être définie pour corriger l’orthographe du mot à compléter (voyez Correction orthographique) avant chaque tentative de complètement et correct peut être définie pour compléter les commandes automatiquement après que l’on ait tapé sur « entrée ». matchbeep peut être définie pour faire en sorte que le complètement bippe ou pas dans un certain nombre de situations, et nobeep peut être définie pour ne jamais bipper. nostat peut être définie pour fournir une liste de répertoires et/ou de motifs qui leur correspondent afin d’éviter que le mécanisme de complètement n’effectue un stat(2) sur ces répertoires. listmax et listmaxrows peuvent être définies pour limiter le nombres d’éléments et de lignes (respectivement) qui sont listés sans le demander au préalable. recognize_only_executables peut être définie pour que le shell ne liste que les exécutables lors d’un listage de commandes, mais c’est assez lent. Finalement, la commande intégrée complete peut être utilisée pour indiquer au shell la façon de compléter les mots différents des noms de fichiers, de commandes ou de variables. Le complètement et le listage ne fonctionnent pas sur les motifs génériques (glob-pattern, voyez Substitution des noms de fichiers), mais les commandes d’éditeur list-glob et expand-glob accomplissent des fonctions équivalentes pour les motifs génériques. |
Correction orthographique (+) |
Le shell peut parfois corriger l’orthographe des noms de fichiers, de commandes et de variables en plus de les compléter et de les lister. Les mots individuels peuvent être corrigés avec la commande d’éditeur spell-word (habituellement liée à M-s et M-S) et le tampon d’entrée entier avec spell-line (liée habituellement à M-$). La variable shell correct peut être fixée à « cmd » pour corriger le nom de commande, ou « all » pour corriger la ligne entière à chaque fois que la touche entrée est enfoncée, et autocorrect peut être fixée de sorte à corriger le mot à compléter avant chaque tentative de complètement. Quand la correction orthographique est invoquée d’une de ces façons, et que le shell pense qu’une partie quelconque de la ligne de commandes est mal orthographiée, il affiche l’invite avec la ligne corrigée : |
> set correct = cmd |
> lz /usr/bin |
On peut répondre « y » ou espace pour exécuter la ligne corrigée, « e » pour laisser la commande non corrigée dans le tampon d’entrée, « a » pour annuler la commande comme si « ^C » avait été tapé, et n’importe quoi d’autre pour exécuter la ligne originale non modifiée. La correction orthographique reconnaît les complètements définis par l’utilisateur (voyez la commande intégrée complete). Si un mot d’entrée situé à une position pour laquelle un complètement est défini ressemble à un mot de la liste des complètements, la correction orthographique enregistrera une faute de frappe et suggérera ce dernier mot pour effectuer la correction. Néanmoins, si le mot d’entrée ne correspond à aucun des complètements possibles pour cette position, la correction orthographique n’enregistrera pas de faute de frappe. Comme pour le complètement, la correction orthographique fonctionne partout sur la ligne, et repousse le reste de la ligne sur la droite en laissant éventuellement des caractères excédentaires à la droite du curseur. Attention : la correction orthographique peut ne pas fonctionner comme vous le souhaitez, et n’est principalement fournie qu’en tant que fonctionnalité expérimentale. Les suggestions et les améliorations sont les bienvenues. |
Commandes de l’éditeur (+) |
« bindkey » liste les liaisons de touches et « bindkey −l » liste et décrit brièvement les commandes d’édition. Seules les commandes nouvelles ou particulièrement intéressantes seront décrites ici. Voyez emacs(1) et vi(1) pour obtenir les descriptions des liaisons de touches de chacun de ces éditeurs. Le(s) caractère(s) au(x)quel(s) chaque commande est liée par défaut est (sont) fourni(s) entre parenthèses. « ^caractère » signifie un caractère de contrôle et « M-caractère » un méta-caractère, tapé en faisant escape-caractère sur les terminaux ne possédant pas de touche méta. La casse compte, mais les commandes qui sont liées à des lettres par défaut sont liées à la fois à des lettres minuscules et majuscules par commodité. |
complete-word (tab) |
Compléter un mot comme cela est décrit dans Complètement et listage. |
complete-word-back (non lié) |
Comme complete-word-fwd, mais descend à partir de la fin de la liste. |
complete-word-fwd (non lié) |
Remplace le mot courant par le premier mot de la liste des complètements possibles. Peut être répété pour monter dans la liste. à la fin de la liste, bippe et revient au mot incomplet. |
complete-word-raw (^X-tab) |
Comme complete-word, mais ignore les complètements définis par l’utilisateur. |
copy-prev-word (M-^_) |
Copie le mot précédent de la ligne courante dans le tampon d’entrée. Voyez également insert-last-word. |
dabbrev-expand (M-/) |
Développe le mot courant vers le mot précédent le plus récent ayant le mot courant comme préfixe, en examinant toute la liste d’historique (une seule fois) si c’est nécessaire. La répétition de dabbrev-expand sans aucune frappe entre-temps passe au mot précédent suivant etc., en ignorant les correspondances identiques, un peu comme le fait history-search-backward. |
delete-char (non lié) |
Efface le caractère situé sous le curseur. Voyez également delete-char-or-list-or-eof. |
delete-char-or-eof (non lié) |
Effectue un delete-char s’il y a un caractère sous le curseur, ou end-of-file sur une ligne vide. Voyez également delete-char-or-list-or-eof. |
delete-char-or-list (non lié) |
Effectue un delete-char s’il y a un caractère sous le curseur, ou list-choices à la fin de la ligne. Voyez également delete-char-or-list-or-eof. |
delete-char-or-list-or-eof (^D) |
Effectue un delete-char s’il y a un caractère sous le curseur, list-choices à la fin de la ligne, ou end-of-file sur une ligne vide. Voyez également ces trois commandes, chacune d’entre elles n’effectuant qu’une seule action, et delete-char-or-eof, delete-char-or-list ainsi que list-or-eof, chacune d’entre elles effectuant une combinaison de deux des trois commandes précitées. |
down-history (flèche-bas, ^N) |
Comme up-history, mais descend, en s’arrêtant à la ligne d’entrée originale. |
end-of-file (non lié) |
Signale une fin de fichier, forçant le shell à se terminer à moins que la variable shell ignoreeof ne soit définie pour empêcher cela. Voyez également delete-char-or-list-or-eof. |
expand-history (M-espace) |
Développe les substitutions d’historique dans le mot courant. Voyez Substitution d’historique. Voyez également magic-space, toggle-literal-history et la variable shell autoexpand. |
expand-glob (^X-*) |
Développe le motif générique situé à la gauche du curseur. Voyez Substitution des noms de fichiers. |
expand-line (non lié) |
Comme expand-history, mais développe les substitutions d’historique dans chaque mot du tampon d’entrée. |
expand-variables (^X-$) |
Développe la variable située à gauche du curseur. Voyez Substitution de variables. |
history-search-backward (M-p, M-P) |
Effectue une recherche en arrière dans la liste d’historique pour trouver une commande débutant par le contenu courant du tampon d’entrée jusqu’au curseur et la copier dans le tampon d’entrée. La chaîne de caractères de recherche peut être un motif générique (voyez Substitution des noms de fichiers) contenant « * », « ? », « [] » or « {} ». up-history et down-history procéderont à partir de l’emplacement approprié dans la liste d’historique. Mode Emacs uniquement. Voyez également history-search-forward et i-search-back. |
history-search-forward (M-n, M-N) |
Comme history-search-backward, mais la recherche se fait en avant. |
i-search-back (non lié) |
Effectue une recherche en arrière comme history-search-backward, copie la première correspondance dans le tampon d’entrée avec le curseur positionné à la fin du motif, et affiche l’invite « bck: » et la première correspondance. Des caractères supplémentaires peuvent être tapés pour étendre la recherche, i-search-back peut être tapé pour continuer la recherche avec le même motif, cyclant dans la liste d’historique si nécessaire (i-search-back doit être lié à un unique caractère pour que cela fonctionne) ou bien l’un des caractères spéciaux suivants peut être tapé : |
^W |
Concatène le reste du mot sous le curseur au motif de recherche. |
||
delete |
(ou n’importe quel caractère lié à backward-delete-char) Annule l’effet du dernier caractère tapé et efface un caractère du motif de recherche si cela est approprié. |
||
^G |
Si la recherche précédente a été couronnée de succès, abandonner la recherche. Sinon, revenir à la dernière recherche réussie. |
||
escape |
Termine la recherche, en laissant la ligne courante dans le tampon d’entrée. |
Tout autre caractère non lié à self-insert-command termine la recherche, en laissant la ligne courante dans le tampon d’entrée, et est ensuite interprété comme une entrée normale. En particulier, un retour chariot entraînera l’exécution de la ligne courante. Mode Emacs uniquement. Voyez également i-search-fwd et history-search-backward. |
i-search-fwd (non lié) |
Comme i-search-back, mais la recherche s’effectue en avant. |
insert-last-word (M-_) |
Insérer le dernier mot de la ligne d’entrée précédente (« !$ ») dans le tampon d’entrée. Voyez également copy-prev-word. |
list-choices (M-^D) |
Lister les possibilités de complètement comme décrit dans Complètement et listage. Voyez également delete-char-or-list-or-eof et list-choices-raw. |
list-choices-raw (^X-^D) |
Comme list-choices, mais ignore les complètements définis par l’utilisateur. |
list-glob (^X-g, ^X-G) |
Liste (via la commande intégrée ls−F) les correspondances du motif générique (voyez Substitution des noms de fichiers) situées à gauche du curseur. |
list-or-eof (non lié) |
Effectue un list-choices ou un end-of-file sur une ligne vide. Voyez également delete-char-or-list-or-eof. |
magic-space (non lié) |
Développe les substitutions d’historique sur la ligne courante, comme expand-history, et y concatène une espace. magic-space est conçu pour être lié à la barre d’espacement, mais il n’est pas lié par défaut. |
normalize-command (^X-?) |
Recherche le mot courant dans le PATH et, s’il est trouvé, le remplace par le chemin complet menant à l’exécutable. Les caractères spéciaux sont protégés. Les alias sont développés et protégés mais les commandes à l’intérieur des alias ne le sont pas. Cette commande est utile avec les commandes qui prennent des commandes en tant qu’arguments, comme p.ex. « dbx » et « sh −x ». |
normalize-path (^X-n, ^X-N) |
Développe le mot courant comme décrit dans le réglage « expand » de la variable shell symlinks. |
overwrite-mode (non lié) |
Passer du mode d’entrée au mode d’écrasement et inversement. |
run-fg-editor (M-^Z) |
Sauvegarde la ligne d’entrée courante et recherche un travail stoppé de nom identique au dernier composant de la partie nom de fichier des variables d’environnement EDITOR ou VISUAL ou, si aucune d’entre elles n’est définie, « ed » ou « vi ». Si un tel travail est trouvé, il est redémarré comme si « fg %job » avait été tapé. C’est utile pour passer facilement d’un éditeur au shell et inversement. Certaines personnes lient cette commande à « ^Z » afin de faire cela plus facilement. |
run-help (M-h, M-H) |
Recherche de la documentation sur la commande courante, en utilisant la même notion de « commande courante » que celle des routines de complètement, et l’affiche. Il n’est pas possible d’utiliser un paginateur ; run-help est conçu pour les fichiers d’aide courts. Si l’alias spécial helpcommand est défini, il est exécuté avec le nom de la commande pour unique argument. Sinon, la documentation doit se situer dans un fichier nommé commande.help, commande.1, commande.6, commande.8 ou commande, qui devrait se situer dans l’un des répertoires listés dans la variable d’environnement HPATH. S’il y a plus d’un fichier d’aide, seul le premier est affiché. |
self-insert-command (caractères texte) |
Dans le mode d’insertion (le mode par défaut), insère le caractère tapé dans la ligne d’entrée après le caractère situé sous le curseur. Dans le mode d’écrasement, remplace le caractère situé sous le curseur par le caractère tapé. Le mode d’entrée est normalement préservé entre les lignes, mais la variable shell inputmode peut être définie en « insert » (insertion) ou « overwrite » (écrasement) pour placer l’éditeur dans ce mode au début de chaque ligne. Voyez également overwrite-mode. |
sequence-lead-in (préfixe flèche, préfixe méta, ^X) |
Indique que les caractères suivants font partie d’une séquence de plusieurs touches. Lier une commande à une séquence de plusieurs touches crée en fait deux liaisons : le premier caractère à sequence-lead-in, et la séquence entière à la commande. Toutes les séquences débutant par un caractère lié à sequence-lead-in sont en fait liées à undefined-key à moins d’être liées à une autre commande. |
spell-line (M-$) |
Essaie de corriger l’orthographe de chaque mot du tampon d’entrée, comme spell-word, mais ignore les mots dont le premier caractère est « − », « ! », « ^ » ou encore « % », ou qui contient « \ », « * » ou « ? », pour éviter les problèmes avec les options, les substitutions et d’autres choses du même genre. Voyez Correction orthographique. |
spell-word (M-s, M-S) |
Essaie de corriger l’orthographe du mot courant comme décrit dans Correction orthographique. Vérifie tous les composants d’un mot qui semblent être des noms de chemins. |
toggle-literal-history (M-r, M-R) |
Développe ou « anti-développe » les substitutions d’historique dans le tampon d’entrée. Voyez également expand-history et la variable shell autoexpand. |
undefined-key (n’importe quelle touche non liée) |
Bippe. |
up-history (flèche-haut, ^P) |
Copie l’entrée précédente de la liste d’historique dans le tampon d’entrée. Si histlit est définie, utilise la forme littérale de l’entrée. Peut être répété pour parcourir la liste d’historique, en s’arrêtant au sommet. |
vi-search-back (?) |
Affiche l’invite « ? » et demande à l’utilisateur une chaîne de caractères de recherche (qui peut être un motif générique, comme pour history-search-backward), la recherche et la copie dans le tampon d’entrée. Le haut-parleur bippe si aucune correspondance n’est trouvée. L’appui sur Entrée termine la recherche et laisse la dernière correspondance dans le tampon d’entrée. L’appui sur Escape termine la recherche et exécute la correspondance. Mode vi uniquement. |
vi-search-fwd (/) |
Comme vi-search-back, mais recherche en avant. |
which-command (M-?) |
Effectue un which (voyez la description de la commande intégrée) sur le premier mot du tampon d’entrée. |
Structure lexicale |
Le shell découpe les lignes d’entrée en mots aux emplacements des blancs et des tabulations. Les caractères spéciaux « & », « | », « ; », « < », « > », « ( » et « ) » et les caractères dupliqués « && », « || », « << » et « >> » constituent toujours des mots séparés, qu’ils soient ou non entourés de caractères d’espacement. Quand l’entrée du shell n’est pas un terminal, le caractère « # » est utilisé pour débuter un commentaire. Chaque « # » et le reste de la ligne d’entrée sur laquelle il apparaît est éliminé avant tout examen ultérieur. On peut éviter la signification spéciale d’un caractère spécial (y compris un blanc ou une tabulation) pouvant faire partie d’un autre mot, en le faisant précéder par un backslash (« \ »), ou en l’enfermant dans des apostrophes (« ’ »), des guillemets (« " ») ou des apostrophes inversées (« ‘ »). Quand il n’est pas protégé, un saut de ligne précédé par un « \ » est équivalent à un blanc mais, à l’intérieur de caractères de protection, cette séquence produit un saut de ligne. De plus, toutes les Substitutions (voir en dessous) à l’exception de la Substitution d’historique peuvent être évitées en enfermant les chaînes de caractères (ou des parties de chaînes) dans lesquelles elles apparaissent à l’intérieur d’apostrophes ou en protégeant le(s) caractère(s) crucial(aux) (c.-à -d. « $ » ou « ‘ » pour la Substitution de variables ou la Substitution de commandes respectivement) avec « \ ». (La Substitution d’alias ne fait pas exception : protéger de quelque manière que ce soit un caractère quelconque d’un mot pour lequel un alias a été défini empêche la substitution de l’alias. La manière habituelle de protéger un alias est de le faire précéder par un backslash.) La Substitution d’historique est évitée par l’utilisation de backslashs, mais pas par celle de caractères de protection. Les chaînes de caractères protégées par des guillemets ou des apostrophes inversées (‘) subissent la Substitution de variables et la Substitution de commandes, mais pas les autres substitutions. Le texte présent entre apostrophes ou guillemets devient un mot unique (ou en fait partie). Les métacaractères présents dans ces chaînes, y compris les blancs et les tabulations, ne forment pas des mots séparés. Une chaîne de caractères protégée par des guillemets ne peut que dans un seul cas (voir Substitution de commandes ci-dessous) produire des parties de plus d’un mot ; les chaînes de caractères protégée par des apostrophes ne le font jamais. Les apostrophes inversées sont spéciales : elles signalent la Substitution de commandes, qui peut résulter en plus d’un mot. La protection de chaînes de caractères complexes, en particulier celles qui contiennent elles-mêmes des caractères de protection, peut engendrer une certaine confusion. Souvenez-vous que les caractères de protection ne doivent pas être utilisés comme ils le sont dans l’écriture humaine ! Il peut être plus facile de ne pas protéger une chaîne de caractères entière, mais uniquement les parties de la chaîne qui en ont besoin, en utilisant différents types de protections si nécessaire. La variable shell backslash_quote peut être utilisée pour que les backslashs protègent toujours « \ », « ’ », et « " ». (+) Cela peut simplifier les tâches de protections complexes, mais peut engendrer des erreurs de syntaxe dans les scripts csh(1). |
Substitutions |
Nous décrivons maintenant les diverses transformations que le shell effectue sur l’entrée dans l’ordre dans lequel elles se produisent. Nous notons au passage les structures de données impliquées, et les commandes et variables qui les affectent. Souvenez-vous que les substitutions peuvent être évitées en protégeant comme décrit dans Structure lexicale. |
Substitution d’historique |
Chaque commande, ou « événement », entrée à partir du terminal, est sauvegardée dans la liste d’historique. La commande précédente est toujours sauvegardée, et la variable shell history peut être réglée pour indiquer le nombre de commandes à sauvegarder. La variable shell histdup peut être définie pour faire en sorte de ne pas sauvegarder d’événements dupliqués ou d’événements dupliqués consécutifs. Les commandes sauvegardées sont numérotées séquentiellement à partir de 1 et sont estampillées avec l’heure courante. Il n’est habituellement pas nécessaire d’utiliser les numéros d’événements, mais le numéro d’événement courant peut faire partie de l’invite en plaçant un « ! » dans la variable shell prompt. Le shell sauvegarde en fait l’historique dans les formes développées et littérales (non développées). Si la variable shell histlit est définie, les commandes qui affichent et stockent l’historique utilisent la forme littérale. La commande intégrée history peut afficher, sauvegarder dans un fichier, restaurer et effacer la liste d’historique à n’importe quel moment, et les variables shell savehist et histfile peuvent être définies pour que la liste d’historique soit automatiquement sauvegardée à la déconnexion, et restaurée à la connexion. Les substitutions d’historique introduisent des mots de la liste d’historique dans le flux d’entrée, facilitant ainsi la répétition de commandes, la répétition d’arguments d’une commande précédente dans la commande courante, ou encore la correction orthographique d’erreurs dans la commande précédente avec un nombre limité de frappes et un grand degré de sécurité. Les substitutions d’historique commencent par le caractère « ! ». Elles peuvent commencer n’importe où dans le flux d’entrée, mais ne peuvent être imbriquées. Le « ! » peut être précédé d’un « \ » pour éviter sa signification spéciale ; par commodité, un « ! » est laissé inchangé quand il est suivi d’un blanc, d’une tabulation, d’un saut de ligne, d’un « = » ou d’un « ( ». Les substitutions d’historique se produisent également quand une ligne d’entrée débute par « ^ ». Cette abréviation spéciale sera décrite plus loin. Les caractères utilisés pour signaler la substitution d’historique (« ! » et « ^ ») peuvent être modifiés en définissant la variable shell histchars. Toute ligne d’entrée contenant une substitution d’historique est affichée avant d’être exécutée. Une substitution d’historique peut comprendre une « spécification d’événement », qui indique l’événement à partir duquel les mots doivent être pris, un « désigneur de mot », qui sélectionne des mots particuliers de l’événement choisi, et/ou un « modificateur », qui manipule les mots sélectionnés. Une spécification d’événement peut être |
n |
Un nombre se référant à un événement particulier. |
||
−n |
Un décalage se référant au n-ième événement précédant l’événement courant |
||
# |
L’événement courant. Cela devrait être utilisé avec précaution dans csh(1), car il n’y a pas de vérification de récursion. tcsh admet 10 niveaux de récursion. (+) |
||
! |
L’événement précédent (équivalent à « −1 ») |
||
s |
L’événement le plus récent dont le premier mot débute par la chaîne de caractères s |
||
?s? |
L’événement le plus récent contenant la chaîne s. Le second « ? » peut être omis s’il est immédiatement suivi d’un saut de ligne. |
Par exemple, considérez ce morceau d’historique : |
9 8:30 nroff −man wumpus.man |
10 8:31 cp wumpus.man wumpus.man.old |
Les commandes sont affichées avec leurs numéro d’événement et horodate. L’événement courant, que nous n’avons pas encore tapé, est l’événement numéro 13. « !11 » et « !−2 » se réfèrent à l’événement 11. « !! » se réfère à l’événement précédent, c.-à -d. 12. « !! » peut être abrégé en « ! » s’il est suivi d’un « : » (« : » est décrit plus bas). « !n » se réfère à l’événement 9, qui commence par « n ». « !?old? » se réfère également à l’événement 12, qui contient « old ». Sans les désigneurs ou les modificateurs de mots, les références d’historique se développent simplement en l’événement entier, de sorte que l’on peut taper « !cp » pour ré-exécuter la commande de copie, ou « !!|more » si la sortie de « diff » déborde de l’écran. Les références d’historique peuvent être isolées à partir du texte environnant par des accolades si nécessaire. Par exemple, « !vdoc » rechercherait une commande débutant par « vdoc » et, dans cet exemple, n’en trouverait pas, mais « !{v}doc » se développerait de façon non ambiguë en « vi wumpus.mandoc ». Les substitutions d’historique ne s’imbriquent pas, même à l’intérieur d’accolades. (+) Alors que csh(1) développe, par exemple, « !3d » en l’événement 3 avec la lettre « d » ajoutée à la fin, tcsh le développe en le dernier événement débutant par « 3d » ; seuls les arguments entièrement numériques sont traités comme des numéros d’événements. Cela permet de rappeler des événements commençant par des nombres. Pour développer « !3d » comme dans csh(1), tapez « !\3d ». Pour sélectionner des mots à partir d’un événement, nous pouvons faire suivre la spécification d’événement par un « : » et un désigneur pour les mots désirés. Les mots d’une ligne d’entrée sont numérotés à partir de 0, le premier mot (habituellement une commande) étant 0, le deuxième mot (le premier argument) étant 1, etc. Les désigneurs de mots de base sont : |
0 |
Le premier mot (la commande) |
||
n |
Le n-ième argument |
||
^ |
Le premier argument, équivalent à « 1 » |
||
$ |
Le dernier argument |
||
% |
Le mot correspondant à une recherche ?s? |
||
x−y |
Un intervalle de mots |
||
−y |
Ãquivalent à « 0−y » |
||
* |
Ãquivalent à « ^−$ », mais ne renvoie rien si l’événement ne contient qu’un seul mot |
||
x* |
Ãquivalent à « x−$ » |
||
x− |
Ãquivalent à « x* », mais omet le dernier mot (« $ ») |
Les mots sélectionnés sont insérés dans la ligne de commandes et sont séparés par des simples blancs. Par exemple, la commande « diff » de l’exemple précédent pourrait avoir été tapée comme ceci : « diff !!:1.old !!:1 » (en utilisant « :1 » pour sélectionner le premier argument de l’événement précédent), ou encore « diff !−2:2 !−2:1 » pour sélectionner et intervertir les arguments de la commande « cp ». Si nous ne nous préoccupons pas de l’ordre du « diff », nous pouvons faire « diff !−2:1−2 », ou simplement « diff !−2:* ». La commande « cp » pourrait avoir été tapée comme « cp wumpus.man !#:1.old », en utilisant « # » pour se référer à l’événement courant. « !n:− hurkle.man » réutiliserait les deux premiers mots de la commande « nroff » pour dire « nroff −man hurkle.man ». Le « : » séparant la spécification d’événement du désigneur de mot peut être omis si le sélecteur d’événement commence par « ^ », « $ », « * », « % » ou « − ». Par exemple, notre commande « diff » aurait pu être « diff !!^.old !!^ » ou, de façon équivalente, « diff !!$.old !!$ ». Néanmoins, si « !! » est abrégé en « ! », un sélecteur d’argument débutant par « − » sera interprété comme une spécification d’événement. Une référence d’historique peut posséder un désigneur de mot, mais pas de spécification d’événement. Elle référence ensuite la commande précédente. Pour continuer avec notre exemple « diff », nous pourrions pu faire simplement « diff !^.old !^ » ou « diff !* » pour avoir les arguments dans l’ordre inverse. Le ou les mots d’une référence d’historique peuvent être édités, ou « modifiés », en les faisant suivre par un ou plusieurs modificateurs, chacun d’entre eux étant précédé par un « : »: |
h |
Supprimer un composant de nom de chemin de queue, en conservant la tête. |
||
t |
Supprimer tous les composants de tête du nom de chemin, en conservant la queue. |
||
r |
Supprimer l’extension du nom de fichier « .xxx », en conservant le nom racine. |
||
e |
Supprimer tout sauf l’extension. |
||
u |
Mettre en majuscule la première lettre minuscule. |
||
l |
Mettre en minuscule la première lettre majuscule. |
||
s/l/r/ |
Substituer r à l. l est simplement une chaîne de caractères comme r, et pas une expression rationnelle du type de celles de la commande éponyme ed(1). N’importe quel caractère peut être utilisé comme délimiteur au lieu de « / » ; un « \ » peut être utilisé pour protéger le délimiteur à l’intérieur de l et r. Un caractère « & » dans r est remplacé par l ; « \ » protège également « & ». Si l est vide (""), le l d’une substitution précédente ou le s d’une spécification d’événement précédente « ?s? » sera utilisé. Le délimiteur de queue peut être omis s’il est immédiatement suivi d’un saut de ligne. |
||
& |
Répéter la substitution précédente. |
||
g |
Appliquer le modificateur suivant une fois sur chaque mot. |
||
a (+) |
Appliquer le modificateur suivant autant de fois que possible sur un simple mot. « a » et « g » peuvent être utilisés simultanément pour appliquer un modificateur de façon globale. Dans l’implémentation actuelle, l’utilisation simultanée des modificateurs « a » et « s » peut mener à une boucle infinie. Par exemple, « :as/f/ff/ » ne se terminera jamais. Ce comportement pourrait changer dans le futur. |
||
p |
Afficher la nouvelle ligne de commandes mais ne pas l’exécuter. |
||
q |
Protéger les mots substitués, en empêchant ainsi de nouvelles substitutions. |
||
x |
Comme q, mais couper en mots aux emplacement des blancs, tabulations et sauts de ligne. |
Les modificateurs ne sont appliqués qu’au premier mot modifiable (à moins que « g » ne soit utilisé). Le fait qu’aucun mot ne soit modifiable constitue une erreur. Par exemple, la commande « diff » pourrait avoir été écrite comme « diff wumpus.man.old !#^:r », en utilisant « :r » pour supprimer « .old » du premier argument situé sur la même ligne (« !#^ »). Nous pourrions faire « echo hello out there », ensuite « echo !*:u » pour mettre « hello » en majuscule, « echo !*:au » pour le dire bruyamment, ou « echo !*:agu » pour réellement crier. Nous pourrions faire suivre « mail −s "J’ai oublié mon mot de passe" rot » par « !:s/rot/root » pour corriger l’orthographe de « root » (voyez Correction orthographique pour une approche différente). Il y a une abréviation spéciale pour les substitutions. Quand « ^ » est le premier caractère d’une ligne d’entrée, il est équivalent à « !:s^ ». Donc, on aurait pu dire « ^rot^root » pour effectuer une correction orthographique sur l’exemple précédent. C’est la seule substitution d’historique qui ne commence pas explicitement par « ! ». (+) Dans csh, un seul modificateur peut être appliqué à chaque développement d’historique ou de variable. Dans tcsh, on peut en utiliser plusieurs, comme par exemple |
% mv wumpus.man /usr/man/man1/wumpus.1 |
% man !$:t:r |
Dans csh, le résultat sera « wumpus.1:r ». Une substitution suivie d’un « : » pourrait devoir en être isolée avec des accolades : |
> mv a.out /usr/games/wumpus |
> setenv PATH !$:h:$PATH |
La première tentative fonctionnera avec csh mais échouera avec tcsh, car tcsh s’attend à un modificateur différent de « $ » après le deuxième « : ». Finalement, l’historique peut être accédé via l’éditeur ainsi qu’avec les substitutions que l’on vient de décrire. Les commandes d’éditeur up- et down-history, history-search-backward et -forward, i-search-back et -fwd, vi-search-back et -fwd, copy-prev-word et insert-last-word recherchent des événements dans la liste d’historique et les copient dans le tampon d’entrée. La commande d’éditeur toggle-literal-history bascule entre les formes développées et littérales des lignes d’historique dans le tampon d’entrée. expand-history et expand-line développent les substitutions d’historique dans le mot courant et dans le tampon d’entrée entier respectivement. |
Substitution d’alias |
Le shell maintient une liste d’alias qui peuvent être définis, in-définis et affichés par les commandes alias et unalias. Après qu’une ligne de commandes ait été découpée en commandes uniques (voyez Commandes), le premier mot de chaque commande est examiné de gauche à droite pour voir s’il comprend un alias. Si c’est le cas, le premier mot est remplacé par l’alias. Si l’alias contient une référence d’historique, il subit la Substitution d’historique comme si la commande originale était la ligne d’entrée précédente. Si l’alias ne contient pas de référence d’historique, la liste des arguments n’est pas modifiée. Par conséquent, si l’alias pour « ls » est « ls -l », la commande « ls /usr » devient « ls −l /usr », la liste des arguments n’étant pas modifiée. Si l’alias pour « lookup » est « grep !^ /etc/passwd », alors « lookup bill » devient « grep bill /etc/passwd ». Les alias peuvent être utilisés pour introduire une métasyntaxe d’analyseur syntaxique. Par exemple, « alias print ’pr \!* | lpr » définit une « commande » (« print ») qui envoie ses arguments à l’imprimante via pr(1). La substitution d’alias est répétée jusqu’à ce que le premier mot de la commande ne possède plus d’alias. Si une substitution d’alias ne modifie pas le premier mot (comme dans l’exemple précédent), elle est marquée pour éviter un bouclage. Les autres boucles sont détectées et causent une erreur. Certains alias sont référencés par le shell ; voyez Alias spéciaux. |
Substitution de variables |
Le shell maintient une liste de variables, chacune d’entre elles ayant pour valeur une liste de mots (éventuellement vide). La valeur des variables shell peut être affichée et modifiée en utilisant les commandes set et unset. Le système maintient sa propre liste de variables d’« environnement ». Celles-ci peuvent être affichées et modifiées en utilisant printenv, setenv et unsetenv. (+) Les variables peuvent être rendues accessibles en lecture uniquement en utilisant « set −r ». Les variables accessibles en lecture seule ne peuvent être ni modifiées, ni in-définies ; si on essaie de le faire, cela causera une erreur. Une fois accessible en lecture seule, une variable ne peut plus être rendue accessible en écriture, et « set −r » ne devrait donc être utilisé qu’avec prudence. Les variables d’environnement ne peuvent pas être rendues accessibles en lecture seule. Certaines variables sont définies par le shell ou sont référencées par lui. Par exemple, la variable argv est une image de la liste des arguments du shell, et les mots de cette valeur de variable sont référencés d’une façon spéciale. Certaines des variables référencées par le shell sont des interrupteurs ; le shell ne se soucie pas de leur valeur, mais uniquement du fait de savoir s’ils sont sélectionnés ou non. Par exemple, la variable verbose est un interrupteur qui renvoie les commandes d’entrée en écho. L’option de ligne de commandes −v définit cette variable. Variables shell spéciales liste toutes les variables qui sont référencées par le shell. Les autres opérations traitent les variables de façon numérique. La commande « @ » permet d’effectuer des calculs numériques, et d’affecter leur résultat à une variable. Les valeurs de variables sont néanmoins toujours représentées par zéro ou plusieurs chaînes de caractères. Lors des opérations numériques, la chaîne de caractères vide est considérée valoir zéro, et les n−ièmes mots (n>=2) des valeurs à plusieurs mots sont ignorés. Après que la ligne d’entrée ait subi la substitution des alias et ait été analysée, et avant que chaque commande ne soit exécutée, la substitution des variables est effectuée en entrant des caractères « $ ». Ce développement peut être évité en faisant précéder le « $ » par un « \ », sauf dans des « " » où elle se produit toujours, et dans des « ’ » où elle ne se produit jamais. Les chaînes de caractères protégées par des « ‘ » sont interprétées ultérieurement (voyez Substitution de commandes plus bas) de sorte que la substitution de « $ » ne s’y produit pas encore, si jamais elle se produit. Un « $ » est passé sans être modifié s’il est suivi par un blanc, une tabulation, ou un fin-de-ligne (eol). Les redirections d’entrée/sortie sont reconnues avant le développement des variables, et subissent le développement des variables séparément. Autrement, le nom de la commande et la liste d’arguments entière sont développés ensemble. Il est ainsi possible que le premier mot (la commande) (à cet instant) génère plus d’un mot, le premier d’entre eux devenant le nom de la commande, et les autres devenant des arguments. à moins d’être encadré dans des « " », ou d’avoir fourni le modificateur « :q », les résultats d’une substitution de variables peuvent éventuellement subir la substitution de commandes et de noms de fichier. à l’intérieur de « " », une variable dont la valeur est constituée de plusieurs mots se développe en un (une partie d’un) mot unique, les mots faisant partie de la valeur de la variable étant séparés par des blancs. Quand le modificateur « :q » est appliqué à une substitution, la variable sera développée en plusieurs mots séparés par des blancs et protégés pour éviter des substitutions ultérieures de commandes ou de noms de fichiers. Les méta-séquences suivantes sont fournies pour introduire des valeurs de variables dans l’entrée du shell. à moins que cela ne soit précisé, référencer une variable non définie constitue une erreur. $nom |
${nom} |
Substitue les mots de la valeur de la variable nom, ceux-ci étant séparés par un blanc. Des accolades isolent nom des caractères suivants qui en feraient autrement partie. Le nom des variables shell peut contenir jusqu’à 20 lettres ou chiffres, et doit débuter par une lettre. Le caractère de soulignement (« _ ») est considéré être une lettre. Si nom n’est pas une variable shell, mais est défini dans l’environnement, alors cette valeur est renvoyée (mais les modificateurs « : » et les autres formes fournies en dessous ne sont pas disponibles dans ce cas). |
$nom[sélecteur] |
${nom[sélecteur]} |
Ne substitue que les mots sélectionnés à partir de la valeur de nom. Le sélecteur subit la substitution du « $ » et peut être composé d’un ou de deux nombres séparés par un « − ». Le premier mot d’une valeur de variable est numéroté « 1 ». Si le premier nombre d’un intervalle est omis, sa valeur par défaut est « 1 ». Si le dernier membre d’un intervalle est omis, sa valeur par défaut est « $#nom ». Le sélecteur « * » sélectionne tous les mots. La vacuité d’un intervalle ne constitue pas une erreur si le second argument est omis ou fait partie de l’intervalle. |
$0 |
Substitue le nom du fichier à partir duquel l’entrée de commande est lue. Une erreur se produit si le nom n’est pas connu. |
$nombre |
${nombre} |
Ãquivalent à « $argv[nombre] ». |
$* |
Ãquivalent à « $argv », qui est équivalent à « $argv[*] ». |
Les modificateurs « : » décrits dans Substitution d’historique, sauf « :p », peuvent être appliqués aux substitutions ci−dessus. Plusieurs d’entre eux peuvent être utilisés. (+) Des accolades peuvent être nécessaires pour isoler une substitution de variables à partir d’un deux−points littéral, comme dans la Substitution d’historique ; tout modificateur doit apparaître à l’intérieur des accolades) Les substitutions suivantes ne peuvent être modifiées par les modificateurs « : » : $?nom |
${?nom} |
Remplacé par la chaîne de caractère « 1 » si nom est défini, ou « 0 » sinon. |
||
$?0 |
Remplacé par « 1 » si le nom du fichier d’entrée courant est connu, ou « 0 » sinon. Vaut toujours « 0 » dans les shells interactifs. |
$#nom |
${#nom} |
Remplacé par le nombre de mots de nom. |
|||
$# |
Ãquivalent à « $#argv ». (+) |
$%nom |
${%nom} |
Remplacé par le nombre de caractères de nom. (+) |
$%nombre |
${%nombre} |
Remplacé par le nombre de caractères de $argv[nombre]. (+) |
$? |
Ãquivalent à « $status ». (+) |
||
$$ |
Remplacé par le numéro de processus (décimal) du shell (parent). |
||
$! |
Remplacé par le numéro (décimal) du processus du dernier processus tournant en tâche de fond lancé par ce shell. (+) |
||
$_ |
Remplacé par la ligne de commandes de la dernière commande exécutée. (+) |
||
$< |
Remplacé par une ligne de l’entrée standard, sans interprétation ultérieure. Cela peut être utilisé pour lire à partir du clavier dans un script shell. (+) Alors que csh protège toujours $< comme s’il était équivalent à « $<:q », tcsh ne le fait pas. De plus, quand tcsh attend que l’utilisateur tape une ligne, celui-ci peut taper un caractère d’interruption pour interrompre la séquence dans laquelle la ligne doit être substituée, mais csh ne permet pas cela. |
La commande d’éditeur expand-variables, normalement liée à « ^X-$ », peut être utilisée pour développer interactivement des variables individuelles. |
Substitution de commandes, de noms de fichiers et de pile de répertoires |
Les substitutions restantes sont appliquées sélectivement aux arguments des commandes intégrées. Cela signifie que les parties des expressions qui ne sont pas évaluées ne sont pas sujettes à ces développements. Pour les commandes qui ne font pas partie du shell, le nom de la commande est substitué séparément de la liste d’arguments. Cela se produit très tard, après que les redirections d’entrée-sortie aient été effectuées, et dans un fils du shell principal. |
Substitution de commandes |
La substitution de commandes est indiquée par une commande entourée de « ‘ ». La sortie d’une telle commande est découpée en mots séparés aux emplacements des blancs, tabulations et sauts de ligne, et les mots vides sont éliminés. La sortie subit la substitution des variables et des commandes et remplace la chaîne de caractères originale. La substitution de commandes à l’intérieur de guillemets (« " ») retient les blancs et les tabulations ; seuls les sauts de lignes entraînent de nouveaux mots. Le saut de ligne final n’entraîne jamais de nouveau mot. Il est ainsi possible qu’une substitution de commande ne produise qu’une partie d’un mot, même si la commande produit une ligne complète en sortie. |
Substitution des noms de fichiers |
Si un mot contient l’un des caractères « * », « ? », « [ » ou « { », ou commence par le caractère « ~ », alors il est candidat à la substitution des noms de fichier, également connue sous le nom de de « développement » (globbing). Ce mot est ensuite considéré être un motif (dit « générique »), et est remplacé par une liste triée alphabétiquement de noms de fichiers correspondant au motif. Dans les noms de fichiers correspondant, le caractère « . » présent au début d’un nom de fichier ou suivant immédiatement un « / » doit être reconnu explicitement. Le caractère « * » convient pour n’importe quelle chaîne de caractères, y compris la chaîne vide. Le caractère « ? » correspond à n’importe quel caractère. La séquence « [...] » reconnaît n’importe quel caractère enfermé dans les crochets. à l’intérieur de « [...] », une paire de caractères séparés par un « − » correspond à n’importe quel caractère présent lexicalement entre les deux. (+) Certains motifs génériques peuvent être niés : la séquence « [^...] » correspond à n’importe quel caractère non spécifié par les caractères et/ou intervalles de caractères présents entre les crochets. Un motif générique entier peut également être nié avec « ^ » : |
> echo * |
bang crash crunch ouch |
Les motifs génériques qui n’utilisent pas « ? », « * » ou « [] », ou qui utilisent « {} » ou « ~ » (voir ci−dessous) ne sont pas niés correctement. La méta-notation « a{b,c,d}e » est un raccourci pour « abe ace ade ». L’ordre de gauche à droite est préservé : « /usr/source/s1/{oldls,ls}.c » se développe en « /usr/source/s1/oldls.c /usr/source/s1/ls.c ». Les résultats des correspondances sont triés séparément à un bas niveau pour préserver cet ordre : « ../{memo,*box} » pourrait se développer en « ../memo ../box ../mbox ». (Notez que « memo » n’a pas été trié avec les résultats des « *box » correspondant) Cette construction peut se développer en des fichiers qui n’existent pas, mais une erreur peut se produire au niveau d’une commande à laquelle on a passé la liste développée. Ces constructions peuvent être imbriquées. Exception : les mots « { », « } » et « {} » sont passés sans subir la moindre modification. Le caractère « ~ » présent au début d’un nom de fichier référence les répertoires personnels. Présent seul, c.-à -d. « ~ », il est remplacé par le répertoire personnel de l’appelant comme reflété par la variable shell home. Quand il est suivi par un nom constitué de lettres, de chiffres, et de caractères « − », le shell recherche un utilisateur portant ce nom et substitue son répertoire personnel ; ainsi, « ~ken » pourrait être développé en « /usr/ken » et « ~ken/chmach » en « /usr/ken/chmach ». Si le caractère « ~ » est suivi par un caractère autre qu’une lettre ou « / », ou qu’il apparaît ailleurs qu’au début d’un mot, il n’est pas modifié. Une commande comme « setenv MANPATH /usr/man:/usr/local/man:~/lib/man » n’effectue donc pas la substitution de répertoires, comme on est en droit de l’espérer. Un motif générique contenant « * », « ? », « [ » ou « ~ », avec ou sans « ^ », ne peut pas ne correspondre à aucun fichier. Néanmoins, un seul motif d’une liste de motifs génériques doit correspondre à un fichier (de sorte que, p.ex., « rm *.a *.c *.o » n’échouera que s’il n’y a aucun fichier dans le répertoire courant se terminant en « .a », « .c », ou « .o ») et, si la variable shell nonomatch est définie, un motif (ou une liste de motifs) qui ne reconnaît rien n’est pas modifié(e) plutôt que de causer une erreur. La variable shell noglob peut être définie pour empêcher la substitution des noms de fichiers, et la commande d’éditeur expand-glob, liée normalement à « ^X-* », peut être utilisée pour développer interactivement des substitutions de noms de fichiers individuels. |
Substitution de pile de répertoires (+) |
La pile des répertoires est une liste de répertoires, numérotés à partir de zéro, qui est utilisée par les commandes intégrées pushd, popd et dirs. dirs peut afficher, sauvegarder dans un fichier, restaurer et effacer la pile de répertoires à tout moment, et les variables shell savedirs et dirsfile peuvent être définies pour sauvegarder automatiquement la pile de répertoires à la déconnexion et la restaurer à la connexion. La variable shell dirstack peut être examinée pour visualiser la pile de répertoires, et définie pour placer des répertoires arbitraires dans la pile de répertoires. Le caractère « = » suivi d’un ou de plusieurs chiffres se développe en une entrée dans la pile de répertoires. Le cas spécial « =− » se développe vers le dernier répertoire de la pile. Par exemple, |
> dirs −v |
0 /usr/bin |
Les variables shell noglob et nonomatch et la commande d’éditeur expand-glob s’appliquent à la pile de répertoires autant qu’aux substitutions de noms de fichiers. |
Autres substitutions (+) |
Il existe beaucoup d’autres transformations impliquant des noms de fichiers, et qui ne sont pas strictement apparentées à celles présentées ci-dessus, mais qui sont mentionnées ici dans un but de complétude. Tout nom de fichier peut être développé en un chemin complet quand la variable symlinks vaut « expand ». La protection empêche cette expansion, et la commande d’éditeur normalize-path le fait à la demande. La commande d’éditeur normalize-command développe les commandes présentes dans le PATH en des chemins complets à la demande. Finalement, cd et pushd interprètent « − » comme l’ancien répertoire de travail (équivalent à la variable shell owd). Cela ne constitue pas du tout une substitution, mais une abréviation qui n’est reconnue que par ces commandes. Néanmoins, cela peut également être empêché en utilisant les protections. |
Commandes |
Les trois sections suivantes décrivent la façon dont le shell exécute des commandes et traite ses entrées et sorties. |
Commandes simples, tubes et séquences |
Une commande simple est une séquence de mots, le premier d’entre eux spécifiant la commande à exécuter. Une série de commandes simples reliées par des caractères « | » forme un tube. La sortie de chaque commande d’un tube est connectée à l’entrée de la commande suivante. Les commandes simples et les tubes peuvent être réunis dans des séquences avec « ; », et seront exécutées séquentiellement. Les commandes simples et les tubes peuvent être également être réunis dans des séquences avec « || » ou « && », indiquant, comme dans le langage C, que la seconde commande ne doit être exécutée que si la première échoue ou réussit respectivement. Une commande simple, un tube ou une séquence peut être placé(e) entre parenthèses, « () », pour former une commande simple, qui peut à son tour être un composant d’un tube ou d’une séquence. Une commande, un tube ou une séquence peut être exécuté(e) sans attendre qu’il (elle) se termine en le (la) faisant suivre par un « & ». |
Exécution de commandes intégrées ou pas |
Les commandes intégrées sont exécutées à l’intérieur même du shell. Si tous les composants d’un tube (sauf le dernier) sont des commandes intégrées, le tube sera exécuté dans un sous-shell. Les commandes parenthésées sont toujours exécutées dans un sous-shell. |
(cd; pwd); pwd |
affiche par conséquent le répertoire home (répertoire personnel), en vous laissant là où vous étiez (en affichant ceci après le répertoire personnel), alors que |
cd; pwd |
vous laisse dans le répertoire home. Les commandes parenthésées sont le plus souvent utilisées pour éviter que cd n’affecte le shell courant. Quand une commande à exécuter ne se trouve pas être une commande intégrée, le shell essaie d’exécuter la commande en utilisant execve(2). Chaque mot de la variable path nomme un répertoire dans lequel le shell recherchera la commande. S’il ne reçoit ni l’option -c, ni l’option -t, le shell hache les noms de ces répertoires dans une table interne de sorte qu’il n’essaiera un execve(2) dans un répertoire que s’il y a une possibilité que la commande y réside. Cela accélère considérablement la localisation des commandes quand un grand nombre de répertoires sont présents dans le chemin de recherche. Si ce mécanisme a été désactivé (via unhash), si on a fourni l’argument -c ou −t au shell, ou dans tous les cas pour chaque répertoire faisant partie de path qui ne commence pas par un « / », le shell concatène le répertoire de travail courant au nom de commande fourni pour former le nom de chemin d’un fichier qu’il essaie ensuite d’exécuter. Si le fichier possède des permissions d’exécution mais n’est pas exécutable dans le système (p.ex. s’il n’est ni un binaire exécutable, ni un script qui spécifie son interpréteur), alors il est supposé être un fichier contenant des commandes shell et un nouveau shell est engendré pour le lire. L’alias spécial shell peut être défini pour spécifier un interpréteur différent du shell lui-même. Sur les systèmes qui ne comprennent pas la convention d’interpréteur de script « #! », le shell peut être compilé pour l’émuler ; voyez la variable shell version. Si c’est le cas, le shell examine la première ligne du fichier pour voir si elle est de la forme « #!interpréteur arg ... ». Si c’est le cas, le shell lancera l’interpréteur avec les arguments fournis, et lui fournira le fichier sur la sortie standard. |
Entrée/Sortie |
L’entrée et la sortie standard d’une commande peuvent être redirigées en utilisant la syntaxe suivante : |
< nom |
Ouvrir le fichier nom (qui subit d’abord le développement des variables, des commandes et des noms de fichiers) pour l’utiliser comme entrée standard. |
||
<< mot |
Lire l’entrée shell jusqu’à une ligne identique à mot. mot ne subit pas les substitutions de variables, de commandes et de noms de fichiers, et chaque ligne d’entrée est comparée à mot avant qu’une quelconque substitution ne soit effectuée sur cette ligne d’entrée, à moins qu’un « \ », « " », « ’ » ou « ‘ » de protection apparaisse dans la variable mot et que la substitution de commandes soit effectuée sur les lignes interposées, permettant à « \ » de protéger « $ », « \ » et « ‘ ». Les commandes qui sont substituées voient tous leurs blancs, tabulations et sauts de lignes préservés, à l’exception du saut de ligne final qui est perdu. Le texte résultant est placé dans un fichier temporaire anonyme qui est fourni à la commande en tant qu’entrée standard. |
> nom |
>&! nom |
Le fichier nom est utilisé comme sortie standard. Si le fichier n’existe pas, il est créé. Si le fichier existe, il est tronqué, son contenu précédent étant perdu. |
Si la variable shell noclobber est définie, alors le fichier ne peut pas exister ou doit être un fichier spécial (p.ex. un terminal ou « /dev/null »), ou sinon une erreur surviendra. Cela aide à prévenir des destructions accidentelles de fichiers. Dans ce cas, les formes « ! » peuvent être utilisées pour supprimer cette vérification. Les formes invoquant « & » dirigent la sortie de diagnostic (d’erreur) dans le fichier spécifié en plus de la sortie standard. nom est développé de la même façon que les noms de fichiers d’entrée « < » le sont. |
>> nom |
>>&! nom |
Comme « > », mais concatène la sortie à la fin de nom. Si la variable shell noclobber est définie, alors le fichier doit exister, à moins que l’une des formes « ! » ne soit fournie. |
Une commande reçoit l’environnement dans lequel le shell a été invoqué, comme modifié par les paramètres d’entrée-sortie et par la présence de la commande dans un tube. Par conséquent, à la différence de certains shells antérieurs, les commandes lancées à partir d’un fichier de commandes shell n’ont pas accès par défaut au texte des commandes ; elles reçoivent plutôt l’entrée standard originelle du shell. Le mécanisme « << » devrait être utilisé pour présenter des données en ligne. Cela permet aux scripts de commandes shell de fonctionner comme des composants de tube, et au shell de lire son entrée par blocs. Notez que l’entrée standard par défaut d’une commande détachée n’est pas le fichier vide /dev/null, mais l’entrée standard originelle du shell. Si c’est un terminal et que le processus essaie de lire à partir du terminal, alors le processus bloquera et l’utilisateur sera averti (voir Travaux). La sortie de diagnostic peut être dirigée dans un tube avec la sortie standard. Utilisez simplement la forme « |& » plutôt que seulement « | ». Le shell ne peut actuellement rediriger la sortie de diagnostic sans rediriger également la sortie standard, mais « (commande > fichier-sortie) >& fichier-erreur » est souvent un détour acceptable. Soit fichier-sortie, soit fichier-erreur peut être « /dev/tty » pour envoyer la sortie sur le terminal. |
Fonctionnalités |
Ayant décrit la façon dont le shell accepte, analyse et exécute des lignes de commandes, nous allons maintenant traiter quelques unes de ses fonctionnalités utiles. |
Flux de contrôle |
Le shell contient quelques commandes qui peuvent être utilisées pour réguler le flux de contrôle dans les fichiers de commandes (scripts shell) et (dans des formes limitées mais néanmoins utiles) dans l’entrée provenant d’un terminal. Ces commandes opèrent toutes en forçant le shell à relire ou à passer son entrée et, à cause de l’implémentation, restreignent l’emplacement de certaines de ces commandes. Les instructions foreach, switch et while, comme la forme if-then-else de l’instruction if, requièrent que les mots-clés principaux apparaissent dans une commande unique d’une ligne d’entrée comme montré plus bas. Si on ne peut pas parcourir l’entrée du shell, le shell place l’entrée dans une mémoire tampon à chaque fois qu’il remarque une boucle, et effectue des recherches dans ce tampon interne pour effectuer la relecture impliquée par la boucle. (Dans la mesure du possible, les goto en arrière fonctionneront dans de telles entrées.) |
Expressions |
Les commandes intégrées if, while et exit utilisent des expressions possédant une syntaxe commune. Les expressions peuvent inclure n’importe lequel des opérateurs décrits dans les trois prochaines sections. Notez que la commande intégrée @ dispose de sa propre syntaxe. |
Opérateurs logiques, arithmétiques et de comparaison |
Ces opérateurs sont similaires à ceux du C et ont la même priorité. Ils incluent : |
|| && | ^ & == != =~ !~ <= >= |
< > << >> + − * / % ! ~ ( ) |
Ici, la priorité augmente en allant vers la droite, « == », « != », « =~ » et « !~ », « <= », « >= », « < » et « > », « << » et « >> », « + » et « − », « * », « / » et « % » ayant, dans leurs groupes respectifs, la même priorité. Les opérateurs « == », « != », « =~ » et « !~ » comparent leurs arguments comme des chaînes de caractères ; tous les autres travaillent sur des nombres. Les opérateurs « =~ » et « !~ » sont similaires à « != » et « == » mis à part que le membre de droite est un motif générique (voyez Substitution des noms de fichiers) auquel on essaie de faire correspondre l’opérande de gauche. Cela amoindrit le besoin de la commande intégrée switch dans des scripts shell où tout ce qui est réellement nécessaire est la reconnaissance de motifs. Les chaînes de caractères commençant par « 0 » sont considérées être des nombres octaux. Les arguments vides ou manquants sont considérés valoir « 0 ». Les résultats de toutes les expressions sont des chaînes de caractères représentant des nombres décimaux. Il est important de noter que deux composants d’une expression ne peuvent apparaître dans le même mot ; à moins qu’ils ne soient adjacents à des composants d’expressions qui sont ont une signification syntaxique pour l’analyseur syntaxique (« & », « | », « < », « > », « ( » ou « ) »), ils devraient être entourés par des espaces. |
Valeur de retour des commandes |
Les commandes peuvent être exécutées dans des expressions, et leur valeur de retour peut être renvoyée en les entourant d’accolades (« {} »). Souvenez-vous que les accolades doivent être séparées des mots des commandes par des espaces. L’exécution d’une commande réussit en renvoyant la valeur vrai, c.-à -d. « 1 », si la commande se termine avec la valeur de retour 0 ; sinon, elle échoue en renvoyant la valeur faux, c.-à -d. « 0 ». Si des informations de statut plus détaillées sont requises, alors la commande devrait être exécutée à l’extérieur d’une expression et la variable shell status devrait être examinée. |
Opérateurs de tests de fichiers |
Certains de ces opérateurs effectuent des tests vrai/faux sur des fichiers et objets apparentés. Ils sont de la forme −op fichier, où op peut être : |
r |
Accès en lecture |
||
w |
Accès en écriture |
||
x |
Exécutable |
||
X |
Exécutable dans le « path » ou commande intégrée, p.ex. « −X ls » et « −X ls−F » sont vrais en général, mais « −X /bin/ls » ne l’est pas (+) |
||
e |
Existence |
||
o |
Propriété |
||
z |
Taille nulle |
||
s |
Taille non nulle (+) |
||
f |
Fichier texte |
||
d |
Répertoire |
||
l |
Lien symbolique (+) * |
||
b |
Fichier spécial en mode bloc (+) |