Utilisation du tiret (-) à la place dun nom de fichier

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

  1. 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?

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

    cat - 

Commentaires

  • Puisque je dois apparemment avoir 50 réputation pour commenter directement .. Dans le commentaire / dev / stdin / dev / stdout, AIX, qui est un dérivé UNIX légitime, ne possède pas ces pseudo-périphériques. Et, comme commentaire supplémentaire, LINUX nest en aucun cas un dérivé dUNIX. Cest un système compatible POSIX, et le plus populaire des OS UNIX ‘ à ce stade, mais ne vous y trompez pas, ce nest pas UNIX. Mais lessentiel des réponses ici est correct. La notation  » –  » nest pas interprétée comme spéciale par le shell, et est donc transmise directement à chaque application individuelle en tant quARG. Si lapplication ne reconnaît pas
  • Il existe également une 2>&- construction, ce qui signifie  » close descriptor 2 « .
  • @ user95873, je suppose que vous vouliez dire: alors que Linux est semblable à Unix, tous les types Unix (ou vrai UNIX) ne sont pas Linux . La question de savoir si Linux est ou nest pas ‘ t vrai UNIX (cest-à-dire conforme à la spécification UNIX unique) na ‘ aucun rapport avec / dev / Problème std {in, out, err}. Comme / dev / std {in, out, err} est ajouté une fonctionnalité, et non manquante .

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

  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 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.

  1. 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 | 
  2. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *