也许在另一边准备日志文件并将其通过管道传输到标准输出,如下所示:
ssh -n user@example.com 'x() { local ret; "$@" >&2; ret=$?; echo "[`date +%Y%m%d-%H%M%S` $ret] $*"; return $ret; };
x true
x false
x sh -c "exit 77";' > local-logfile
基本上,只需在要使用此x
包装器调用的遥控器上添加所有内容的前缀即可。它也适用于条件,因为它不会改变命令的退出代码。
您可以轻松循环此命令。
此示例将类似以下内容写入日志:
[20141218-174611 0] true
[20141218-174611 1] false
[20141218-174611 77] sh -c exit 77
当然,您可以使其更好地解析或根据您的喜好调整日志文件的外观。请注意,远程程序的未捕获法线stdout
被写入stderr
(请参阅 中的重定向x()
)。
如果您需要一个配方来捕捉和准备日志文件的命令输出,这里是来自https://gist.github.com/hilbix/c53d525f113df77e323d的此类捕捉器的副本- 但是是的,这是一个更大的样板文件“在 shell 的当前上下文中运行某些东西,后处理 stdout+stderr 而不会干扰返回代码”:
# Redirect lines of stdin/stdout to some other function
# outfn and errfn get following arguments
# "cmd args.." "one line full of output"
: catch outfn errfn cmd args..
catch()
{
local ret o1 o2 tmp
tmp=$(mktemp "catch_XXXXXXX.tmp")
mkfifo "$tmp.out"
mkfifo "$tmp.err"
pipestdinto "$1" "${*:3}" <"$tmp.out" &
o1=$!
pipestdinto "$2" "${*:3}" <"$tmp.err" &
o2=$!
"${@:3}" >"$tmp.out" 2>"$tmp.err"
ret=$?
rm -f "$tmp.out" "$tmp.err" "$tmp"
wait $o1
wait $o2
return $ret
}
: pipestdinto cmd args..
pipestdinto()
{
local x
while read -r x; do "$@" "$x" </dev/null; done
}
STAMP()
{
date +%Y%m%d-%H%M%S
}
# example output function
NOTE()
{
echo "NOTE `STAMP`: $*"
}
ERR()
{
echo "ERR `STAMP`: $*" >&2
}
catch_example()
{
# Example use
catch NOTE ERR find /proc -ls
}
有关示例,请参见倒数第二行(向下滚动)