Перенаправление вывода выполняется оболочкой, из которой была вызвана команда . Итак, разбивая все на кусочки, вот что происходит *:
вызывает оболочку sudo echo "options drm_kms_helper poll=N"
, которая выполняет sudo
команду с echo "options drm_kms_helper poll=N"
командной строкой
Судо запрашивает пароль, открывает суперпользователя оболочку и вызывает 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 также отсутствует, так как команда не была вызвана.
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi