Estoy tratando de encontrar una manera de ejecutar un script de shell B desde el script A, configurar o exportar una variable en el script B, y poder almacenar ese valor en el script A después de que el script B finalice y su sub-shell vuelva.
No estoy tratando de generar el script B. Sólo quiero una variable específica. Puedo agregar cosas al script A, pero no quiero que ninguna variable esté configurada en el script B para sobrescribir nada en el script A, además de lo que estoy tratando de capturar específicamente.
Estoy seguro de que hay algunas formas feas, como escribir todas las variables que me importan en A a un archivo, el script fuente B, luego leer todo desde el archivo y restaurar las variables en A, además de la variable establecida en B lo que quiero. Estoy buscando una forma relativamente limpia y directa, si existe.
fuente
Respuestas:
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
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:
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á:
Después de que B finalice correctamente, en A se recupera el valor de esta manera:
(equivalente a
specificvariable=$(cat "$tmpf_foo")
pero sincat
; 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í:Después de que B termina con éxito, en A usted obtiene el archivo:
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"
.fuente
Escribe esa variable específica en la salida estándar, luego en A:
fuente
B.sh
, entonces ejecutas todo el comando en lugar de la suelaB.sh
, no adicionalmente. (2) Esto capturará toda la salida deB.sh
Entonces, si el script escribe más que la variable deseada, la solución no se puede aplicar fácilmente. // Si lo deseas, puedes asimilar mis comentarios en la respuesta como si fueran tuyos (es decir, sin mencionar mi entrada); Creo que esto haría que la respuesta sea aún mejor.