La redirección de salida la realiza el shell desde el que se ha invocado el comando . Entonces, rompiendo todo en pedazos, aquí lo que está sucediendo *:
-
shell invoca sudo echo "options drm_kms_helper poll=N"
, que ejecuta el comando sudo
con echo "options drm_kms_helper poll=N"
línea de comando
-
sudo solicita una contraseña, abre el shell del superusuario e invoca echo "options drm_kms_helper poll=N"
, que ejecuta el comando echo
pasándolo "options drm_kms_helper poll=N"
-
echo, ejecutándose con privilegios root
, imprime la cadena en su salida estándar.
El comando -
echo
finaliza, el shell del superusuario sale, sudo
termina
-
el shell desde el que se ha invocado el comando recopila el resultado e intenta redirigirlo a /etc/modprobe.d/local.conf
, que solo se puede escribir por root. Obtiene el error de "permiso denegado".
Para las formas de corregir esto, vea la respuesta @shantanu.
(*): aunque la secuencia anterior ayuda a entender por qué el comando falla, en realidad las cosas suceden un poco fuera de orden: el shell original nota la redirección e intenta abrir el archivo para escribir antes de invocar el sudo ...
mando. Al abrir el archivo falla el shell ni siquiera invoca el comando que se suponía que debía escribir en el archivo (gracias a @PanosRontogiannis para señalar esto).
Aquí hay una prueba rápida:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
En la prueba anterior, whoami | tee who.txt
iba a crear un archivo llamado who.txt
que contiene la palabra "raíz". Sin embargo, cuando la redirección de salida falla en el shell de llamada, el archivo "who.txt" también falta porque el comando no se invocó.