Может ли кто-нибудь объяснить мне разницу между >и >>при использовании команд оболочки?
Пример:
ps -aux > log
ps -aux >> log
Кажется, результат одинаков в любом случае.
Может ли кто-нибудь объяснить мне разницу между >и >>при использовании команд оболочки?
Пример:
ps -aux > log
ps -aux >> log
Кажется, результат одинаков в любом случае.
Ответы:
>используется для перезаписи (« clobber ») файла и >>используется для добавления в файл.
Таким образом, когда вы используете ps aux > file, вывод ps auxбудет записан, fileа если файл с именем fileуже присутствовал, его содержимое будет перезаписано.
И если вы используете ps aux >> file, вывод ps auxбудет записан, fileи если названный файл fileуже присутствовал, файл теперь будет содержать его предыдущее содержимое, а также содержимое ps aux, записанное после его более старого содержимого file.
Самое важное отличие заключается в том, что >оболочка открывает файл или файлоподобный объект с O_WRONLY|O_CREAT|O_TRUNCфлагами - файл будет создан или обрезан, если он существует, а >>файл с O_WRONLY|O_CREAT|O_APPENDфлагами будет открыт - файл будет создан или добавлен, если он существует. Это очевидно, если вы отслеживаете системные вызовы, например, с
$ 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
И с
$ 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 +++
Обратите внимание, что в обоих случаях файловый дескриптор открытого файла дублируется на файловый дескриптор 1 (stdout) команды, и он будет наследоваться любой командой, которую разветвляет оболочка.