cd ~
fait la même chose que
cd $HOME
qui est aussi le même que
cd /home/tandu
cependant,
cd ~not-tandu
modifications apportées à /home/not-tandu
Est-ce purement un choix syntaxique? Comment est-ce géré par le noyau (ou l' cd
exécutable?) Y a-t-il un cas particulier pour ~
ajouter la barre oblique si tout le reste est omis? C'est-à-dire, ~/
et ~
changez pour le même répertoire, mais ~a
c'est un répertoire en haut. La même chose ne peut pas être dite pour tout autre répertoire dans lequel vous passez.
cd-command
home
Pilules d'explosion
la source
la source
cd
sans aucun paramètre fonctionne commecd ~
. Si vous remplacezcd
par,echo
vous pouvez voir à quoi l'expression est développée par le shell.Réponses:
~
est un alias$HOME
fourni par un certain nombre de shells, mais il$HOME
est plus universel.$HOME
demande en fait au shell d'insérer (remplacer) la variable d'environnement HOME ici. Il existe un certain nombre de variables d'environnement différentes qui peuvent être substituées, essayez de lancerenv
une liste. Notez que ce~
n'est pas toujours reconnu quand ce n'est pas au début d'un mot. Essayez ces deux commandes pour la comparaison:Le premier est passé à l'exécutable ls en tant que
/~
qui essaie ensuite de regarder un fichier appelé~
dans le répertoire racine, le second se développe$HOME
et devient//home/user
qui est ensuite passé à l'exécutable ls en tant qu'argument de ligne de commande. Tous les systèmes POSIX (POSIX est la norme pour le fonctionnement des systèmes UNIX et Linux) permettent à plusieurs barres obliques d'être traitées de la même manière qu'une seule barre oblique, ce qui//home/user
revient à dire/home/user
.~username
est un raccourci pour dire au shell de rechercher le nom d'utilisateur dans le fichier passwd et de retourner son répertoire personnel. Il n'y a pas de variable d'environnement équivalente. Toutes ces substitutions sont effectuées par le shell et sont prises en charge par la plupart d'entre elles, mais seules les variables d'environnement comme$HOME
sont garanties d'être prises en charge par tous les shells. Aussi,cd
est en fait une commande intégrée. C'est une directive spéciale qui indique au shell lui-même de changer de répertoire. Ce n'est pas comme les autres fonctions intégrées du shell qui peuvent être implémentées en tant qu'exécutable séparé, commeecho
c'est le cas parce qu'il est utilisé pour changer un attribut fondamental du processus shell.echo
est simplement un shell intégré pour des raisons de performances, mais au bon vieux temps d'UNIX, il n'était disponible que comme son propre exécutable/bin/echo
.la source
~foo
signifie «le répertoire personnel de l'utilisateur foo».Ce n'est pas fait par le noyau, c'est interprété par le shell. Chaque fois que le shell voit
~foo
comme un argument, il le remplace de manière transparente par le répertoire personnel de l'utilisateurfoo
et le transmet à sa place. Ainsi, lorsque vous exécutezcd ~tandu
, le shell est en cours d'exécutioncd /home/tandu
.la source
cd
la coquille? Et si vous n'exécutez pas de shell? Est-ce un simple "si ~ est suivi de quelque chose, étendre différemment?" ou existe-t-il une autre manipulation spéciale pour cette condition unique?cd
, il n'y a pas d'exécutable externe pour le faire (ce ne serait pas possible)exec(2)
), l'expansion du shell n'a pas lieu. Sans expansion du shell,~
il n'est remplacé par rien - c'est juste un autre personnage parfaitement valide. Cela m'a mordu à mes débuts avec SunOS parce/bin/sh
que je n'avais pas de problème~
.~
suivi d'un nom d'utilisateur se développe dans le répertoire personnel de cet utilisateur.la source