Перенаправлення виводу здійснюється оболонкою, з якої викликана команда . Отже, розбиваючи все на біти, ось що відбувається *:
викликає оболонку 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якого можна записати лише корінь. Він отримує помилку "відмовлено у дозволі".
Про способи виправити це див. У відповіді @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