Comment lire les fichiers de tiret

15

Comment puis-je lire un fichier de tiret depuis le terminal autre que le délimiter avec ./

Par exemple, pour lire un, - filenous pouvons le lire en

cat ./-file_name

Q: Existe - t-il un autre moyen de réaliser la même chose?

vidhan
la source
4
la manière recommandée est en fait d'utiliser le ./préfixe. C'est le plus portable (cf la FAQ Unix de l'ère Usenet)
Olivier Dulac
find . -name "-filename" | xargs catenverra ./-filename par le canal. Pour votre cas (simplifié?), Une erreur, mais cela pourrait aider dans les grands répertoires / scripts.
Walter A

Réponses:

11

Pour les commandes qui reçoivent une entrée de stdin, vous pouvez utiliser la redirection:

cat <-file_name
cuonglm
la source
ya celui-ci fonctionne :) est donc j'ai 3 façons de les lire un en utilisant ./ autre en utilisant - et un autre en utilisant <, plus de façons de faire la même chose ??
vidhan
22

Utilisez le double --pour marquer la fin des options:

cat -- -<FILENAME>

D' autres programmes tels que touch, rmou git checkoutsuivent également cette convention:

$ touch -- -file
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:13 -file
$ echo hi! >> -file
$ cat -- -file
hi!
$ rm -- -file
$ echo $?
0

AVERTISSEMENT: il est recommandé de toujours utiliser --after rmdans les scripts. Un attaquant pourrait placer le --rffichier dans un répertoire et rm *le prendrait comme paramètres d'exécution. Regarde ça:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm *
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:21 -rf

Oups, ce n'est pas ce que nous voulions dire, nous ne voulions pas supprimer les répertoires. Nous aurions dû utiliser --:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm -- *
rm: cannot remove `dir': Is a directory
$ ll
total 4.0K
drwxr-xr-x 2 ja ja 4.0K Mar 10 13:22 dir
Arkadiusz Drabczyk
la source
3
Vous ne pouvez pas compter sur la mise en œuvre de tous les programmes --: beaucoup le font mais pas tous.
glenn jackman
2
Vraiment? Je n'ai pas dit que tous les programmes sont mis en œuvre --, j'ai dit que certains le faisaient .
Arkadiusz Drabczyk
1
@vidhan: je ne connais aucune autre option.
Arkadiusz Drabczyk
1
@vidhan, vous pouvez également compliquer votre vie sans raison et faire quelque chose comme ça, find . -name '-file_name' -exec cat {} \;mais cela ne sert à rien.
terdon
2
Cela ne fonctionne pas si le fichier est nommé -et rien d'autre? Cela est apparu dans le wargame: overthewire.org/wargames/bandit/bandit2.html
ThisClark
2

Les alternatives deviennent étranges:

dd if=-x 2>/dev/null
Walter A
la source