En supposant file2
qu'il existe déjà, la commande
> file1 < file2 cat
semble copier le contenu de file2
to file1
.
Mais je ne peux pas comprendre cette structure.
Je comprends que "rien" est dirigé vers file1
(créer ou effacer son contenu). Ensuite, le contenu de file2
est dirigé vers file1
.
Pourquoi est cat
après file2
? comment savoir cat file2
si les opérandes ne sont pas dans le bon ordre?
shell
io-redirection
shaqed
la source
la source
Réponses:
Avant que le shell n'exécute la
cat
commande sur la ligne de commande, il recherche des redirections.Il y a deux redirections:
>file1
Cela rendra la sortie standard de la commande àfile1
.<file2
Cela rendra l'entrée standard de la commandefile2
.Le fait que ces redirections soient placées dans un emplacement insignifiant sur la ligne de commande importe peu.
est le même que
qui est le même que
etc.¹
Notez que l'
cat
utilitaire dans toutes ces instances est exécuté sans aucun argument de ligne de commande . Les redirections ne sont pas des opérandes pour lacat
commande, mais des instructions pour permettre au shell de configurer des redirections dans et hors de la commande (en connectant son entrée et sa sortie standard à des fichiers). Le shell configure les redirections avant d' appeler la commande.La différence entre
cat file
etcat <file
(ou, si l' on veut,<file cat
) est que , dans le premier cas, l'cat
utilitaire lui-même ouvre le fichier, qui est donné comme un opérande sur la ligne de commande, pour la lecture, tandis que dans le second cas, la coque aura ouvrez le fichier et connectezcat
le flux d 'entrée à it². Dans le second cas,cat
remarquerez qu’il n’a pas reçu d’opérande de fichier et basculera automatiquement en lecture depuis son entrée standard. Il s’agit d’une caractéristiquecat
et d’autres utilitaires que tous les utilitaires ne font pas.cat
lit également à partir de son entrée standard si on lui donne l'opérande-
. Encore une fois, cela n’est spécial que verscat
et pour certains autres utilitaires (c’est-à-dire que le shell ne fait pas). Pour utilisercat
un fichier dans le répertoire courant dont le nom est-
, ajoutez un chemin d'accès au nom de fichier, par exemple./-
.¹ L’ordre des redirections est toujours important dans certaines circonstances; Avec
cat <file2 >file1
, par exemple,file1
ne sera pas tronqué s'ilfile2
est inaccessible (les redirections sont analysées de gauche à droite). Le placement relatif du motcat
est cependant toujours arbitraire et n'influencera pas cela.² Voir également la question " cat donne une erreur différente lors de l'ouverture d'un fichier non existant ".
Le fait que le shell configure les redirections avant même d'exécuter la commande sur la ligne de commande explique pourquoi de telles choses échouent et que vous vous retrouvez avec un fichier de sortie vide:
Ici, le shell tronquera (vide) le fichier
file
avant d'exécutersort file
et de connectersort
la sortie standard au fichier. L'sort
utilitaire va alors ouvrirfile
et trier son contenu (ce qui n'est rien). Le résultat (rien) est transmis au flux de sortie standardfile
.Le remède dans ce cas particulier (pour trier un fichier "sur place") est
ou
ce qui est plus ou moins ce que
sort
fait lorsque vous utilisez le-o
fichier pour spécifier le nom du fichier de sortie.Sauvegardez simplement que les redirections peuvent précéder le nom réel de l’utilitaire sur la ligne de commande:
Et aussi à propos de la redirection ne faisant pas partie des opérandes de l'utilitaire:
la source
<in foo | bar >out
place tout dans un ordre logique. J'apprécie aussi beaucoup lesecho >&2 Something bad happened
erreurs générées par les scripts shell. Mais ce>out <in cat
n'est qu'un obscurcissementsort file >file
être correctement accompli?sort -o file file
.< file1 > file2 cat
serait mieux que> file2 < file1 cat
cela éviterait d'file2
être tronqué sifile1
on ne peut pas l'ouvrir.