我怎样才能回显函数的内容而不是它的实际 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
我正在做一个模板脚本,它将在 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