J'ai accidentellement créé un fichier avec le nom -
(par exemple, seq 10 > -
). Ensuite, j'ai essayé de l'utiliser less
pour le voir, mais il se bloque simplement.
Je comprends que cela se produit car less -
attend des entrées de stdin
, donc il n'interprète pas le -
comme un nom de fichier. J'ai essayé less \-
mais ça ne marche pas non plus.
Alors, existe-t-il un moyen d'indiquer less
qu'il -
s'agit d'un fichier et non de stdin?
Le mieux que j'ai pu obtenir est:
find -name '-' -exec less {} +
-
seul est différent.-
n'est pas une option.-
n'est pas traité comme une option, c'est un problème totalement différent du cas des arguments qui se présentent comme des options.-
entre guillemets simples comme'-'
ou de lui échapper comme\-
parce qu'il-
n'est pas un caractère spécial pour les shells courants (au moins ceux compatibles POSIX). Le résultat est le même.Réponses:
Il suffit de le préfixer avec
./
:Ou utilisez la redirection:
Notez que puisque
-
(par opposition à-x
ou--foo--
par exemple) est considéré comme un nom de fichier spécial plutôt qu'une option, ce qui suit ne fonctionne pas:la source
find -name '-' -exec less {} +
fonctionne.-
et./-
(ou/path/to/-
ou../to/-
) sont deux (4) chemins valides pour ce-
fichier, mais un-
argument est spécial pourless
(signifie lu depuis stdin) tandis que./-
n'est pas spécial.find -name '-' -exec less {} +
est le formulaire non standard pourfind . -name '-' -exec less {} +
. Il descend l'arborescence à.
et trouve les fichiers et passe les chemins de ces fichiers comme arguments àless
. Remplacez-exec less
par-exec echo less
pour voir ce qui est exécuté.--
c'est pour marquer la fin des options. Cela n'aidera pas ici. Ce-
n'est pas une option, c'est un argument spécial sans option. Voir aussi unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
est géré par getopt () pour marquer la fin des options,-
n'est pas reconnu comme une option par getopt (), ce qui-
sera reconnu comme un argument normal, qu'il--
soit fourni ou non. Et comme argument normal,less
comme la plupart des utilitaires de texte le traiteront comme signifiant stdin, ce que nous ne voulons pas ici.Je voudrais juste
mv - f && less f
. Problème résolu.la source
Remarque: ma réponse n'est PAS valide dans le cas de l'OP, et ne s'applique qu'aux outils suivant la convention mentionnée ci-dessous et pas dans le cas d'un fichier nommé exactement juste
-
(tiret), qui est souvent aussi un cas spécial pour spécifier cette lecture à partir de la norme entrée est attendue. Voir la réponse acceptée.Laissant ceci ici car il contient des informations utiles pour d'autres cas sur lesquels on peut tomber lors de la recherche de réponses.
Doublez-le!
Utilisez la
--
convention standard double-dash ( ) pour indiquer le dernier argument:Exemple
Quoi?
Cet
--
argument découle d'une convention prise en charge par la plupart des implémentations des utilitaires de shell et des outils de ligne de commande, et la plupart des shells préconisent visiblement de la suivre lors de l'implémentation des outils CLI.Recommandé par l'Open Group
L'OpenGroup le mentionne également dans la section Default description defaults (v6) de sa spécification de base:
Et dans les directives de syntaxe utilitaire (v7):
Recommandé par Bash
Ici, extrait du manuel bash, à propos de ses fonctions internes le supportant:
Lecture supplémentaire
la source
-
lequel ce n'est pas une option. L'utilisation./-
ou la redirection lorsque cela est possible est généralement une meilleure approche car elle évite d'autres types de problèmes comme lefoo=bar
ofawk
ou that-
. Voir aussi unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
essaiera toujours de lire depuis stdin.