8

Вероятно, это дубликат, но все мои поиски вызывают вопросы об ошибках, в которых отказано в разрешении.

Я запускаю команду в оболочке bash. Я хочу перенаправить вывод, чтобы добавить к файлу, который, вероятно, не существует при первом запуске. Я хочу установить определенный режим прав доступа к файлу, если перенаправление вывода должно создать этот файл. Есть ли способ сделать это с помощью одной команды?

Например, я мог бы попробовать

foo >> /tmp/foo.log 0644

где 0644 - разрешения, которые я хочу завершить для foo.log . Большинство команд, с которыми я экспериментировал в bash, интерпретируют 0644 как дополнительный аргумент для foo .

Я получаю ощущение , что это собирается взять вторую команду chmod разрешения до или после записи в него.

Я использую GNU Bash 4.2.25 и Ubuntu 12.04, если это имеет значение - общие ответы предпочтительнее.

3 ответа3

11

Я знаю, что это старый вопрос, но я хотел добавить свои два цента.

У меня была та же идея, и я предложил решение, похожее на BowlesCR. Проблема с его решением состояла в том, что моя команда (foo) не сработала бы, если бы я изменил umask перед его запуском, так что это мое решение проблемы:

foo | ( umask 0033; cat >> /tmp/foo.log; )

Здесь umask влияет только на перенаправление на foo.log в подоболочке. Все остальное остается неизменным.

Немного запутанный, но это работает.

5

Насколько я знаю, пока нет способа сделать это, простой сценарий может быть лучшим решением.

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi
2

Без настоящих сценариев вы можете немного цепляться:

touch foo.log; chmod 0644 foo.log; foo >> foo.log

Эффективно похоже на ответ Словки, но сжато в одну строчку.

Единственное, о чем я могу думать, это возиться с маской. Лучше всего сделать это в подоболочке, чтобы она не загрязняла текущую среду:

(umask 0033 && foo >> foo.log)

Две проблемы с этим, хотя.

  1. Umask не может поднять разрешения выше уровня, указанного в системном вызове creat() (0644, по-видимому, используется Bash).
  2. Это не изменит разрешения для существующего файла (потому что вы используете оператор >> append).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .