En écrivant mon premier scénario, je suis donc sûr que c'est une question fondamentale, mais quelqu'un peut-il m'expliquer pourquoi je peux:
cd ~
cd bin
cd ~/bin
cd 'bin'
Mais non
cd '~'
cd '~/bin'
J'ai besoin de cd
vers un chemin de répertoire avec un espace dans l'un des noms de répertoires, donc j'ai besoin des guillemets (c'est Windows Program Files
sous wine). Je peux le contourner avec deux commandes cd
, mais pourquoi ne puis-je pas mettre ~
entre guillemets?
Si je tape cd '~'
(ou cd "~"
), je reçois:
bash: cd: ~: No such file or directory
Comme @karel l'a noté dans sa réponse, ~
est un caractère spécial développé par Bash dans le répertoire de base de l'utilisateur actuel. Voir Manuel de Bash sur "Extension de tilde" , ou recherchez le titre "Extension de tilde" dans la page de manuel (man bash
).
Tout type de citation autour du ~
empêche cette expansion du tilde.
Pour répondre à votre question sur la manière dont vous pouvez toujours l'utiliser pour cd
dans un répertoire avec des espaces dans son nom, il existe plusieurs alternatives:
Omettez les guillemets et échappez les espaces avec des barres obliques inverses:
cd ~/foo/spaces\ are\ cool/bar
Citez le reste du chemin, mais omettez-les autour du tilde et de la première barre oblique:
cd ~/"foo/spaces are cool/bar"
Comme vous le voyez, vous pouvez concaténer des chaînes citées et non citées dans Bash en les écrivant simplement les unes à côté des autres, sans espace entre elles.
Utilisez la variable d'environnement $HOME
au lieu du tilde, qui est toujours développé à l'intérieur de "guillemets doubles" (mais pas de "guillemets simples"):
cd "$HOME/foo/spaces are cool/bar"
~ est un caractère spécial qui est interprété par le shell comme le répertoire de base de l'utilisateur connecté. '~' est interprété par le shell comme un caractère littéral ~, et non comme le répertoire de base de l'utilisateur connecté, car l'enfermement d'une chaîne entre deux caractères de guillemets simples entraîne l'interprétation de cette chaîne comme une chaîne de texte littéral.
Il s'agit d'une fonction bash
appelée Expansion du tilde . Citer man bash
:
Si un mot commence par un caractère tilde sans guillemets (`~ '), tous les caractères précédant la première barre oblique sans guillemets (ou tous les caractères, le cas échéant). sans barre oblique) sont considérés comme un préfixe tilde. Si aucun des caractères du préfixe tilde n'est cité, les caractères du préfixe tilde suivant le tilde sont traités comme un nom de connexion possible. Si ce nom de connexion est la chaîne NULL, le tilde est remplacé par la valeur du paramètre Shell HOME. Si HOME n'est pas défini, le répertoire de base de l'utilisateur exécutant le shell est remplacé.
Pour que l'expansion fonctionne, le caractère tilde ~
doit être non mis entre guillemets, sinon le caractère est pris littéralement et cd
échoue s'il n'y a pas de répertoire nommé ~
dans le répertoire actuel. Voir cette réponse exhaustive pour une explication de la citation dans bash
name__. Si vous devez citer une partie du chemin, vous pouvez donc:
citez au moins les caractères qui ont besoin de guillemets avec des guillemets simples, par exemple.
~/dir' 'with' 'spaces/
ou
~/'dir with spaces/'
citez au moins les caractères qui doivent être placés entre guillemets, par exemple.
~/dir" "with" "spaces/
ou
~/"dir with spaces/"
ne citez que les caractères qui ont besoin de guillemets avec des barres obliques inverses, par exemple.
~/dir\ with\ spaces/
Tilde Expansion a quelques fonctionnalités plus intéressantes, par exemple:
~+
se développe à la valeur de PWD
name__, c’est-à-dire le répertoire de travail en cours~-
se développe à la valeur de OLDPWD
name__, c’est-à-dire le répertoire de travail précédent~john
se développe dans le répertoire de base associé au nom de connexion "john"echo
Le moyen le plus simple d'explorer le fonctionnement de bash consiste à utiliser la commande echo
. Dans le cas de ~
, utilisez ceci:
$ echo ~
/home/rick
$ echo '~'
~
$ echo "~"
~
$ echo `~`
bash: /home/rick: Is a directory
Comme vous pouvez le constater, lorsque vous utilisez des guillemets simples ou que vous utilisez des guillemets doubles autour de ~
, il est interprété littéralement comme une chaîne et non développé comme une variable. Lorsque vous utilisez des backticks (`), il est exécuté en tant que commande et génère un message d'erreur.