如何在bash中使用declare -x

时间:2011-04-26 03:44:56

标签: bash shell

有人可以举例说明declare -x会有用吗?

4 个答案:

答案 0 :(得分:9)

declare -x FOOexport 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