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
保持为空。我在这里做错了什么?
简而言之:只需>/dev/tty
从dbbackup.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.sh
in的输出时dbbackup.sh >&/dev/null
,第二次重定向不会影响echo
命令。