Может ли кто-нибудь объяснить мне разницу между >
и >>
при использовании команд оболочки?
Пример:
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) команды, и он будет наследоваться любой командой, которую разветвляет оболочка.