我有一个经过许多不同检查的脚本,我使用中定义的success
,函数来清楚地显示终端上的操作结果。failure
/etc/init.d/functions
这很好用,除了在某些情况下我打印更多文本,然后显示结果框在我的文字上:
/usr/share/app/lib/lib_mylib.so lib[ OK ]o matches as expected
我希望它显示在哪里:
/usr/share/app/lib/lib_mylib.so lib_mylib.so matches as expected [ OK ]
环顾四周,我发现它/etc/init.d/functions
正在使用一个变量RES_COL
来定位打印结果字段的位置。如果/etc/sysconfig/init
存在则从RES_COL
那里获取,默认设置为 60 个字符。
export RES_COL=100
找了之后我也尝试过,/etc/init.d/functions
没有效果。此外我希望结果字段是右对齐使用终端窗口,而不必为此硬编码任何值。任何想法?
答案1
假设您正确设置了变量,该tput
命令可用于控制光标。TERM
与LINES
和COLUMNS
变量结合使用,您可以将光标定位在您想要的任何位置。
语法是:
tput cup line column
例如:
tput cup $((LINES-2)) $((COLUMNS-4));echo "[OK]"
答案2
如果您正在使用该文件,人们可能会认为这是启动过程的一部分并且TERM
尚未设置环境(使用tput
没有实际意义)。为此,它使用硬编码转义序列。
此外,RES_COL
除非使用该值,否则设置不会对您的脚本产生太大作用。仅在该文件中使用(Fedora)。
您可以添加自己的函数,将要打印的字符串传递给它,并检查要与 进行比较的长度$RES_COL
,如果更长,只需打印该函数(以完成该行),然后在下一行使用$MOVE_TO_COL
echo_success
在或中打印响应之前移动到响应列的字符串echo_failure
。
例如,您可能会调用action
:
action() {
local STRING rc
STRING=$1
echo -n "$STRING "
shift
"$@" && success $"$STRING" || failure $"$STRING"
rc=$?
echo
return $rc
}
您可以重定向命令的输出以捕获输出。这会干扰该行,但您可以从 bash 的变量rc=$?
中获取它:$PIPESTATUS
local RESULT
RESULT=$("$@" 2>&1)
rc=$PIPESTATUS
echo -n "$RESULT"
[ ${#RESULT} -ge $RES_COL ] && echo
[ $rc = 0 ] success $"$STRING" || failure $"$STRING"
进一步阅读: