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

how can I echo the content of functions but not its actual return values

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

SCRIPT_LN=script.log
LOG_TMP(){
TMPLTE_LG=`ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print }'`
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 }'`
    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 函数,我可以在我的新脚本中看到它的原样。关于如何制作它有什么建议吗?

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

#!/bin/ksh

LOG_TMP(){
TMPLTE_LG=$(ls -lrt ${SCRIPT_LN}.log | awk -F" " '{print }')
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 }')
    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 分组操作,因此只有一行重定向 material 到输出文件。因此,我还使用 > 而不是 >> 运算符来创建输出文件。

因为我在 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 }'`
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 }'`
FUNC_LOGE_TMP=`grep -n "End of LOG_TMP" ${TMPLTE_BIN_DIR}/${TMPLTE_NAME} | head -1 | awk -F":" '{print }'`
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