Hay una pregunta similar que trata con el escenario de 'envoltura', donde desea reemplazar, por ejemplo, cdcon un comando que llama al incorporado cd.
Sin embargo, a la luz de shellshock et al y sabiendo que bash importa funciones del entorno, he realizado algunas pruebas y no puedo encontrar una manera segura de llamar al builtin cddesde mi script.
Considera esto
cd() { echo "muahaha"; }
export -f cd
Cualquier script llamado en este entorno usando cdse romperá (considere los efectos de algo así cd dir && rm -rf .).
Hay comandos para verificar el tipo de comando (convenientemente llamado type) y comandos para ejecutar la versión incorporada en lugar de una función ( builtiny command). Pero, he aquí, estos pueden ser anulados usando funciones también
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Producirá lo siguiente:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
¿Hay alguna manera de forzar a bash de manera segura a usar el comando incorporado, o al menos detectar que un comando no es un incorporado, sin borrar todo el entorno?
Me doy cuenta de que si alguien controla su entorno, probablemente esté jodido de todos modos, pero al menos para los alias tiene la opción de no llamar al alias insertando un \antes.
envno se redefine como una función también. Esto es aterrador Primero pensé que los caracteres especiales ayudarían: llamar con la ruta completa que incluye /, usar .a la fuente, etc. ¡Pero esos también se pueden usar para nombres de funciones! Usted puede redefinir cualquier función que desee, pero es difícil volver a llamar al mandato original.
#/bin/shsi este no es un shell interactivo predeterminado.
envcomando antes, como este:env -i <SCRIPT.sh>