web-dev-qa-db-fra.com

Pourquoi ne puis-je pas cd sur un tilde cité ('~')?

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
32
B.Tanner

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"
    
78
Byte Commander

~ 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.

17
karel

Il s'agit d'une fonction bashappelé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 bashname__. Si vous devez citer une partie du chemin, vous pouvez donc:

  1. citez au moins les caractères qui ont besoin de guillemets avec des guillemets simples, par exemple.

    ~/dir' 'with' 'spaces/
    

    ou

    ~/'dir with spaces/'
    
  2. citez au moins les caractères qui doivent être placés entre guillemets, par exemple.

    ~/dir" "with" "spaces/
    

    ou

    ~/"dir with spaces/"
    
  3. 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 PWDname__, c’est-à-dire le répertoire de travail en cours
  • ~- se développe à la valeur de OLDPWDname__, 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"
15
dessert

Explorer à l'aide de la commande 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.

1