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

Dee*_*tal 1 io-redirection shell-script

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

该脚本最后dbbackup.sh包含以下内容:

echo $TARFILE > /dev/tty
Run Code Online (Sandbox Code Playgroud)

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

DBBACKUP="`/scripts/dbbackup.sh &>/dev/null`"
Run Code Online (Sandbox Code Playgroud)

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

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

Ric*_*rri 5

简而言之:只需>/dev/ttydbbackup.sh; 仅使用:

echo $TARFILE
Run Code Online (Sandbox Code Playgroud)

这会将 $TARFILE 打印到标准输出,即,如果您dbbackup.sh在终端中运行,则打印到屏幕,或者如果重定向到位,则打印到文件/管道(就像 shell 反引号/$(...)扩展那样)。

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

DBBACKUP="`dbbackup.sh >&/dev/null`"
Run Code Online (Sandbox Code Playgroud)

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

更长的故事:这条线

echo $TARFILE > /dev/tty
Run Code Online (Sandbox Code Playgroud)

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

您可能想阅读更多有关shell 重定向命令替换的内容