有人可以举例说明declare -x会有用吗?
答案 0 :(得分:9)
declare -x FOO
与export FOO
相同。它将FOO
变量“导出”为环境变量,以便从该shell会话运行的程序可以看到它。
答案 1 :(得分:5)
可以使用声明-x而不是eval来允许将变量设置为shell的参数。例如,您可以替换极不安全的:
# THIS IS NOT SAFE while test $# -gt 0; do eval export $1 shift done
更安全:
while test $# -gt 0; do declare -x $1 shift done
顺便说一下,这个结构允许用户调用脚本:
$ ./test-script foo=bar
而不是更惯用(但有些令人困惑):
$ foo=bar ./test-script
答案 2 :(得分:2)
如果您想将变量传递给不同的程序,但又不想在父 shell 的全局范围内使用该变量(即在函数内部声明时),请使用 declare -x
。
来自 bash 帮助:
<块引用>在函数中使用时,declare
使 NAME 成为本地的,就像 local
命令。 -g
选项禁止这种行为。
-x 使名称导出
<块引用>使用 +
而不是 -
会关闭给定的属性。
因此,declare -gx NAME=X
的行为实际上与 export NAME=X
相同,但当声明语句位于函数内部时,declare -x
不会。
答案 3 :(得分:1)
@sampablokuper评论说,接受的解决方案不准确。
但是,这两个变量都将变量a
导出到子shell(在()中)。
test.sh:
#/bin/bash
foo() {
declare -x a="OK"
([ "$a" = "OK" ]) && echo "foo exported a locally"
}
bar() {
export a="OK"
([ "$a" = "OK" ]) && echo "bar exported a locally"
}
foo
echo "Global value of a by foo: ${a}"
([ "$a" = "OK" ]) && echo "foo exported a globally" \
|| echo 'foo did not export a globally'
bar
echo "Global value of a by bar: ${a}"
([ "$a" = "OK" ]) && echo "bar exported a globally" \
|| echo 'bar did not export a globally'
运行如下:
$ ./test.sh
foo exported a locally
Global value of a by foo:
foo did not export a globally
bar exported a locally
Global value of a by bar: OK
bar exported a globally