将 /dev/tty 的输出放入变量中

将 /dev/tty 的输出放入变量中

我创建了两个备份脚本 - 一个用于文件(filebackup.sh),另一个用于数据库(dbbackup.sh)。filebackup.sh调用dbbackup.sh并将输出存储在变量中。返回的输出dbbackup.sh是脚本存储了所有备份数据库的 tar 文件名。

该脚本dbbackup.sh末尾包含以下内容:

echo $TARFILE > /dev/tty

该脚本filebackup.sh像这样调用 dbbackup.sh:

DBBACKUP="`/scripts/dbbackup.sh &>/dev/null`"

这会将脚本的所有额外输出转储到 /dev/null 并确保仅返回文件名。

一切正常,除了当我调用 filebackup.sh 时,文件名被打印到屏幕上。该变量$DBBACKUP保持为空。我在这里做错了什么?

答案1

简而言之:只需从;中删除该>/dev/tty部分即可dbbackup.sh仅使用:

echo $TARFILE

这会将 $TARFILE 打印到标准输出,即,如果您dbbackup.sh在终端中运行,则打印到屏幕;如果重定向到位,则打印到文件/管道(如 shell 反引号/$(...)扩展所发生的情况)。

即使您纠正了上述问题,该功能也无法正常工作还有另一个原因:您的dbbackup.sh脚本将 tar 文件名打印到标准输出,但在行中

DBBACKUP="`dbbackup.sh >&/dev/null`"

您将丢弃来自的任何输出dbbackup.sh(通过将其重定向到/dev/null)。如果您只想丢弃错误,请使用2>/dev/null重定向。

更长的故事:线路

echo $TARFILE > /dev/tty

将命令的输出重定向echo/dev/tty(当前进程所连接的终端),而不是打印到脚本中其他命令共享的标准输出流dbbackup.sh。因此,当您进一步重定向dbbackup.shin的输出时dbbackup.sh >&/dev/null,第二次重定向不会影响该echo命令。

您可能想阅读更多内容外壳重定向命令替换

相关内容