Quelqu'un pourrait-il m'expliquer la différence entre >
et >>
lors de l'utilisation de commandes shell?
Exemple:
ps -aux > log
ps -aux >> log
Il semble que le résultat est le même de toute façon.
Quelqu'un pourrait-il m'expliquer la différence entre >
et >>
lors de l'utilisation de commandes shell?
Exemple:
ps -aux > log
ps -aux >> log
Il semble que le résultat est le même de toute façon.
Réponses:
>
est utilisé pour écraser (“ clobber ”) un fichier et >>
est ajouté à un fichier.
Ainsi, lorsque vous utilisez ps aux > file
, la sortie de ps aux
sera écrite file
et si un fichier nommé file
était déjà présent, son contenu sera écrasé.
Et si vous utilisez ps aux >> file
, la sortie de ps aux
sera écrite file
et si le fichier nommé file
était déjà présent, le fichier contiendra maintenant son contenu précédent, ainsi que le contenu de ps aux
, écrit après son ancien contenu de file
.
La différence la plus importante est que >
shell ouvre un fichier ou un objet semblable à un fichier avec des O_WRONLY|O_CREAT|O_TRUNC
indicateurs - le fichier sera créé ou tronqué s'il existe, alors qu'un fichier ouvert >>
avec des O_WRONLY|O_CREAT|O_APPEND
indicateurs - le fichier sera créé ou ajouté s'il existe. Cela est évident si vous tracez des appels système, par exemple avec
$ strace -e open,dup2 bash -c 'true >> /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
Et avec
$ strace -e open,dup2 bash -c 'true > /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
+++ exited with 0 +++
Notez que dans les deux cas, le descripteur de fichier du fichier ouvert est dupliqué sur le descripteur de fichier 1 (stdout) de la commande et sera hérité de la commande donnée par le forks du shell.