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

Réponses:

106

Dans le premier cas, catouvre le fichier et dans le second cas, le shell ouvre le fichier en le transmettant en tant catqu'entrée standard.

Techniquement, ils pourraient avoir des effets différents. Par exemple, il serait possible d'avoir une implémentation de shell plus (ou moins) privilégiée que le catprogramme. Dans ce cas, l’un pourrait ne pas ouvrir le fichier, alors que l’autre le pourrait.

Ce n'est pas le scénario habituel, mais mentionné pour indiquer que le shell et catne sont pas le même programme.

Thomas Dickey
la source
83
Oui, et par exemple, vous pouvez le faire sudo cat myfile.txt. Mais sudo cat < myfile.txtcela ne fonctionnera pas si vous n’avez pas les privilèges pour lire le fichier.
Zuazo
2
Notez que ksh93a catintégré (non activé par défaut, sauf si vous avez au /opt/ast/bindébut de votre $PATHpensée).
Stéphane Chazelas
2
Certains programmes se comportent différemment selon qu'ils obtiennent un argument de nom de fichier ou stdin. Par exemple, wcimprimera le nom de fichier avant les comptes quand un argument est donné.
Barmar
21

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

Dans le premier cas, vous vous catplaindrez et dans le dernier cas, votre shell indiquera clairement quel processus essaie d'ouvrir le fichier, catdans le premier et le shell dans le second.

$ 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 utilise ne peut pas être redirections utilisé pour imprimer le contenu de plusieurs fichiers, ce qui est après tout l'objectif initial de la cat(c. -à- chat commande enate). Notez que le shell tentera malgré tout d’ouvrir tous les fichiers passés en entrée redirigée, mais ne transmettra en réalité que le dernier à catmoins que vous ne l’ utilisiez zshavec 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, le shell catn'a aucune différence dans les droits d'accès aux fichiers, de sorte que les deux échouent de manière égale. L' utilisation sudode lever catles privilèges « fera une grande différence de comportement, comme Thomas Dickey réponse et joint les commentaires déjà suggéré.

jlliagre
la source
5
Par curiosité, utilisez-vous vraiment kshvotre propre volonté et, si oui, pourquoi ?
chat le
1
@cat - cette question est évidemment basée sur l'ignorance. construisez-le vous - même et voyez.
mikeserv
2
@mikeserv qui était censé être désinvolte, pas sérieusement grossier, mais assez correct, je suppose
Cat
2
@cat - je n'ai pas supposé le contraire. l'ignorance n'est pas une chose dont il faut avoir honte - ce n'est qu'un manque de connaissance. si vous ne comprenez pas pourquoi quelqu'un pourrait choisir d'utiliser ksh93, je ne peux que supposer que c'est parce que vous ne l'avez jamais utilisé. donc je vous recommande de le faire. sa vaut la peine d'essayer, pour être sûr. et croyez-moi quand je vous dis que, comparé à bash, ksh93est de loin la meilleure coquille. c'est la coquille, presque.
mikeserv
5
Comme @mikeserv l'a souligné par ailleurs , cat < file1 > file2a un effet très différent de cat file1 > file2celui qui file1est illisible ou inexistant. (Cette dernière forme est tronquée file2, la première ne le sera pas.)
Wildcard
7

cat myfile.txtlit le fichier myfile.txtpuis l’imprime sur la sortie standard.

cat < myfile.txtcataucun fichier à ouvrir n’est donné ici , donc, comme le font de nombreuses commandes Unix, lit les données à partir de l’entrée standard, qui y est dirigée file.txtpar le shell, et les affiche sur une sortie standard.

Hamza Abbad
la source
6

La réponse de Thomas Dickey est brillante.

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

  • cat <file1 <file2 <file3ne lira que file3, au moins en bash. (En fait, cela dépend du shell, mais la plupart des shells dupliqueront chaque fichier spécifié en stdin, ce qui entraînera l’application du dernier.)
  • cat file1 file2 file3lira tous les fichiers spécifiés de manière séquentielle (en fait, cat est une forme abrégée du mot concaténer ).
  • cat file1 file2 file3 <file4 <file5 <file6 lira uniquement fichier1, fichier2, fichier3 (en tant que cat ignore stdin lorsque les arguments de nom de fichier sont passés).
    • cat file1 file2 - file3 <file4 <file5 <file6 lira fichier1, fichier2, fichier6, fichier3 (comme un trait d'union force cat à ne pas ignorer stdin).

Et à propos des erreurs. En cas d'impossibilité d' ouvrir certains des fichiers spécifiés en tant qu'arguments (sans <), cat ignorera les fichiers en échec (avec la sortie du message pertinent vers stderr), mais lira tout de même d'autres fichiers. En cas d'impossibilité d'ouvrir au moins l'un des fichiers spécifiés en tant que redirections (avec <), shell ne démarrera même pas cat (cela se produit même pour les redirections réellement non utilisées par cat). Dans les deux cas, un code de sortie erroné sera renvoyé.

sasha
la source
1
Notez que dans votre premier exemple catsera néanmoins ouvert file1et file2, même avec file4et file5dans votre troisième exemple. Il montrera seulement file3, resp. file6contenu si ces instructions d'ouverture précédentes aboutissent.
Jlliagre
@ Jlliagre, merci, je ne le savais pas. Strace a évidemment prouvé votre correction. J'ai corrigé le texte entre parenthèses pour les cas 1 et 3a.
Sasha
0

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é 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 soit au courant.

utilisateur307770
la source