将子脚本中声明的变量调用到父shell脚本

时间:2014-03-27 06:03:31

标签: shell variables global

在我的案例中,脚本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

我无法在父脚本中排除该变量。有人可以帮忙。

1 个答案:

答案 0 :(得分:1)

出于所有实际目的,子进程无法在父进程中设置变量。

因此,您可以使用几个选项将日志文件名从子项获取到父项:

  1. 使用.命令(在C shell和Bash中称为source)读取脚本B并将其作为当前shell的一部分执行。

  2. 让脚本B回显日志文件的名称。脚本A可以使用以下方法捕获它:

    logfilename=$(script-b …)
    

    这样做的主要缺点是,如果脚本B也应该生成其他输出,那么很难做到。

  3. 让脚本B将日志文件的名称保存在另一个文件中。通常,脚本A应该告诉脚本B保存它的位置。有时,您可以就某个位置达成一致,但请记住,可能会同时运行多个脚本副本,因此固定名称(例如/tmp/tmp.file)在多个计数上都是危险的(安全性和并发性都是问题)。

  4. 说明选项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生成的随机名称安全。