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.
70
Réponses:
Dans le premier cas,
cat
ouvre le fichier et dans le second cas, le shell ouvre le fichier en le transmettant en tantcat
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.la source
sudo cat myfile.txt
. Maissudo cat < myfile.txt
cela ne fonctionnera pas si vous n’avez pas les privilèges pour lire le fichier.ksh93
acat
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.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’ utilisiezzsh
avec sonmultios
"zshism".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' utilisationsudo
de levercat
les privilèges « fera une grande différence de comportement, comme Thomas Dickey réponse et joint les commentaires déjà suggéré.la source
ksh
votre propre volonté et, si oui, pourquoi ?bash
,ksh93
est de loin la meilleure coquille. c'est la coquille, presque.cat < file1 > file2
a un effet très différent decat file1 > file2
celui quifile1
est illisible ou inexistant. (Cette dernière forme est tronquéefile2
, la première ne le sera pas.)cat myfile.txt
lit le fichiermyfile.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éefile.txt
par le shell, et les affiche sur une sortie standard.la source
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é.la source
cat
sera néanmoins ouvertfile1
etfile2
, même avecfile4
etfile5
dans votre troisième exemple. Il montrera seulementfile3
, resp.file6
contenu si ces instructions d'ouverture précédentes aboutissent.nous pouvons utiliser une autre commande pour remarquer la différence entre:
Sortie possible:
la commande indique le nom du fichier car elle le connaît (passé en argument).
Sortie possible:
l'entrée standard est redirigée vers le fichier food2.txt sans que la commande soit au courant.
la source