Comment entrez-vous dans un répertoire dont le nom n'est qu'un moins?

26

J'ai téléchargé lessn sur mon serveur Web et l'ai décompressé.

Il contient un dossier nommé -. J'ai supposé que je sais comment gérer cela, mais je ne le sais pas.

J'ai essayé cd -- -, mais cela n'a pas l'effet souhaité. L'utilisation de guillemets ne semble pas non plus l'affecter. J'ai mis des barres obliques partout, en vain.

Quelle est la bonne façon de passer dans ce dossier?

Der Hochstapler
la source

Réponses:

34

Vous voulez éviter qu'il ne soit un paramètre, nous essayons donc de lui ajouter quelque chose. Le répertoire courant est accessible avec ., ainsi le sous-dossier -peut être consulté alternativement avec ./-.

cd ./-

La raison pour laquelle cela cd -- -ne fonctionne pas est que cela est implémenté différemment si vous comparez rm(voir man rm) à cd(voir man bashou man cd), cda une interprétation différente qui voit -comme paramètre (voir man bashou man cd).

Il convient également de noter qu'il cds'agit d'une fonction intégrée au shell, comme on peut le lire dans cette réponse :

cdn'est pas une commande externe - c'est une fonction intégrée au shell. Il s'exécute dans le contexte du shell actuel, et non, comme le font les commandes externes, dans un contexte fork / exec'd en tant que processus séparé.

Il existe une cdcommande externe , mais elle fait quelque chose de complètement différent .

Cela explique pourquoi l'implémentation est différente, car Bash et Coreutils sont deux choses différentes.

Supposons simplement que vous ne croyiez pas cela, comment pouvons-nous le confirmer? Utilisez whichet type.

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

Voir man whichpour plus d'informations et man bashou man typepourtype

Tamara Wijsman
la source
4
Non, "-" est implémenté dans tous les utilitaires standard, mais est destiné à mettre fin aux options. "-" seul n'est pas reconnu comme une option mais comme le répertoire précédent.
Stéphane Chazelas
4
Bonne solution, mais l'explication est fausse. Il est complètement hors de propos que ce cdsoit une fonction intégrée. La raison pour laquelle cd -- -cela ne fonctionne pas est que -c'est un opérande, pas une option.
Gilles 'SO- arrête d'être méchant'
1
sur Mac OS X cd -- -vous changera en un répertoire nommé -dans le répertoire courant. FWIW.
Tim Kennedy
La plupart des commentaires ont été reflétés dans la deuxième partie de mon message.
Tamara Wijsman
22

Un moins (alias tiret) n'est pas à lui seul une option, mais un opérande (c'est-à-dire un argument qui n'est pas une option). Pour cette raison, la mise en --avant n'a aucun effet. Le tiret est un opérande dans cd -et toujours un opérande dans cd -- -. Comme les autres utilitaires standard, cdtraite un opérande comme un opérande, qu'il soit ou non --devant lui.

La cdcommande attribue une signification spéciale à l'opérande -. Tout le reste est un répertoire vers lequel basculer. cd -- -abascule vers le répertoire appelé -a, car -an'est pas spécial comme opérande et --empêche cdde le traiter comme une option. Cela ne fonctionne pas -seul, ce qui n'est pas une option.

Mettre des guillemets -ne va pas aider, car cela finirait par passer l'opérande de -toute façon.

Votre seul recours est donc de trouver une autre manière d'exprimer la même idée, c'est-à-dire un autre nom pour le même répertoire. Heureusement, il y en a un simple: si vous ajoutez ./avant un nom de fichier relatif, cela signifie toujours le même fichier. Le ./fait une différence qui n'est pas pertinente dans notre cas: CDPATHn'est pas consulté lorsque le nom du répertoire commence par /, ./ou ../. Ainsi:

cd ./-

Une autre façon, puisqu'il -s'agit d'un répertoire, est d'ajouter un /après. L'ajout d'un /à la fin d'un nom de fichier garantit que le fichier est traité comme un répertoire (en particulier, la commande fonctionnera sur le répertoire lui-même et non sur le lien symbolique si le fichier est un lien symbolique vers un répertoire), mais fait autrement aucune différence. Ainsi:

cd -- -/

Soit -/dit en passant, l' écriture est suggérée par le code d'achèvement, mais dans bash il ne fonctionne qu'en fait --avant, bash n'a pas de cas particulier pour cd -/(zsh le fait).

Gilles 'SO- arrête d'être méchant'
la source
Cela m'épate, j'ai essayé cd -- -/, mais en raison d'avoir exécuté l'équivalent de cd -juste avant cela, le répertoire n'existait pas et je l'ai interprété comme une autre tentative infructueuse.
Der Hochstapler
5

Se qualifier avec le chemin est une option.

cd ./-
iruvar
la source
2

Ceux-ci fonctionneraient également:

cd ~/'-'

ou

cd ~/"-"
Michael Durrant
la source
1
mais seulement si cela se produit dans le répertoire personnel
RiaD
1
… Et les citations sont inutiles.
Scott