В чем разница между & ldquo; > & rdquo; и & ldquo; > & rtquo; в командной оболочке?

Может ли кто-нибудь объяснить мне разницу между > и >> при использовании команд оболочки?

Пример:

ps -aux > log
ps -aux >> log

Кажется, что результат одинаков в любом случае.

46
задан 13 July 2018 в 10:20

4 ответа

Если вы напишите в терминале

ps aux > log

Он поместит вывод ps aux в лог именованного файла.

затем, если вы поставите

ps aux >> log

, то следующий выход будет добавлен ниже первого. если вы установите только один >, он заменит предыдущий файл.

0
ответ дан 13 July 2018 в 10:20

> используется для перезаписи (« clobber ») файла, а >> используется для добавления в файл.

Таким образом, когда вы используете ps aux > file, вывод ps aux будет записан в file, а если файл с именем file уже присутствовал, его содержимое будет перезаписано.

И если вы используете ps aux >> file, вывод ps aux будет записан в file, и если файл с именем file уже присутствовал, файл теперь будет содержать свое предыдущее содержимое, а также содержимое ps aux, написанный после более старого содержания file.

0
ответ дан 13 July 2018 в 10:20
  • 1
    Я думаю, что Вам просто нужен $ (базовое имя " $ {zip_file} ") для получения то, что я хочу. – JohnnyBizzle 24 May 2015 в 18:34

Да, >> добавляет, > всегда перезаписывает / уничтожает предыдущий контент.

ps -aux > log

совпадает с

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

На Wintel это то же самое для сценариев .bat, .cmd и .ps1; общее наследие, здравый смысл.

0
ответ дан 13 July 2018 в 10:20

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

0
ответ дан 13 July 2018 в 10:20

Другие вопросы по тегам:

Похожие вопросы: