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 d' cd
un chemin de répertoire avec un espace dans l'un des noms de répertoire, j'ai donc besoin des guillemets (c'est Windows Program Files
sous le vin). Je peux le contourner avec deux cd
commandes, mais pourquoi ne puis-je pas mettre ~
de guillemets?
Si je tape cd '~'
(ou cd "~"
) je reçois:
bash: cd: ~: No such file or directory
command-line
bash
B.Tanner
la source
la source
cd
à un répertoire nommé~
?cd
complètement. Utilisez des variables pour stocker les noms de chemins que vous ne voulez pas taper plusieurs fois, par exemplepf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
ouNUL
?cd ./~
Réponses:
Comme @karel l'a noté dans sa réponse, il
~
s'agit d'un caractère spécial développé par Bash dans le répertoire de base de l'utilisateur actuel. Reportez-vous au manuel de Bash sur "Extension de tilde" ou recherchez le titre "Extension de tilde" dans la page de manuel (man bash
).N'importe quel type de citation
~
empêche le développement de ce tilde.Pour répondre à votre question sur la manière dont vous pouvez toujours l'utiliser pour
cd
créer 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:
Citez le reste du chemin, mais omettez-les autour du tilde et de la première barre oblique:
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 à la
$HOME
place du tilde, qui est toujours développé à l'intérieur de "guillemets doubles" (mais pas de "guillemets simples"):la source
~'/...'
ne fonctionnera pas et n'est pas ce que cette réponse a.~/'...'
ou~/"..."
va travailler.~/'path'
est le chemin à parcourir.~'/...'
travailler? La barre oblique n'est pas un caractère spécial, il semble donc qu'elle devrait fonctionner à l'intérieur ou à l'extérieur des guillemets.~ est un caractère spécial 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 en tant que chaîne de texte littéral.
la source
~
n’est pas un alias au sens où l’bash
interprète: les alias permettent de substituer une chaîne à un mot lorsqu’il est utilisé comme premier mot d’une commande simple. . Comme je l'explique dans ma réponse ci-dessous, c'est plutôt une expansion.Ceci est une
bash
fonctionnalité appelée Expansion Tilde . Citantman bash
:Pour que l'expansion fonctionne, le caractère tilde
~
doit être non mis entre guillemets, sinon le caractère est pris littéralement etcd
échoue s'il n'y a pas de répertoire nommé~
présent dans le répertoire en cours. Voir cette réponse exhaustive pour une explication de citer dansbash
. 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, p.ex.
ou
citez au moins les caractères qui nécessitent des guillemets, par exemple
ou
ne citez que les caractères qui nécessitent des guillemets, par exemple
Tilde Expansion a quelques fonctionnalités plus intéressantes, par exemple:
~+
se développe à la valeur dePWD
, c'est-à-dire le répertoire de travail en cours~-
se développe à la valeur deOLDPWD
, 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”la source
$ touch a; cd \a
. (Je pensais que cela risquait de poser des problèmescd \n
, mais des expériences au moins sur ma version debash
suggèrent que cela fonctionne très bien.)Explorer en utilisant la
echo
commandeLe moyen le plus simple d'explorer le fonctionnement de bash est d'utiliser la
echo
commande. En cas d'~
utilisation ceci:Comme vous pouvez le constater, lorsque vous utilisez un guillemet simple ou que vous utilisez des guillemets doubles,
~
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.la source