我怎样才能回显函数的内容,而不回显它的实际返回值

时间:2015-10-21 23:01:13

标签: templates unix scripting

我正在做一个模板脚本,它将在unix中创建另一个脚本。为了最小化我的代码,我正在考虑将模板脚本的功能重新用于另一个要创建的脚本。以下是我脚本的自定义部分。

SCRIPT_LN=script.log
LOG_TMP(){
TMPLTE_LG=`ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print $5}'`
if [ ${TMPLTE_LG} -gt 10000 ]; then
    mv ${SCRIPT_LN}.log ${SCRIPT_LN}.old
    if [ $? -eq 0 ]; then
        touch ${SCRIPT_LN}.log
        chmod 777 ${SCRIPT_LN}.log
    else
        echo "Error. Failed to move the log file."
        exit 1
    fi
fi
}

LOG_TMP

cat << SCRIPT_NEW >> script_new.ksh
#!/bin/ksh
#
GET_TIME() {
    SCRIPT_TM=\`date "+%m/%d/%Y %H:%M:%S"\`
}

$(LOG_TMP)
SCRIPT_NEW

这应该是成功运行模板脚本后我的script_new.ksh的内容。

#!/bin/ksh
#
GET_TIME() {
    SCRIPT_TM=\`date "+%m/%d/%Y %H:%M:%S"\`
}

LOG_TMP(){
    TMPLTE_LG=`ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print $5}'`
    if [ ${TMPLTE_LG} -gt 10000 ]; then
        mv ${SCRIPT_LN}.log ${SCRIPT_LN}.old
        if [ $? -eq 0 ]; then
            touch ${SCRIPT_LN}.log
            chmod 777 ${SCRIPT_LN}.log
        else
            echo "Error. Failed to move the log file."
            exit 1
        fi
    fi
}

我希望模板脚本和新脚本也使用LOG_TMP函数。但是,似乎在我的代码中,它只在模板脚本中工作,但无法将函数重定向到新脚本。对于GET_TIME函数,我可以在我的新脚本中看到它。有关如何制作的任何建议?

2 个答案:

答案 0 :(得分:1)

正如评论中所述,我相信typeset -f是您想要的关键。给定输入脚本script.ksh,如下所示:

#!/bin/ksh

LOG_TMP(){
TMPLTE_LG=$(ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print $5}')
if [ ${TMPLTE_LG} -gt 10000 ]; then
    mv ${SCRIPT_LN}.log ${SCRIPT_LN}.old
    if [ $? -eq 0 ]; then
        touch ${SCRIPT_LN}.log
        chmod 777 ${SCRIPT_LN}.log
    else
        echo "Error. Failed to move the log file."
        exit 1
    fi
fi
}

{
cat << 'SCRIPT_NEW'
#!/bin/ksh
#
GET_TIME() {
    SCRIPT_TM=$(date "+%m/%d/%Y %H:%M:%S")
}

SCRIPT_NEW

typeset -f LOG_TMP
} > script_new.ksh

像这样运行脚本:

$ ksh script.ksh
$

导致文件script_new.ksh包含:

#!/bin/ksh
#
GET_TIME() {
    SCRIPT_TM=$(date "+%m/%d/%Y %H:%M:%S")
}

LOG_TMP() {
    TMPLTE_LG=$(ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print $5}')
    if [ ${TMPLTE_LG} -gt 10000 ]
    then
        mv ${SCRIPT_LN}.log ${SCRIPT_LN}.old
        if [ $? -eq 0 ]
        then
            touch ${SCRIPT_LN}.log
            chmod 777 ${SCRIPT_LN}.log
        else
            echo "Error. Failed to move the log file."
            exit 1
        fi
    fi
}

当心;输出中有选项卡,输入没有,格式设置选项卡停止设置为8。

请注意,日志文件不应该是可执行的;它们不包含程序。你应该很少将日志文件公开写入;他们太重要了,不能让任何人篡改。因此,0777权限是个坏主意; 0644或0664更明智。

我还将代码更改为使用$(…)代替过时的后退标记`…`。确保生成的脚本在创建时不执行命令的最佳方法是将SCRIPT_NEW here-doc标记括在引号中,如图所示。

我还使用{ ... }作为I / O分组操作,这样只有一行将材料重定向到输出文件。因此,我还使用>而不是>>运算符来创建输出文件。

答案 1 :(得分:0)

由于我在AIX 6.1中并且我的服务器中没有typeset命令,所以我决定使用sed命令。我首先包含了我需要重定向到新脚本的函数的第一行和最后一行的指示器。然后根据行号(第一个和最后一个),我已正确识别要重定向到新脚本的行。

SCRIPT_LN=script.log
# Start of LOG_TMP
LOG_TMP(){
TMPLTE_LG=`ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print $5}'`
if [ ${TMPLTE_LG} -gt 10000 ]; then
    mv ${SCRIPT_LN}.log ${SCRIPT_LN}.old
    if [ $? -eq 0 ]; then
        touch ${SCRIPT_LN}.log
        chmod 777 ${SCRIPT_LN}.log
    else
        echo "Error. Failed to move the log file."
        exit 1
    fi
fi
}
# End of LOG_FUNC

LOG_TMP

FUNC_LOGB_TMP=`grep -n "Start of LOG_TMP" ${TMPLTE_BIN_DIR}/${TMPLTE_NAME} | head -1 | awk -F":" '{print $1}'`
FUNC_LOGE_TMP=`grep -n "End of LOG_TMP" ${TMPLTE_BIN_DIR}/${TMPLTE_NAME} | head -1 | awk -F":" '{print $1}'`
FUNC_LOGB=`expr $FUNC_LOGB_TMP + 1`
FUNC_LOGE=`expr $FUNC_LOGE_TMP - 1`

FUNC_LOG() {

sed -n ${FUNC_LOGB},${FUNC_LOGE}p ${TMPLTE_BIN_DIR}/${TMPLTE_NAME}

}

cat << SCRIPT_NEW >> script_new.ksh
#!/bin/ksh
#
GET_TIME() {
    SCRIPT_TM=\`date "+%m/%d/%Y %H:%M:%S"\`
}

$(FUNC_LOG)
SCRIPT_NEW