Перенаправление вывода выполняется оболочкой , из которой вызывается команда . Итак, разбивая все на части, вот что происходит *:
-
shell вызывает sudo echo "options drm_kms_helper poll=N"
, которая выполняет команду sudo
с командной строкой echo "options drm_kms_helper poll=N"
-
sudo запрашивает пароль, открывает оболочку суперпользователя и вызывает echo "options drm_kms_helper poll=N"
, в котором выполняется команда echo
, передающая ее "options drm_kms_helper poll=N"
-
echo, работающий с привилегиями root
, выводит строку на стандартный вывод.
-
Команда echo
завершается, завершается оболочка суперпользователя, sudo
завершает
-
оболочка, из которой была вызвана команда, собирает выходные данные и пытается перенаправить ее на /etc/modprobe.d/local.conf
, которая может быть записана только root. Он получает ошибку «отклонено разрешение».
Для того, чтобы исправить это, см. ответ @shantanu.
(*) - в то время как приведенная выше последовательность помогает понять, почему команда терпит неудачу, на самом деле все происходит несколько не в порядке: исходная оболочка замечает перенаправление и пытается открыть файл для записи, прежде чем ссылаться на sudo ...
команда. При открытии файла сбой оболочка даже не вызывает команду, которая должна была записываться в файл (благодаря @PanosRontogiannis для указания этого). Р>
Вот быстрый тест:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
В вышеприведенном тесте whoami | tee who.txt
собирался создать файл с именем who.txt
, содержащий слово «root». Однако, когда выходное перенаправление выходит из строя в вызывающей оболочке, файл «who.txt» также отсутствует, поскольку команда не была вызвана.