Un petit détail à mentionner: le -pas besoin d'être à la fin de la commande. Par exemple: ls -l | diff - /old_ls_output.txt.
Manatwork
Réponses:
83
Dans ce cas, cela signifie «entrée standard». Il est utilisé par certains logiciels (par exemple tar) lorsqu'un argument de fichier est requis et que vous devez utiliser stdin à la place. Ce n'est pas une construction shell et cela dépend du programme que vous utilisez. Consultez la page de manuel en cas de doute!
Dans ce cas, l'entrée standard est l'argument de l' -foption. Dans les cas où il -n'est pas pris en charge, vous pouvez vous en tirer en utilisant quelque chose comme tar xvf /proc/self/fd/0ou tar xvf /dev/stdin(ce dernier est largement pris en charge dans diverses unités).
Ne comptez pas sur cela pour dire «entrée standard» universellement. Comme il n’est pas interprété par le shell, chaque programme est libre de le gérer à sa guise. Dans certains cas, il s’agit d’une sortie standard ou de quelque chose de complètement différent: sucela signifie «lancez un shell de connexion». Dans d'autres cas, ce n'est pas du tout interprété. La mémoire musculaire m'a fait créer pas mal de fichiers nommés, -car une version d'un programme auquel j'étais habitué ne comprenait pas le tiret.
Cela peut aussi signifier STDOUT, selon le contexte.
bahamat
3
Et à peu près tout le reste, car il appartient aux programmes individuels d’interpréter.
Alexios
5
/dev/stdinou /dev/stdoutpeut être utilisé si vous voulez vraiment un flux d’entrée / sortie. Notez que c’est un flux, les programmes qui veulent chercher dans un fichier peuvent ne pas fonctionner correctement, comme ce serait le cas avec -(par exemple, ffmpeg)
Lekensteyn
3
Dans le cas de bash, le trait d'union est interprété par le shell. Reportez-vous au document Advanced Bash-Scripting Guide - Chapitre 3. Caractères spéciaux , puis recherchez le texte [tiret] ou "redirection de / vers stdin ou stdout". En utilisant, bashvous pouvez utiliser le trait d'union dans la plupart des endroits qui attendent un nom de fichier. C'est un complément évident à <| > IMHO
BSD
4
Je ne suis pas convaincu que ce soit le cas. Tout d’abord, catgère -(consultez la page de manuel). Une version de shell pouvant inclure catou non, mais ce n'est pas strictement le shell entier. De plus, si le shell était manipulé -, vous pourriez dire écho -et cela passerait à autre chose. Au lieu de cela, il fait juste écho à un tiret (pas /dev/stdinou /proc/self/fd/0). Et echo test > -crée simplement un fichier appelé -, de sorte qu'il ne l'utilise clairement pas non plus. Oh, et la page que vous avez listée ne dit pas qu'elle est gérée par le shell , elle dit que vous pouvez l'utiliser avec, catet que les diffdeux comprennent les tirets de manière explicite.
Alexios
14
Dans ce cas, il -est plutôt inutile, si vous utilisez Linux:
GNU tar (la version sous Linux) accepte ses entrées à partir de l'entrée standard par défaut. Si vous ne souhaitez pas ce comportement et souhaitez passer le nom du fichier en tant qu'argument de ligne de commande, vous devez spécifier l'indicateur f:
tar xf filename
Donc, c'est pareil que
tar x < filename
Ou, si l'entrée est gzippée comme dans votre exemple:
gzip -dc filename | tar x
Indiquer le fdrapeau ici n'a aucun sens , mais comme il a été spécifié, le nom de fichier doit être indiqué de manière -à indiquer que nous voulons lire à partir de l'entrée standard (voir autre réponse). Donc, pour répéter, c'est redondant et légèrement étrange.
De plus, la ligne ci-dessus peut être simplifiée car il est possible de dire à GNU tar de transmettre l’entrée par gzipelle-même en spécifiant le zdrapeau:
La plupart des systèmes d'exploitation autres que Linux utilisent par tardéfaut le premier lecteur de bande, pour des raisons historiques.
Gilles, arrête de faire le mal
1
@Gilles et BSD, et OS X,…. Mais je suis curieux de savoir: quels autres systèmes, à l'exception de quelques vieux ordinateurs centraux, utilisent encore une telle version (quels systèmes autres que les ordinateurs centraux disposent même d' un lecteur de bande)?
Konrad Rudolph
1
@ KonradRudolph Les trois principaux BSD utilisent par défaut un lecteur de bande ( /dev/sa0sous FreeBSD 9.0, /dev/rst0NetBSD 6.0 et OpenBSD 5.1). La valeur par défaut d’AIX 7.1 est /dev/rmt0. La valeur par défaut de MINIX3 est /dev/sa0. (Dans chaque cas, j’ai vérifié la dernière version du système d’exploitation, il ne s’agit pas d’anciens ordinateurs centraux.) Solaris est configurable par le biais d’un fichier /etcqui, par défaut, est un lecteur de bande. Les commandes tar GNU, Schilling, OSX et BusyBox sont définies par défaut sur stdin / stdout.
Gilles 'SO- arrête d'être méchant'
1
@ Gilles - Je me suis recompilé tarpour utiliser par défaut le deuxième lecteur de bande, pour des raisons évidentes. :)
-
pas besoin d'être à la fin de la commande. Par exemple:ls -l | diff - /old_ls_output.txt
.Réponses:
Dans ce cas, cela signifie «entrée standard». Il est utilisé par certains logiciels (par exemple
tar
) lorsqu'un argument de fichier est requis et que vous devez utiliser stdin à la place. Ce n'est pas une construction shell et cela dépend du programme que vous utilisez. Consultez la page de manuel en cas de doute!Dans ce cas, l'entrée standard est l'argument de l'
-f
option. Dans les cas où il-
n'est pas pris en charge, vous pouvez vous en tirer en utilisant quelque chose commetar xvf /proc/self/fd/0
outar xvf /dev/stdin
(ce dernier est largement pris en charge dans diverses unités).Ne comptez pas sur cela pour dire «entrée standard» universellement. Comme il n’est pas interprété par le shell, chaque programme est libre de le gérer à sa guise. Dans certains cas, il s’agit d’une sortie standard ou de quelque chose de complètement différent:
su
cela signifie «lancez un shell de connexion». Dans d'autres cas, ce n'est pas du tout interprété. La mémoire musculaire m'a fait créer pas mal de fichiers nommés,-
car une version d'un programme auquel j'étais habitué ne comprenait pas le tiret.la source
STDOUT
, selon le contexte./dev/stdin
ou/dev/stdout
peut être utilisé si vous voulez vraiment un flux d’entrée / sortie. Notez que c’est un flux, les programmes qui veulent chercher dans un fichier peuvent ne pas fonctionner correctement, comme ce serait le cas avec-
(par exemple, ffmpeg)bash
, le trait d'union est interprété par le shell. Reportez-vous au document Advanced Bash-Scripting Guide - Chapitre 3. Caractères spéciaux , puis recherchez le texte [tiret] ou "redirection de / vers stdin ou stdout". En utilisant,bash
vous pouvez utiliser le trait d'union dans la plupart des endroits qui attendent un nom de fichier. C'est un complément évident à <| > IMHOcat
gère-
(consultez la page de manuel). Une version de shell pouvant inclurecat
ou non, mais ce n'est pas strictement le shell entier. De plus, si le shell était manipulé-
, vous pourriez dire écho-
et cela passerait à autre chose. Au lieu de cela, il fait juste écho à un tiret (pas/dev/stdin
ou/proc/self/fd/0
). Etecho test > -
crée simplement un fichier appelé-
, de sorte qu'il ne l'utilise clairement pas non plus. Oh, et la page que vous avez listée ne dit pas qu'elle est gérée par le shell , elle dit que vous pouvez l'utiliser avec,cat
et que lesdiff
deux comprennent les tirets de manière explicite.Dans ce cas, il
-
est plutôt inutile, si vous utilisez Linux:GNU tar (la version sous Linux) accepte ses entrées à partir de l'entrée standard par défaut. Si vous ne souhaitez pas ce comportement et souhaitez passer le nom du fichier en tant qu'argument de ligne de commande, vous devez spécifier l'indicateur
f
:Donc, c'est pareil que
Ou, si l'entrée est gzippée comme dans votre exemple:
Indiquer le
f
drapeau ici n'a aucun sens , mais comme il a été spécifié, le nom de fichier doit être indiqué de manière-
à indiquer que nous voulons lire à partir de l'entrée standard (voir autre réponse). Donc, pour répéter, c'est redondant et légèrement étrange.De plus, la ligne ci-dessus peut être simplifiée car il est possible de dire à GNU tar de transmettre l’entrée par
gzip
elle-même en spécifiant lez
drapeau:- Pas besoin d'appeler
gzip
explicitement.la source
tar
a l'z
option.tar
défaut le premier lecteur de bande, pour des raisons historiques./dev/sa0
sous FreeBSD 9.0,/dev/rst0
NetBSD 6.0 et OpenBSD 5.1). La valeur par défaut d’AIX 7.1 est/dev/rmt0
. La valeur par défaut de MINIX3 est/dev/sa0
. (Dans chaque cas, j’ai vérifié la dernière version du système d’exploitation, il ne s’agit pas d’anciens ordinateurs centraux.) Solaris est configurable par le biais d’un fichier/etc
qui, par défaut, est un lecteur de bande. Les commandes tar GNU, Schilling, OSX et BusyBox sont définies par défaut sur stdin / stdout.tar
pour utiliser par défaut le deuxième lecteur de bande, pour des raisons évidentes. :)