Recientemente aprendí que puedes habilitar sudo
alias personalizados de la siguiente manera:
alias sudo='sudo ' # note: the space is required!
La razón por la que esto funcionaes el siguiente:
Si el último carácter del valor del alias es un espacio o un carácter de tabulación, también se comprueba la siguiente palabra de comando que sigue al alias para ver si hay expansión de alias.
Mi pregunta es: ¿hay alguna forma de habilitar sudo
también funciones personalizadas?
Respuesta1
En el caso general, lo que estás intentando hacer realmente no funciona.
Con los alias, prácticamente solo hay que reescribir la cadena antes de pasar la línea para su ejecución.
Así, por ejemplo, si tienes
alias sudo='sudo '
alias foo='bar baz'
luego, cuando ingresa, sudo foo
la línea de comando se reescribe sudo bar baz
yesoes entonces lo que se ejecuta. Esta es una simple reescritura de línea de comando.
Ahora las funciones son más difíciles. No son simples reescrituras, sino una evaluación completa; pueden establecer variables, cambiar directorios, abrir archivos... prácticamente lo hacencualquier cosael caparazón puede hacerlo. Y, lo que es más importante, se ejecutan en el contexto del shell actual. Cuando corres sudo myfunction
, nada de esto es posible; en particular, sudo
los comandos se ejecutan como un subproceso y, por lo tanto, no pueden afectar el shell actual.
La solución alternativa utilizada para cosas como las sudowrap
mencionadas anteriormente es intentar resolverlo automáticamente sudo bash -c 'myfunction() {...} ; myfunction'
. Esto llama explícitamente a una nueva bash
subcapa y luego ejecuta la función en esa subcapa. La llamada explícita deja claro que cosas como configurar variables y similares no funcionarán :-) Permite un subconjunto limitado de funcionalidades.
El tipo de funciones que puede llamar de esta manera puede reescribirse mejor como scripts de shell en lugar de funciones; Entonces sudo
puedes llamarlos directamente. El ejemplo dado enhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlSería más fácil si se hubiera duk
convertido a un ejecutable.
#!/bin/bash
exec du -k "$@" | sort -n
¡Eso funcionará como se esperaba!