4

Я пытаюсь написать скрипт, который использует sed, чтобы скопировать файл по умолчанию для apache и пишет новый файл, заменив /var/www ($DOC_ROOT ниже) моим собственным каталогом, $NEW_SITES_DIR . Тем не менее, sed работает неправильно под sudo: я получаю сообщение об ошибке "Отказано в доступе" :

sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE

Я пытался порождать субоболочку

sudo sh -c "sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default > $NEW_SITE"

и использовать тройник

sudo sed -ie 's:$DOC_ROOT:$NEW_SITES_DIR:g' < default | sudo tee $NEW_SITE

но я получаю ошибку "нет входных файлов" вместо этого.

Я уверен, что последние две попытки, которые я написал, немного неудачны. Любые предложения будут ценны.


ОТВЕТЫ

Спасибо всем за вашу помощь. Вот точная команда:

sudo sed -e "s:$DEF_SITES_DIR:$NEW_SITES_DIR:g" < $DEF_SITE | sudo tee $NEW_SITE

И вот ключевая фраза из этой ссылки:

Не теряйте сон из-за этого, но когда-нибудь это пригодится, и когда вы сможете выяснить, почему «sudo» не применяется после «>» в вашей команде, запомните «ти» и возвращайтесь сюда.

1 ответ1

3

Ваша проблема в -i . Это говорит sed для редактирования файла на месте, но вы предоставляете файл на stdin, перенаправляя его. Попробуйте сбросить -i .

На самом деле нет необходимости перенаправлять входной файл, так как sed принимает имя файла в качестве аргумента. Если права на чтение файла ограничены, sudo sed (и не использует перенаправление) позаботится об этом. Если не использовать -i исходный файл останется без изменений.

sudo tee должен позаботиться о разрешениях записи для вывода, если это необходимо.

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