【问题标题】:Shell script: exporting variables from one shell script to another shell script not working using "source/export"Shell 脚本:将变量从一个 shell 脚本导出到另一个不使用“源/导出”的 shell 脚本
【发布时间】: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 的。
  • 顺便说一句,&lt;(),在&lt;(grep '^export .*=' test1.sh) 中使用,是一个 bash 扩展。 /bin/sh 根本不支持它;你正在做的不是从运行test1.sh 中导出你的变量,而是在不运行test1.sh 的源代码的情况下运行它,然后只执行grep 选择的行。您可以这样做,但我不会将其描述为在任何有意义的意义上将变量从一个变量“导出”到另一个变量。
  • 坦率地说,我最好的答案是“不要”。运行 grep 会降低性能,并且没有充分的理由为此付出代价 - 您最好将变量移到单独的文件中,并从需要的任何地方获取该文件。
  • 顺便说一句,另一件事是 bashism,是 source -- 要与 /bin/sh 兼容,您应该使用 dot 关键字:. vars(如果 vars 是定义它们的文件)。

标签: bash shell


【解决方案1】:

我会为查尔斯做繁重的工作:

script0: vars.sh

XX="1"
YY="2"

脚本1:test1.sh

#!/bin/sh
echo "Content-type: text/html"
echo ""

## If some content in this file not shown in the example needs the values, then:
. /path/to/vars.sh

## These lines are no longer needed
# 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
. /path/to/vars.sh

cat <<"END_HTML"
Content-type: text/html

<html>
<body>
<form action="/path/to/third/CGI/script/test5.sh" method="GET">
</form>
<div>XX =$XX</div>
</body>
</html>
END_HTML

脚本 3:test5.sh

#!/bin/sh
. /path/to/vars/sh

echo "Content-type: text/plain"
echo ""
echo "XX = $XX"

【讨论】:

  • 感谢 cmets。我尝试执行上述操作,但它没有导出变量。如果我在下面清除这些疑虑,我可能会找到一个解决方案:a)在 script1.sh 中,我有这样的值; “xx=$(cat $d | head -n 1)” & “yy=$(sed -n '3p'
  • 只有在您调用的任何外部程序也需要变量时才需要导出变量。否则,如果它们仅在源文件的脚本中使用,则不需要导出它们。
  • 谢谢格伦!但是,是的,我需要将变量导出到 script4 和 script5。并且上述程序不起作用。如果您对如何导出并将变量值从 script1 到两个脚本(script4 和 script5)有任何想法,请告诉我。上面的方法我试过了,但是不成功。
  • 您不需要 export 变量,因为 script4 和 script5 实际上是它们的来源,所以它们对于那些 shell 实例是本地的。如果没有看到您的代码,我真的无法为您提供进一步的建议。
  • 非常感谢!在我将 shebang 行更改为“bash”而不是“sh”之后,它可以工作:)。但是,这个例子有效,但我想要工作的主要任务不是。我遵循与此处相同的方法,但它不起作用。所以,我在“vars.sh”中有变量;变量示例为 --namr="$(echo "${dj}" | awk -F/ '{print $NF}')", line1="$(cat "$d" | head -n 1)" , tyu="$(echo "$line1" | awk '{print "$5}')", drf="$(ls | grep -E "modified.*${namr}.*blast-aligned-part.* mutated.pir")", hk="$hk", thr="$(sed -n '3p'
相关资源