web-dev-qa-db-fra.com

Utilisation du tiret (-) à la place d'un nom de fichier

Pour une commande, si vous utilisez - comme argument à la place d'un nom de fichier signifie STDIN ou STDOUT.

  1. Mais dans cet exemple, il crée un fichier avec le nom -:

    echo hello > -
    

    Comment puis-je faire - dans cet exemple signifie STDOUT?

  2. Inversement, comment puis-je faire - signifie un fichier nommé - dans des exemples tels que:

    cat -
    
121
Tim

En utilisant - comme nom de fichier pour signifier stdin/stdout est une convention que beaucoup de programmes utilisent. Ce n'est 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, - n'est pas reconnu comme un nom de fichier spécial, donc bash l'utilisera comme nom de fichier littéral.

Lorsque cat voit la chaîne - comme nom de fichier, il le traite comme synonyme de stdin. Pour contourner ce problème, vous devez modifier la chaîne que cat voit de telle manière qu'elle se réfère toujours à un fichier appelé -. La manière habituelle de procéder consiste à 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 se heurtent aux noms de fichiers, donc un fichier appelé ./-e n'apparaît pas comme -e option de ligne de commande pour un programme, par exemple.

169
camh
  1. Au lieu de echo hello > -, vous pouvez utiliser echo hello > /dev/stdout.

    Alors que '-' est une convention qui doit être implémentée par chaque programme voulant le supporter, /dev/stdin, /dev/stdout et /dev/stderr sont, lorsqu'ils sont pris en charge par le système d'exploitation (au moins Solaris, Linux et BSD), indépendants de l'application et fonctionneront alors comme vous le souhaitez.

18
jlliagre

Comme camh mentionné , - n'est qu'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 était correct en vous faisant utiliser le nom /dev/stdin ou /dev/stdout au lieu. Ces noms de fichiers devraient fonctionner n'importe où un nom de fichier normal fonctionnerait.

  1. Cela étant dit, votre premier exemple est un peu idiot. Toute sortie qui serait interceptée par l'opérateur de redirection pour écrire dans un fichier est déjà sur la sortie standard, donc la rediriger et la réécrire d'où elle vient est inutile. Le comportement que vous utilisez est le canal, pas une redirection:

    echo hello |
    
  2. Dans votre deuxième exemple, vous devez simplement donner une indication que vous voulez un fichier littéral de ce nom, pas l'alias interne qu'il possède. Vous pouvez le faire plus facilement en spécifiant un chemin d'accès au fichier comme ceci:

    cat ./-
    
10
Caleb

Quant à 1, le programme doit le soutenir. Vous ne pouvez pas simplement l'utiliser arbitrairement. Comme pour 2, redirigez les entrées de (par exemple, cat < -).

6
bahamat

L'approche "-" pose de nombreux 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 délimiteur marquant la fin des options de ligne de commande. Les programmes sont écrits pour fonctionner avec des arguments de nom de fichier, l'approche "-" est un hack, agréable mais faible.

La meilleure façon est:

$ echo hello > /dev/fd/1

/dev/stdout est un lien symbolique de /dev/fd/1

1
b3h3m0th

Les caractères spéciaux ont principalement deux significations:

Tableau numérique ASCII.

Script ou symbolique.

Il est possible qu'un seul caractère représente une chaîne ou agisse comme une chaîne. comme ma compréhension.

en langage C fopen() la fonction prend deux arguments: le premier flux de fichiers et le second mode dans lequel le fichier sera ouvert. le mode est une chaîne. même si c'est un seul caractère.

cat> "-" fonctionne.

0
Owais Qureshi