O redirecionamento de saída é feito pelo shell do qual o comando foi chamado . Então, quebrando tudo em pedaços, aqui está o que está acontecendo *:
-
o shell invoca sudo echo "options drm_kms_helper poll=N"
, que executa o comando sudo
com a linha de comando echo "options drm_kms_helper poll=N"
-
sudo pede uma senha, abre o shell do superusuário e invoca echo "options drm_kms_helper poll=N"
, que executa o comando echo
passando "options drm_kms_helper poll=N"
-
echo, executando com root
privileges, imprime a string para sua saída padrão.
O comando -
echo
termina, o shell do superusuário é encerrado, sudo
termina
-
o shell do qual o comando foi chamado coleta a saída e tenta redirecioná-la para /etc/modprobe.d/local.conf
, que é gravável somente pelo root. Obtém o erro "permissão negada".
Para as maneiras de corrigir isso, veja a resposta @shantanu.
(*) - enquanto a seqüência acima ajuda a entender porque o comando falha, na realidade as coisas acontecem um pouco fora de ordem: o shell original percebe o redirecionamento e tenta abrir o arquivo para escrita antes de invocar o sudo ...
comando. Ao abrir o arquivo, o shell nem invoca o comando que deveria gravar no arquivo (graças a @PanosRontogiannis por apontar isto).
Aqui está um teste rápido:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
No teste acima, o whoami | tee who.txt
iria criar um arquivo chamado who.txt
contendo a palavra "root". No entanto, quando o redirecionamento de saída falha no shell de chamada, o arquivo "who.txt" também está ausente porque o comando não foi chamado.