出口是答案。
交互式exercices
由于shell是交互式的,您可以尝试内联!
$ mkdir conf && printf 'MINIENTREGA_%s="%s"\n' FECHALIMITE 2011-03-31 FICHEROS \
"informe.txt programa.c" DESTINO ./destino/entrega-prac1 >conf/prac1
$ set -- prac1
$ while read -r line; do export $line; done <"conf/$1"
bash: export: `programa.c"': not a valid identifier
$ while read -r line; do LANG=C export "$line"; done <"conf/$1"
$ echo "$MINIENTREGA_FICHEROS"
"informe.txt programa.c"
注意双引号!
源代码。
$ set -- prac1
$ . "conf/$1"
$ echo "$MINIENTREGA_FICHEROS"
informe.txt programa.c
好的,现在是关于出口的问题
导出命令告诉shell将shell变量导出到环境…因此,在使用任何子进程(如ruby, python, perl甚至其他shell脚本)之前,您必须导出脚本变量。
清除先前的操作以进行进一步演示
$ declare +x MINIENTREGA_FECHALIMITE MINIENTREGA_FICHEROS MINIENTREGA_DESTINO
$ unset MINIENTREGA_FECHALIMITE MINIENTREGA_FICHEROS MINIENTREGA_DESTINO
所以在交互式shell中,最简单的方法是运行另一个shell:
$ set -- prac1
$ . "conf/$1"
$ bash -c 'declare -p MINIENTREGA_FICHEROS'
bash: line 1: declare: MINIENTREGA_FICHEROS: not found
$ export MINIENTREGA_FECHALIMITE MINIENTREGA_FICHEROS MINIENTREGA_DESTINO
$ bash -c 'declare -p MINIENTREGA_FICHEROS'
declare -x MINIENTREGA_FICHEROS="informe.txt programa.c"
用于导出变量的示例外壳包装器
最小的包装,没有安全问题(当其他用户编辑脚本时要注意!!)。
#!/bin/sh
while IFS== read -r varname _;do
case $varname in
*[!A-Za-z0-9_]* | '' ) ;;
* ) export $varname ;;
esac
done <conf/$1
. conf/$1
busybox sh -c 'set | grep MINIENTREGA'
以prac1作为参数运行,应该产生:
MINIENTREGA_DESTINO='./destino/entrega-prac1'
MINIENTREGA_FECHALIMITE='2011-03-31'
MINIENTREGA_FICHEROS='informe.txt programa.c'
在细
获取配置文件与声明变量是一样的。
导出你的变量是一个指令,让shell在全局环境中为任何子进程共享他的变量。
这两个操作可以任意顺序进行。唯一的要求是在尝试运行任何子流程之前完成这两个操作。
你甚至可以同时进行这两种操作,通过在配置文件中导出,例如:
export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"