我创建了两个备份脚本 - 一个用于文件(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.sh
in的输出时dbbackup.sh >&/dev/null
,第二次重定向不会影响该echo
命令。