Hay una pregunta similar que trata con el escenario de 'envoltura', donde desea reemplazar, por ejemplo, cd
con 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 cd
desde mi script.
Considera esto
cd() { echo "muahaha"; }
export -f cd
Cualquier script llamado en este entorno usando cd
se 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 ( builtin
y 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.
env
no 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/sh
si este no es un shell interactivo predeterminado.
env
comando antes, como este:env -i <SCRIPT.sh>