我有 main_script.sh ,会调用 sub_script 。
我在sub_script中有一个变量,我想在主脚本中访问
我尝试使用变量“export”和“env”,但是当我试图在main_script中回显它时,我没有得到值。
例如:
sub_script.sh
export a=hello
echo $a
main_script.sh
$PGMHOME/sub_script.sh > output_file
echo $a
仅供参考:sub_script.sh正在执行,因为我在output_file中获得了'a'的值 但是当我在main_script中回显a的值时,我没有得到它。
p.s:我知道我可以直接在main_sript.sh中分配变量,但这只是一个例子,我在sub_script.sh中完成了大量处理
答案 0 :(得分:1)
环境(visible-xs
- ed变量)仅“向下”传递(从父进程到子进程),而不是向上传递。
这意味着如果要从主脚本作为进程运行子脚本,则子脚本必须在某处写入名称和值,以便父进程(主脚本)可以阅读和处理它们。
有很多方法可以做到这一点,包括简单地将它们打印到标准输出并让父脚本export
成为结果:
eval
这有很多陷阱(当然,包括子脚本可以打印eval $(./sub_script)
并且主脚本会执行 - 当然子脚本可以直接执行,但它甚至更容易意外地打印坏事而不是意外地做坏事,所以这可以作为一个例子)。请注意,子脚本必须仔细引用:
rm -rf $HOME
#! /bin/sh
# sub-script
echo a=value for a
时,由于eval
在字边界上被拆分而value for a
与eval
一起设置for a
,因此失败了。子脚本必须使用更像:
a=value
以便主脚本的echo a=\'value for a\'
看到引用的作业。
如果子脚本需要将输出发送到标准输出,则需要将其变量设置写入其他位置(可能是临时文件,可能是主脚本中设置的文件描述符)。请注意,如果输出发送到文件 - 这包括stdout,那么主脚本可以仔细读取文件(而不是使用简单的eval $(./sub_script)
)。
另一个替代方案(仅在某些情况下可用,而不是所有情况下)是源来自主脚本的子脚本。这允许子脚本直接从主脚本访问所有内容。这通常是最简单的方法,因此通常是最好的方法。要获取子脚本,您可以使用eval
命令:
.
答案 1 :(得分:0)
脚本的参数传递类似于$ 1,$ 2等。您可以从sub_script.sh调用main_script.sh并再次调用main_script.sh。
main_script.sh
#!/bin/sh
echo "main_script"
./sub_script.sh "hello world!"
sub_script.sh
#!/bin/sh
if [ "${1}" = "" ]; then
echo "calling main_script"
./main_script.sh
else
echo "sub_script called with parameter ${1}"
fi
./ main_script.sh
调用main_script
main_script
用参数hello world调用sub_script!