Je me demandais comment créer un fichier nommé comme indicateur, par exemple, si je voulais créer un dossier nommé -a
, quelles commandes feraient l'affaire?
J'ai essayé mkdir '-a'
, mkdir \-a
et aucun n'a fonctionné. Je suis sur Ubuntu.
Je me demandais comment créer un fichier nommé comme indicateur, par exemple, si je voulais créer un dossier nommé -a
, quelles commandes feraient l'affaire?
J'ai essayé mkdir '-a'
, mkdir \-a
et aucun n'a fonctionné. Je suis sur Ubuntu.
Réponses:
Appelez la commande comme ceci:
mkdir -- -a
Les --
moyens que les options se terminent après, de sorte que le -a
est interprété littéralement et non comme une option mkdir
. Vous trouverez cette syntaxe non seulement dans mkdir
, mais dans tout utilitaire compatible POSIX à l'exception de echo
et test
. De la spécification :
L'argument - doit être accepté comme un délimiteur indiquant la fin des options. Tous les arguments suivants doivent être traités comme des opérandes, même s'ils commencent par le caractère «-». L'argument - ne doit pas être utilisé comme option ou comme opérande.
L'utilisation --
comme sauvegarde est recommandée pour presque toutes les actions où vous traitez des noms de fichiers et voulez vous assurer qu'ils ne cassent pas la commande, par exemple lorsque vous déplacez des fichiers dans une boucle, vous pouvez appeler ce qui suit, de sorte qu'un fichier appelé -i
n'est pas ' t (in?) correctement analysé en option:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
un exemple légèrement artificiel. Tout éditeur digne de ce nom devrait être capable d'enregistrer dans un fichier nommé -myfile.c
si vous le lui demandez, mais le compilateur C ne fera probablement pas ce que vous voulez quand on lui donnera une telle liste d'options.
cc
commande que Michael a donnée ci-dessus, qui a la -o
possibilité de spécifier le fichier de sortie.
for f in ./*; do...
plutôt quefor f in *; do...
La manière la plus simple qui devrait fonctionner avec n'importe quel programme raisonnable est d'utiliser un nom de chemin relatif devant le -
, par exemple mkdir ./-a
, créera un répertoire appelé -a
dans le répertoire de travail courant.
L'exemple le plus courant d'utiliser cette "astuce" est lorsque vous souhaitez supprimer un fichier qui commence par un tiret, afin que vous puissiez le faire rm ./-a
.
./
est toujours une bonne idée - imaginez que vous avez créé un fichier appelé -rf
puis que vous avez appelé rm *
.
--
n'est pas compris par toutes les commandes, juste quelques-unes)
--
c'était un truc bash, donc ça devrait marcher pour tous les programmes?
La raison pour laquelle mkdir '-a'
, ou mkdir \-a
ne fonctionne pas, est parce que ces deux méthodes (en utilisant des guillemets ou des barres obliques inverses) sont utilisées pour empêcher votre shell (probablement bash
) de leur donner une signification particulière. Comme -a
cela ne signifie de toute façon rien de spécial pour le shell, ceux-ci n'ont aucun effet sur la façon dont il est transmis mkdir
.
En ce qui le mkdir
concerne, il reçoit une liste d'arguments du shell, et il ne peut pas dire si vous les avez mis entre guillemets ou non, ou s'il y a eu une barre oblique inverse. Il ne voit qu'un seul argument -a
. C'est pourquoi vous avez besoin du --
comme expliqué dans les autres réponses.
En plus de la réponse de "slhck", il existe une autre astuce qui fonctionne parfois:
Mettez le nom de fichier en question dans 2 ensembles de qoutes (différentes) comme "'-a'"
ou '"-a"'
.
Que cela fonctionne ou non dépend du programme, mais c'est un dernier recours si le programme ne prend pas en charge la --
fonction POSIX .
La méthode POSIX est toujours préférée car elle est fiable à 100%.
--
pour terminer le traitement des options suppose également que vous n'avez pas besoin d'options pour suivre le nom du fichier, ce qui n'est pas toujours le cas.
'-a'
ou "-a"
, au moins sur les systèmes de type BSD