向脚本调用者提供附加描述符

向脚本调用者提供附加描述符

我的脚本执行大量远程调用,并将屏幕上的长时间操作的进度输出到 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

相关内容