web-dev-qa-db-fra.com

Différence entre "chat" et "chat <"

Je travaillais sur un tutoriel et j'ai vu l'utilisation des deux cat myfile.txt et cat < myfile.txt. Y a-t-il une différence entre ces deux séquences de commandes? Il semble à la fois imprimer le contenu d'un fichier dans le shell.

70
rookie

Dans le premier cas, cat ouvre le fichier et dans le second cas, le shell ouvre le fichier en le passant comme entrée standard de cat.

Techniquement, ils pourraient avoir des effets différents. Par exemple, il serait possible d'avoir une implémentation Shell plus (ou moins) privilégiée que le programme cat. Pour ce scénario, l'un pourrait ne pas ouvrir le fichier, tandis que l'autre le pourrait.

Ce n'est pas le scénario habituel, mais mentionné pour souligner que Shell et cat ne sont pas le même programme.

107
Thomas Dickey

Il n'y a pas de différence visible majeure dans votre cas de test. Le plus évident serait le message d'erreur que vous obtenez s'il n'y a pas de fichier nommé myfile.txt dans le répertoire courant, ou si vous n'êtes pas autorisé à le lire.

Dans le premier cas, cat se plaindra et dans ce dernier cas, votre Shell montrera clairement quel processus tente d'ouvrir le fichier, cat dans le premier et le Shell dans le second une.

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

Dans un cas plus général, une différence majeure est que l'utilisation des redirections ne peut pas être utilisée pour imprimer le contenu de plus d'un fichier, ce qui est après tout le but d'origine du cat (ie cat enate). Notez que le Shell tentera de toute façon d'ouvrir tous les fichiers passés en tant qu'entrée redirigée, mais ne passera que le dernier à cat sauf si vous utilisez zsh et son multios "zshism" .

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the Shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

Sur un système standard, Shell et cat n'ont aucune différence dans les droits d'accès aux fichiers, les deux réussiront ou échoueront également. L'utilisation de Sudo pour augmenter les privilèges de cat fera une grande différence de comportement, comme Thomas Dickey répond et les commentaires joints l'ont déjà suggéré.

21
jlliagre

cat myfile.txt lit le fichier myfile.txt puis l'imprime sur la sortie standard.

cat < myfile.txt ici cat ne reçoit aucun fichier à ouvrir, donc, comme de nombreuses commandes Unix, lit les données de l'entrée standard, qui y est dirigée depuis file.txt par le shell et imprime sur la sortie standard.

7
Hamza Abbad

@ Thomas Dickey la réponse est brillante.

Je veux juste ajouter quelques faits évidents sur le cas de la lecture de plusieurs fichiers (vaguement liés à votre question, mais quand même):

  • cat <file1 <file2 <file3 ne lira que le fichier 3, au moins en bash. (En fait, cela dépend de Shell, mais la plupart des shells vont dup chaque fichier spécifié à stdin, ce qui provoque le dernier effet.)
  • cat file1 file2 file3 lira tous les fichiers spécifiés séquentiellement (en fait cat est une forme abrégée du mot concaténé ).
  • cat file1 file2 file3 <file4 <file5 <file6 ne lira que les fichiers file1, file2, file3 (car cat ignore stdin lorsque les arguments de nom de fichier sont passés).
    • cat file1 file2 - file3 <file4 <file5 <file6 lira file1, file2, file6, file3 (car le trait d'union oblige cat à ne pas ignorer stdin).

Et sur les erreurs. En cas d'impossibilité de ouvrir certains fichiers spécifiés comme arguments (sans <), cat ignorera les fichiers ayant échoué (avec la sortie du message pertinent vers stderr), mais lira toujours les autres fichiers. En cas d'impossibilité d'ouvrir au moins un des fichiers spécifiés comme redirections (avec <), Shell ne démarre même pas cat (cela se produit même pour les redirections qui ne sont pas utilisées par cat). Dans les deux cas, un code de sortie erroné sera renvoyé.

6
sasha

Nous pouvons utiliser une autre commande pour remarquer la différence entre:

wc –w food2.txt

Sortie possible:

6 food2.txt

La commande indique le nom du fichier car elle le connaît (passée en argument).

wc –w < food2.txt

Sortie possible:

6

L'entrée standard est redirigée vers le fichier food2.txt sans que la commande connaisse le nom du fichier.

0
user307770