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