我的脚本执行大量远程调用,并将屏幕上的长时间操作的进度输出到 STDOUT。我目前从远程调用中隐藏了所有 STDOUT 和 STDERR,因为我不希望它们污染我的 STDOUT 和 STDERR。
如何允许使用“ssh”从远程调用记录或重定向 STDOUT 和 STDERR 供调用我的脚本的任何人使用。我听说过文件描述符,但我似乎不明白如何实现它们。
我看过很多关于文件描述符的帖子,但从未见过像这样提供或重定向输出的帖子,所以我有点迷失了!
编辑#1
所以我现在有这段代码可以根据先前设置的变量执行远程调用。如果我执行以下操作:
remoteCall() {
(
command exec 1>&3
command exec 2>&4
${remoteCommand} $@
) &> /dev/null
}
它应该隐藏该远程调用的输出和错误,除非我将 3/4 重定向到 1/2。因此,如果有人在宏伟的计划中调用我的脚本(比这个例子大得多),除了我回显到 STDOUT 或 STDERR 的内容之外,我们永远不会看到任何内容输出到屏幕上。
如果我想使用 RemoteCall 的 STDOUT,如本例所示:
result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l")
我必须这样做吗?
result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l" 3>1)
那么结果包含行数?
答案1
如果您在脚本中这样做:
ssh host cmd >&3 2>&4
然后任何调用你的脚本的人都可以执行以下操作:
your-script > output 2> error 3> remote-output 4> remote-error
但是,如果它们不重定向 fds 3 或 4,则>&3
重定向将导致3: Bad file descriptor
致命错误。
在这种情况下,您可以默认将它们重定向到 /dev/null ,如下所示:
(
command exec >&3
command exec 2>&4
exec ssh host cmd...
) > /dev/null 2>&1
exec
在下面运行特殊的内置命令command
会取消在重定向失败时退出子 shell 的特殊效果。这些失败的重定向的错误很容易被外部丢弃> /dev/null 2>&1
。