Quelle est la différence entre ">" et ">>" dans la commande shell?

45

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.

whale_steward
la source
2
Pour plus d'informations sur certains opérateurs bash, reportez-vous également à Quelle est la différence entre <<, <<< et <<in bash?
Sergiy Kolodyazhnyy

Réponses:

48

>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.

jobin
la source
11

si vous écrivez dans le terminal

ps aux > log

Il mettra la sortie du ps auxjournal nommé fichier.

alors si vous mettez

ps aux >> log

alors la prochaine sortie sera ajoutée en dessous de la première. si vous n'en mettez qu'un seul >, le fichier précédent sera écrasé.

souravc
la source
4

Oui, >>ajoute, >écrase / détruit toujours le contenu précédent.

ps -aux > log

est le même que

rm log 2>/dev/null
ps -aux >> log

Sur Wintel est le même pour .bat, .cmdet les .ps1scripts aussi; patrimoine commun, bon sens.

Mckenzm
la source
3

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.

Sergiy Kolodyazhnyy
la source