Pour une commande, utiliser -
comme argument à la place d'un nom de fichier signifiera STDIN ou STDOUT.
Mais dans cet exemple, il crée un fichier avec le nom suivant
-
:echo hello > -
Comment puis-je faire
-
dans cet exemple signifie STDOUT?Inversement, comment faire en sorte
-
qu'un fichier soit nommé-
dans des exemples tels que:cat -
2>&-
construction, ce qui signifie "descripteur proche 2".Réponses:
Utiliser
-
comme nom de fichier pour signifier stdin / stdout est une convention utilisée par de nombreux programmes. Ce n'est pas une propriété spéciale du nom de fichier. Le noyau ne reconnaît pas-
comme spécial, donc tous les appels système référant à-
un nom de fichier utiliseront-
littéralement le nom de fichier.Avec la redirection bash,
-
n’est pas reconnu comme un nom de fichier spécial, bash l’utilisera donc comme nom de fichier littéral.Lorsqu'il
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 qui est vuecat
de manière à ce qu'elle se réfère toujours à un fichier appelé-
. La méthode habituelle consiste à préfixer le nom du fichier avec un chemin -./-
, ou/home/Tim/-
. Cette technique est également utilisée pour résoudre des problèmes similaires dans lesquels les options de ligne de commande entrent en conflit avec les noms de fichiers. Ainsi, un fichier nommé./-e
n'apparaît pas comme l'-e
option de ligne de commande d'un programme, par exemple.la source
/dev/stdin
il/dev/stdout
est universellement disponible et peut être utilisé à la place de la-
convention.cat
cas, utiliser la redirection au lieu de lister l'argument pourrait aidercat <-
:; Cependant, il serait difficile de combiner cela avec la concaténation de plusieurs fichiers à la fois.jmtd
la question. :)Au lieu de
echo hello > -
, vous pouvez utiliserecho hello > /dev/stdout
.Alors que '-' est une convention qui doit être mise en œuvre par chaque programme souhaitant la prendre en charge
/dev/stdin
,/dev/stdout
et/dev/stderr
qui, une fois pris en charge par le système d’exploitation (au moins Solaris, Linux et les BSD), sont indépendants de l’application, puis fonctionnent comme vous le souhaitez. l'intention.la source
Comme camh l'a mentionné , ce
-
n'est qu'une convention de nommage utilisée par certains programmes. Si vous voulez faire référence à ces flux avec un descripteur de fichier reconnu par le shell, jiliagre a eu raison de vous demander d' utiliser le nom/dev/stdin
ou/dev/stdout
plutôt. Ces noms de fichiers doivent fonctionner n'importe quel endroit où un nom de fichier normal fonctionnerait.Cela étant dit, votre premier exemple est un peu ridicule. Toute sortie qui serait interceptée par l'opérateur de redirection pour écrire dans un fichier est déjà en sortie standard, donc le rediriger et l'écrire à sa source est inutile. Le comportement que vous utilisez là-bas est le tuyau, pas une redirection:
Dans votre deuxième exemple, vous devez simplement indiquer une indication que vous souhaitez un fichier littéral portant ce nom, et non son alias interne. Vous pouvez faire cela plus facilement en spécifiant un chemin d'accès au fichier comme ceci:
la source
Pour 1, le programme doit le soutenir. Vous ne pouvez pas l'utiliser de manière arbitraire. Quant à 2, redirige l'entrée de (par exemple
cat < -
).la source
L'approche '-' a beaucoup de problèmes. Tout d'abord, cela nécessite une interprétation du caractère '-' et de nombreux programmes n'effectuent pas une telle interprétation. De plus, certains programmes interprètent un trait d'union comme un séparateur marquant la fin des options en ligne de commande. Les programmes sont écrits pour fonctionner avec des arguments de nom de fichier, l'approche '-' est un hack, sympa mais faible.
Le meilleur moyen est:
/dev/stdout
est un lien symbolik de/dev/fd/1
la source