Mi .bashrc tenía un código repetitivo, así que usé una función para simplificarlo
do_stuff() {
local version=$1
export FOO_${version}_X="17"
export FOO_${version}_Y="42"
}
do_stuff '5.1'
do_stuff '5.2'
Sin embargo, ahora cuando uso mi shell, el nombre "do_stuff" está dentro del alcance, por lo que puedo completar con pestañas y ejecutar esa función (potencialmente desordenando mis variables de entorno). ¿Hay alguna manera de hacer que "do_stuff" sea visible solo dentro del .bashrc?
()
para hacer una subshell. Otra posibilidad para casos simples es usar unfor version in 5.1 5.2
bucle, aunque esto permiteversion
escapar.Respuestas:
Use
unset
como última línea en su.bashrc
:eliminará / desarmará la función
do_stuff
.Para borrar / desarmar las variables, invoca de la siguiente manera:
fuente
if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi
.do_stuff
se usa dentro de otra función. Cuando llame a esa función, obtendrábash: do_stuff: command not found
. Sé que este no es el caso exacto del que hablaba el operador, pero vale la pena señalarlo.La otra opción es usar guiones bajos como en otros lenguajes de script para indicar que no tiene la intención de que esta función sea pública. La probabilidad de que escribas _do_foo es bastante pequeña y es poco probable que entre en conflicto con alguien más.
fuente
La única solución que se me ocurre es subrayarlo y darle un nombre bastante único, tal vez incluso el espacio de nombres con puntos como un lenguaje elegante ( pero esto no funcionará en los viejos tiempos
sh
).Diablos, esto no tendrá ningún conflicto:
fuente
Como se sugiere en un comentario, puede usar una subshell:
Construimos otro script en la salida estándar de la subshell para el único efecto secundario que deseamos (usando el
here
documento<<SIDE
). Luego nos abastecemos con.
.El poder de 'mise en abime'
sh
es una fuente aterradora de asombro.fuente