Pour une commande, si vous utilisez -
comme argument à la place dun nom de fichier, cela signifie STDIN ou STDOUT.
-
Mais dans cet exemple, il crée un fichier avec le nom
-
:echo hello > -
Comment puis-je faire en sorte que
-
dans cet exemple signifie STDOUT? -
Inversement, comment puis-je faire en sorte que
-
signifie un fichier nommé-
dans des exemples tels que:cat -
Commentaires
Réponse
Utiliser -
comme nom de fichier pour signifier stdin / stdout est une convention que beaucoup de programmes utilisent. Ce nest pas une propriété spéciale du nom de fichier. Le noyau ne reconnaît pas -
comme spécial, donc tout appel système faisant référence à -
comme nom de fichier utilisera -
littéralement comme nom de fichier.
Avec la redirection bash, -
nest pas reconnu comme un nom de fichier spécial, donc bash lutilisera comme nom de fichier littéral.
Lorsque cat
voit la chaîne -
comme un nom de fichier, il la traite comme un synonyme de stdin. Pour contourner ce problème, vous devez modifier la chaîne que cat
voit de telle sorte quelle se réfère toujours à un fichier appelé -
. La manière habituelle de faire ceci est de préfixer le nom de fichier avec un chemin – ./-
, ou /home/Tim/-
. Cette technique est également utilisée pour contourner des problèmes similaires où les options de ligne de commande entrent en conflit avec les noms de fichiers, de sorte quun fichier appelé ./-e
napparaît pas comme -e
option de ligne de commande à un programme, par exemple.
Commentaires
- It ‘ s il convient dajouter que
/dev/stdin
et/dev/stdout
sont universellement disponibles et peuvent être utilisés à la place de-
convention. - @jmtd: / dev / std {in, out} ne sont pas universellement disponibles. Tous les Unix ne lont pas.
- Intéressant, jai supposé quils faisaient partie de POSIX (mais je ne peux ‘ t confirmer). Ils ‘ sont présents au moins sur Linux, les BSD et Solaris. Pouvez-vous donner un exemple dUNIX moderne qui nen a pas?
- @camh Je ne sais pas si vous avez reçu la notification, et cest un sujet très, très ancien; Je ‘ ne sais pas si vous le pouvez, mais ‘ je suis très curieux de savoir si vous connaissez la réponse à ‘? 🙂
- @jmtd Je semble avoir trouvé une réponse provisoire à la question: unix.stackexchange.com/a/278368/31669
Réponse
-
Au lieu de
echo hello > -
, vous pouvez utiliserecho hello > /dev/stdout
.Alors que « – » est une convention qui doit être implémentée par chaque programme souhaitant le supporter,
/dev/stdin
,/dev/stdout
et/dev/stderr
sont, lorsquils sont pris en charge par le système dexploitation (au moins Solaris, Linux et BSD le font) , indépendamment de lapplication et fonctionnera comme vous lentendez.
Réponse
Comme camh mentionné , -
est juste une convention de dénomination utilisée par certains programmes.Si vous voulez faire référence à ces flux avec un descripteur de fichier que le shell reconnaîtra, jiliagre avait raison en vous faisant utiliser le nom /dev/stdin
ou /dev/stdout
à la place. Ces noms de fichiers devraient fonctionner nimporte où où un nom de fichier normal fonctionnerait.
-
Cela étant dit, votre premier exemple est plutôt idiot. Toute sortie qui serait interceptée par lopérateur de redirection pour écrire dans un fichier est déjà sur la sortie standard, il est donc inutile de la rediriger et de la réécrire là où elle vient. Le comportement que vous utilisez ici est le tube, pas une redirection:
echo hello |
-
Dans votre deuxième exemple, vous devez simplement donner quelques indication que vous voulez un fichier littéral de ce nom, et non lalias interne dont il dispose. Vous pouvez le faire plus facilement en spécifiant un chemin vers le fichier comme ceci:
cat ./-
Réponse
Quant à 1, le programme doit le supporter. Vous ne pouvez pas l’utiliser arbitrairement. Comme pour 2, redirigez l’entrée de (par exemple, cat < -
).
Réponse
Lapproche « – » pose beaucoup de problèmes. Tout dabord, elle nécessite une interprétation du caractère « – » et de nombreux programmes neffectuent pas une telle interprétation. De plus, certains programmes interprètent un trait dunion comme un délimiteur marquant la fin des options de ligne de commande. Les programmes sont écrits pour fonctionner avec des arguments de nom de fichier, lapproche « – » est un hack, sympa mais faible.
Le meilleur moyen est:
$ echo hello > /dev/fd/1
/dev/stdout
est un lien symbolique de /dev/fd/1
Commentaires
- La redirection est interprétée par le shell, et non par le programme appelé.
Réponse
Les caractères spéciaux ont principalement deux significations:
Graphique numérique ASCII.
Script ou symbolique.
Il est possible quun seul caractère représente une chaîne, ou agisse comme une chaîne. Selon ce que je comprends.
en langage C fopen()
fonction prend deux arguments premier flux de fichier et le deuxième mode dans lequel le fichier sera ouvert. le mode est une chaîne. même sil sagit dun « caractère unique.
cat > » – » fonctionne.
2>&-
construction, ce qui signifie » close descriptor 2 « .