Je travaillais à travers un tutoriel et ai vu utiliser à la fois cat myfile.txt
et cat < myfile.txt
. Existe-t-il une différence entre ces deux séquences de commandes? Il semble que les deux imprimer le contenu d'un fichier sur le shell.
Je travaillais à travers un tutoriel et ai vu utiliser à la fois cat myfile.txt
et cat < myfile.txt
. Existe-t-il une différence entre ces deux séquences de commandes? Il semble que les deux imprimer le contenu d'un fichier sur le shell.
Réponses:
Dans le premier cas, cat
ouvre le fichier et dans le second cas, le shell ouvre le fichier en le transmettant en tant cat
qu'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 cat
programme. 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 cat
ne sont pas le même programme.
sudo cat myfile.txt
. Mais sudo cat < myfile.txt
cela ne fonctionnera pas si vous n’avez pas les privilèges pour lire le fichier.
ksh93
a cat
intégré (non activé par défaut, sauf si vous avez au /opt/ast/bin
début de votre $PATH
pensée).
wc
imprimera le nom de fichier avant les comptes quand un argument est donné.
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.txt
dans le répertoire actuel, ou si vous n'êtes pas autorisé à le lire.
Dans le premier cas, vous vous cat
plaindrez et dans le dernier cas, votre shell indiquera clairement quel processus essaie d'ouvrir le fichier, cat
dans 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 à cat
moins que vous ne l’ utilisiez zsh
avec 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 cat
n'a aucune différence dans les droits d'accès aux fichiers, de sorte que les deux échouent de manière égale. L' utilisation sudo
de lever cat
les privilèges « fera une grande différence de comportement, comme Thomas Dickey réponse et joint les commentaires déjà suggéré.
ksh
votre propre volonté et, si oui, pourquoi ?
bash
, ksh93
est de loin la meilleure coquille. c'est la coquille, presque.
cat myfile.txt
lit le fichier myfile.txt
puis l’imprime sur la sortie standard.
cat < myfile.txt
cat
aucun 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.txt
par le shell, et les affiche sur une sortie standard.
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 <file3
ne 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 file3
lira 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é.
cat
sera néanmoins ouvert file1
et file2
, même avec file4
et file5
dans votre troisième exemple. Il montrera seulement file3
, resp. file6
contenu si ces instructions d'ouverture précédentes aboutissent.
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.