Estoy escribiendo una utilidad que necesita poder configurar y usar el contexto. Me gustaría que use variables de entorno en el shell para que pueda recordar en qué contexto se encuentra actualmente entre invocaciones. Idealmente, me gustaría configurar esta variable de entorno desde la propia utilidad. Algo como:
mytool set-context <context> mytool do-stuff # Aware of <context>Me gustaría que esto se comporte como:
export MYTOOL_CONTEXT=<context> mytool do-stuff # Aware of <context>Ahora, en realidad no es posible que un programa establezca variables de entorno en el entorno del shell de llamada (cubierto en SO aquí ). Sin embargo, ese es el tipo de comportamiento que quiero y estoy buscando una aproximación o una solución alternativa.
Algunas ideas que tenía en mente:
<context> , sino en alguna cadena derivada de ella). Eso se vería como export MYTOOL_CONTEXT=$(mytool get-context-var <context>) .$(mytool set-context <context>) , donde la salida del comando se ejecuta realmente (y la salida sería algo así como export MYTOOL_CONTEXT=<context> ).¿Alguna otra idea? ¡Gracias!
Nota : los ejemplos anteriores usan la sintaxis BASH, pero hay equivalentes en la mayoría de los shells.
Los shells POSIX ( bash , ksh , etc.) y el shell Bourne le permiten establecer variables de entorno en una línea de comandos para un solo comando:
MYTOOL_CONTEXT=<context> mytool do-stuff Esto establece MYTOOL_CONTEXT como una variable de entorno para esa invocación de mytool (solo). Por cierto, la mayoría de los shells aceptan una opción -k (que no está estandarizada por POSIX) que significa que todos los argumentos que parecen VAR=valor se tratan como variables de entorno, incluso cuando aparecen después del nombre del comando. Esta es una curiosidad con un valor práctico bastante limitado, por lo que no está estandarizada.
El comando POSIXenv está diseñado para permitirle controlar el entorno de un comando invocado, aunque se usa comúnmente sin ningún argumento para enumerar el entorno actual. Entonces, alternativamente, podrías usar:
env MYTOOL_CONTEXT=<context> mytool do-stuff La ventaja de env es que puede hacer cosas como desactivar todas las variables de entorno antes de configurar las especificadas en la línea de comando (para que tenga un control total sobre el entorno).
Si la intención es configurar el entorno para su uso posterior, entonces el archivo . comando es el que se debe usar. Puede crear un archivo, context , que contiene los comandos que se ejecutarán para configurar el entorno. Entonces puedes usar:
. context y el contenido del archivo se ejecutará en el contexto del shell actual, por lo que puede establecer variables de entorno, etc. Bash proporciona un sinónimo, source , para . dominio. Se inspiró en el shell C que no proporciona el . comando pero proporciona la source como un equivalente. El archivo nombrado como argumento del . El comando se buscará en $PATH pero no es necesario que sea ejecutable (legible es suficiente). Si proporciona argumentos adicionales, se convierten en los parámetros posicionales ( $1 , etc.) durante la duración del . dominio. Tenga en cuenta también que las variables o funciones creadas por el archivo punteado permanecen vigentes cuando finaliza el archivo (a diferencia de las variables en una secuencia de comandos normal que desaparecen cuando se completa la secuencia de comandos). Si no va a contaminar el espacio de nombres del usuario, debe tener cuidado.