Comment puis-je échapper un nom de sous-répertoire contenant une esperluette?


9

Exécuter un kornshell et essayer de parcourir une arborescence de répertoires. Voulez-vous cd dans un sous-répertoire nommé comme suit:

 -3ab_&_-3dc.img

Ma question est: COMMENT dois-je échapper à l'esperluette sous ce nom? J'ai essayé différentes combinaisons de guillemets doubles et de barres obliques inversées sans succès.

Réponses:


11

Pour le &(ou presque n'importe quel autre personnage, vous avez deux possibilités simples.

  • Mettez des guillemets simples tout autour: ' -3ab_&_-3dc.img'
  • Mettez une barre oblique inverse avant chaque personnage gênant: -3ab_\&_-3dc.img

Il existe deux exceptions:

  • La méthode de devis unique ne fonctionne pas pour un devis unique. La barre oblique inverse n'est pas spéciale dans les guillemets simples, vous ne pouvez donc pas l'utiliser directement non plus. Ce que vous pouvez faire est de mettre fin à la chaîne entre guillemets simples, d'utiliser immédiatement la barre oblique inverse plus le guillemet simple et de redémarrer le guillemet simple. Ainsi , par exemple, si le nom du répertoire est foo'bar\qux: cd 'foo'\''bar\qux'. Vous pouvez vous en souvenir de cette façon: à l'intérieur des guillemets simples, '\''vous obtenez un seul devis.
  • La méthode de barre oblique inverse ne fonctionne pas pour les sauts de ligne: la barre oblique inversée est simplement ignorée. Vous devez mettre des guillemets simples autour d'une nouvelle ligne.

Vous pouvez également utiliser des guillemets doubles, mais vous devez ensuite mettre une barre oblique inverse avant certains caractères. Les guillemets simples sont plus simples.

Il y a une difficulté supplémentaire ici, c'est que le nom du répertoire commence par un tiret. Ce caractère indique à la cdcommande (comme presque toutes les commandes) qu'une option suit. Le tiret n'est pas spécial pour le shell, seulement pour la commande, donc les guillemets ne l'affecteront pas. Vous avez deux façons de passer un argument qui commence par un tiret à une commande sans le faire interpréter comme une option:

  • Trouvez une autre façon d'exprimer cet argument. Pour un nom de fichier, l'ajout ./de devant désigne toujours le même fichier.
  • Mettez l'argument --avant. Cela indique à la commande d'arrêter de rechercher des options.

Voici donc quelques façons de changer dans ce sous-répertoire:

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'

Merci. Je pensais avoir essayé ce format aussi, mais j'ai oublié d'échapper à l'esperluette (comme dans votre 3ème exemple). Quand je l'ai fait, cela a fonctionné.
RCinICT

5

L'esperluette doit être échappée, mais le problème que vous rencontrez est probablement -lié à l'esperluette, plutôt qu'à l'esperluette. Le premier -cd fait pense que vous passez des options. Vous pouvez contourner cela en utilisant ./:

cd './-3ab_&_-3dc.img'

C'est &vraiment un problème. Quant au -, cela dépend du shell. Zsh est très content cdd'un répertoire commençant par a -. Mais bash ne l'est pas.
Patrick

Merci. Je pensais avoir essayé ce format aussi, mais j'ai oublié d'échapper à l'esperluette. Quand je l'ai fait, cela a fonctionné.
RCinICT
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.