Открывает ли bash файлы в O_APPEND при использовании «>>» в Linux?

Создание init.d сценарии недостаточно. Необходимо создать, запускают/останавливают ссылки в /etc/rc[0-9].d для надлежащего уровня выполнения.

По умолчанию Debian использует уровень выполнения 2 (настраивающийся в /etc/inittab).

Для создания соответствующих ссылок можно использовать обновление-rc.d. Выполненный

update-rc.d domotigaserver defaults

как пользователь root.

С другой стороны, можно использовать rcconf (установите его, например, apt-get install rcconf). Это предлагает хороший TUI.

Посмотрите, например, здесь для получения дополнительной информации.

38
11.05.2015, 21:32
4 ответа

Взгляды в источнике, он использует O_Append. Для Bash 4.3.30 в make_cmd.c.c Линия 710-713 Читайте:

case r_appending_to:                /* >>foo */
case r_append_err_and_out:          /* &>> filename */
  temp->flags = O_APPEND | O_WRONLY | O_CREAT;
  break;
32
27.01.2020, 19:35

Я столкнулся с этим: stroace -o spork.out bash -c "Echo 1234 >> Некоторые файл" , чтобы выяснить ваш вопрос. Это то, что я нашел:

open("some-file", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

Нет файла с именем «Некоторые файл» существовал в каталоге, в котором я запустил команду Echo .

61
27.01.2020, 19:35

Это не только сделано в Bash, это требуется стандартом.

Из одной спецификации Unix :

Прилагаемое перенаправление вывода должно вызывать файл, имя которого приводит к расширению слов, которое будет открываться для вывода на обозначенный файл дескриптора. Файл открыт, как будто Open () Функция () функция () . Если файл не существует, он будет создан.

Любая постер-совместимая оболочка, поэтому должна сделать это. На некоторых системах Unix / bin / sh может быть несоответствующей оболочкой Bourne (раковина Bourne была изначально написана до o_append , была изобретена), а имеющаяся оболочка POSIX, как правило, будет ksh , который будет доступен как SH в другом месте пути, такое как Solaris / usr / xpg4 / bin .

51
27.01.2020, 19:35

Исследуем, что использование strace на локальной (не NFS) файловой системе:

$ strace -eopen -- bash -c "echo foo >> /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

$ strace -eopen -- bash -c "echo foo > /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

Другие оболочки, а именно dash, dash, sh busybox' и mksh ведут себя аналогично.

Вариант -e open означает -e trace=open для отслеживания только системного вызова open().

19
27.01.2020, 19:35

Теги

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