Esta otra respuesta es bueno, debería ser su primera opción, especialmente si su script B hace una cosa y lo hace bien (vea Filosofía unix ) y esta "una cosa" significa "calcular este valor variable particular".
Pero, ¿y si el propósito principal de B es imprimir algo más? ¿O incluso interactuar con el usuario? Paso adicional los datos a través de la salida estándar requieren un análisis adicional del resultado recuperado. Si es así, un canal de comunicación totalmente independiente entre B y A es altamente deseado. En su caso una comunicación es suficiente.
Un archivo temporal es, de hecho, bastante bueno para ello. Pero cuando dices
maneras feas, como escribir todas las variables que me importan en A a un archivo, el script fuente B, luego leer todo de nuevo desde el archivo y restaurar las variables en A, además de la variable establecida en B que quiero
Estás poniendo la situación al revés y es realmente feo. La forma correcta es usar un archivo para pasar esta única variable deseada.
En un:
tmpf_foo=$(mktemp)
Entonces llamas a B con "$tmpf_foo"
como un argumento de línea de comando y referirse al archivo por "$1"
en B (o por otro número, dependiendo del diseño). Esto puede no ser conveniente si B ya analiza sus argumentos de línea de comando.
Una forma alternativa es export tmpf_foo
en A y referirse al archivo como "$tmpf_foo"
en B.
Si B es una herramienta de propósito general que puede usarse no solo desde A, es bueno verificar (en B) si el archivo existe, antes de escribir en él (por ejemplo, if [ -f "$tmpf_foo" ]; then …
).
De todos modos, en B escribes tu valor deseado en el archivo. P.ej. El contenido del archivo será:
12345
Después de que B finalice correctamente, en A se recupera el valor de esta manera:
specificvariable=$(<"$tmpf_foo")
(equivalente a specificvariable=$(cat "$tmpf_foo")
pero sin cat
; aunque no portátil).
Si necesita pasar más de una variable de B a A, puede usar varias líneas y leerlas (en A) con read
. Pero si no sabe de antemano qué variables deben modificarse (o si las hay), haga que B cree líneas en el archivo para que se vea así:
specificvariable=12345
othervariable="xyz 0"
bar=baz
unset var1
Después de que B termina con éxito, en A usted obtiene el archivo:
. "$tmpf_foo"
Tenga en cuenta que puede pasar alguna ordena de esta manera (en el ejemplo anterior unset
es un comando) y se ejecutará desde dentro de A. Por esta razón, debe tener mucho cuidado al escribir en el archivo desde dentro de B y debe asegurarse de que ningún otro proceso (no autorizado) pueda inyectar cadenas al archivo.
Al final (en A) eliminas el archivo temporal con rm "$tmpf_foo"
.