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 auxsera écrite fileet 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 auxsera écrite fileet 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_TRUNCindicateurs - le fichier sera créé ou tronqué s'il existe, alors qu'un fichier ouvert >>avec des O_WRONLY|O_CREAT|O_APPENDindicateurs - 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.