【发布时间】:2017-08-21 17:15:37
【问题描述】:
我正在尝试将变量从一个 shell 脚本调用到另一个。我使用了“source”和“export”,但没有一个在做这项工作。提一下,它是 CGI bash 脚本。在 bash 脚本中还有“” HTML 链接到其他 CGI 脚本。例如——我就是这样做的;
脚本1:test1.sh
#!/bin/sh
echo "Content-type: text/html"
echo ""
....
export XX="1"
export YY="2"
"echo "<p><a href = "/path/to/second/CGI/script/test4.sh" >to choose click</a></p>"
脚本 2:test4.sh
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html>"
echo "<body>"
echo "<form action="/path/to/third/CGI/script/test5.sh" method="GET">"
echo "</form>"
echo "</body>"
echo "</html>"
echo "XX =$XX"
脚本 3:test5.sh
#!/bin/sh
#source <(grep '^export .*=' test1.sh)
echo "Content-type: text/html"
echo ""
echo "XX = $XX"
但它在“test5.sh”中什么也没给我
所以,我使用 HTML 从“test1.sh”调用“test4.sh”,并将“test1.sh”的所有变量导出到“test4.sh”,如上所示。所有变量都很好地导出到“test4.sh”,但变量没有从“test1.sh”导出到“test5.sh”。我也想在“test5.sh”中使用“test1.sh”的变量。同样,我在同一目录中有其他 bash 脚本,我想在其中从“test1.sh”导出变量及其值。你能告诉我我该怎么做吗?我在“test5.sh”中尝试了上面的“source”,但它不起作用。如果您需要这方面的更多信息,请告诉我。
注意:由于编程结构,我不想在“test1.sh”脚本中使用“bash test5.sh”或“./test5.sh”直接从“test1.sh”调用“test5.sh” .顺序必须是“test1.sh 将变量导出到 test4.sh 和 test5.sh”
非常感谢!丹麦
【问题讨论】:
-
请确保您的代码实际运行,如问题中所述,并且仅显示您的问题实际涉及的错误。
-
也就是说——导出的变量只从父级传给子级。这是一个硬约束,适用于在 UNIX 系统上运行的所有语言,而不是特定于 shell 的。
-
顺便说一句,
<(),在<(grep '^export .*=' test1.sh)中使用,是一个 bash 扩展。/bin/sh根本不支持它;你正在做的不是从运行test1.sh中导出你的变量,而是在不运行test1.sh的源代码的情况下运行它,然后只执行grep选择的行。您可以这样做,但我不会将其描述为在任何有意义的意义上将变量从一个变量“导出”到另一个变量。 -
坦率地说,我最好的答案是“不要”。运行
grep会降低性能,并且没有充分的理由为此付出代价 - 您最好将变量移到单独的文件中,并从需要的任何地方获取该文件。 -
顺便说一句,另一件事是 bashism,是
source-- 要与/bin/sh兼容,您应该使用 dot 关键字:. vars(如果vars是定义它们的文件)。