在我的例子中,脚本 A 正在调用脚本 B。
现在我在子脚本 B 中声明一个变量,并希望在前脚本中执行 if else 条件检查。
子脚本中的变量名
logFileName=stop_log$current_date'.log'
这就是我尝试调用的方式
logFileName = os.environ["logFileName"]
export logfilename
echo $logFileName
然后进行条件检查,例如
if
logerr=`grep 'ConnectException' $logFileName`
if [ -z "$logerr" ]; then
echo " No error "
else
exit 1
fi
我无法在父脚本中导出该变量。有人可以帮忙吗?
最佳答案
出于所有实际目的,子进程无法在父进程中设置变量。
因此,您可以使用几个选项来将日志文件名从子级获取到父级:
使用
.
命令(在 C shell 和 Bash 中也称为source
)读取脚本 B 并将其作为当前 shell 的一部分执行。让脚本 B 回显日志文件的名称。脚本 A 可以使用以下方式捕获它:
logfilename=$(script-b …)
这样做的主要缺点是,如果脚本 B 也应该生成其他输出,则很难做到。
- 让脚本 B 将日志文件的名称保存在另一个文件中。通常,脚本 A 应该告诉脚本 B 将其保存在哪里。有时,您可以就某个位置达成一致,但请记住,可能会同时运行脚本的多个副本,因此固定名称(例如
/tmp/tmp.file
)对于多次计数(安全性和并发性都是问题)。
说明选项 3
脚本-A
logfilename=$(mktemp ${TMPDIR:-/tmp}/Script-A.log.XXXXXX
trap "rm -f $logfilename; exit 1" 0 1 2 3 13 15
echo "Message from Script-A" > $logfilename
Script-B $logfilename
echo "End message from Script-A" >> $logfilename
echo Log file name: $logfilename
cat $logfilename
rm -f $logfilename
trap 0
脚本-B
logfilename=${1:?}
echo "Script-B busy at work"
echo "Message for the log file" >> $logfilename # NB: >> each time
echo "Script-B wrapping up"
echo "Script-B complete" >> $logfilename
在Script-A
代码中,命令mktemp
根据给定的模板随机创建一个临时文件名。通常,模板为 /tmp/script-A.log.XXXXXX
,其中 6 个 X 将替换为随机字母或数字。 trap 命令意味着如果脚本收到信号(SIGHUP 1、SIGINT 2、SIGQUIT 3、SIGPIPE 13 或 SIGTERM 15)或退出 (0),临时文件将被删除。如果它的生命周期比 Script-A 的运行时间长,您可以忽略陷阱但回显名称。它将一条消息写入日志文件;它运行 Script-B,传递日志文件名;它写了另一条消息。然后它结束:报告文件名,显示其内容;删除文件;并取消陷阱,使其能够以状态 0(成功)退出。
Script-B
代码检查是否已给定参数 (${1:?}
) 并将其保存为变量 logfilename
>。您可以让 Script-A
导出变量,并且 Script-B
可以测试环境变量是否已设置,而不需要参数,但参数通常更好。然后,Script-B
将一条消息回显到其输出,并将另一条消息回显到日志文件(请注意,您需要附加到日志文件)。它完成它的工作(这里什么也没有);将另一条消息写入输出,并将另一条消息写入日志文件;并退出。
您可以在 Script-B 中使用许多其他特技来将消息写入日志文件,但这应该可以帮助您继续。
如果您没有 mktemp
命令,请获取其源代码(GNU 或 BSD),或使用:
logfilename=${TMPDIR:-/tmp}/Script-A.log.$$
这使用进程 ID 为您提供适度的保证,即该名称不会被其他进程使用,但它更容易确定,因此比 mktemp
生成的随机名称安全性较低.
关于shell - 将子脚本中声明的变量调用到父 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679490/