Может ли кто-нибудь объяснить мне разницу между >
и >>
при использовании команд оболочки?
Пример:
ps -aux > log
ps -aux >> log
Кажется, что результат одинаков в любом случае.
Если вы напишите в терминале
ps aux > log
Он поместит вывод ps aux
в лог именованного файла.
затем, если вы поставите
ps aux >> log
, то следующий выход будет добавлен ниже первого. если вы установите только один >
, он заменит предыдущий файл.
>
используется для перезаписи (« clobber ») файла, а >>
используется для добавления в файл.
Таким образом, когда вы используете ps aux > file
, вывод ps aux
будет записан в file
, а если файл с именем file
уже присутствовал, его содержимое будет перезаписано.
И если вы используете ps aux >> file
, вывод ps aux
будет записан в file
, и если файл с именем file
уже присутствовал, файл теперь будет содержать свое предыдущее содержимое, а также содержимое ps aux
, написанный после более старого содержания file
.
Да, >>
добавляет, >
всегда перезаписывает / уничтожает предыдущий контент.
ps -aux > log
совпадает с
rm log 2>/dev/null
ps -aux >> log
На Wintel это то же самое для сценариев .bat
, .cmd
и .ps1
; общее наследие, здравый смысл.
Самое важное отличие состоит в том, что >
заставляет оболочку открывать файл или подобный файлу объект с флагами 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) команды, и это будет наследоваться любой командой, которую разветвляет оболочка.