在我的案例中,脚本A正在调用脚本B.
现在我在我的子脚本B中声明一个变量,并希望在prent脚本中执行if else条件检查。
子脚本中的variablename
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
我无法在父脚本中排除该变量。有人可以帮忙。
答案 0 :(得分:1)
出于所有实际目的,子进程无法在父进程中设置变量。
因此,您可以使用几个选项将日志文件名从子项获取到父项:
使用.
命令(在C shell和Bash中称为source
)读取脚本B并将其作为当前shell的一部分执行。
让脚本B回显日志文件的名称。脚本A可以使用以下方法捕获它:
logfilename=$(script-b …)
这样做的主要缺点是,如果脚本B也应该生成其他输出,那么很难做到。
/tmp/tmp.file
)在多个计数上都是危险的(安全性和并发性都是问题)。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
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
生成的随机名称安全。