Dan*_*ele 7 bash redirect stdout
我有一个bash脚本,里面有一些scp命令.它的工作原理非常好,但是,如果我尝试我的标准输出重定向与" ./myscript.sh>日志 ",只有我明确的回声在"日志"文件中所示.scp输出缺失.
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
Run Code Online (Sandbox Code Playgroud)
好的,我现在该怎么办?谢谢
小智 6
scp
正在使用交互式终端打印那个花哨的进度条.将输出打印到文件根本没有意义,因此scp
检测何时将其输出重定向到除终端以外的其他位置并禁用此输出.
但是,有意义的是将错误输出重定向到文件中,以防出现错误.如果需要,您可能想要禁用标准输出.
有两种可能的方法.首先是通过将stderr和stdout重定向到日志文件来调用脚本:
./myscript.sh >log 2>&1
Run Code Online (Sandbox Code Playgroud)
其次,是告诉bash在你的脚本中执行此操作:
#!/bin/sh
exec 2>&1
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
...
Run Code Online (Sandbox Code Playgroud)
如果您需要检查错误,只是确认$?
是0
执行scp命令后:
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
RET=$?
if [ $RET -ne 0 ]; then
echo SOS 2>&1
exit $RET
fi
fi
Run Code Online (Sandbox Code Playgroud)
另一个选项是set -e
在脚本中执行,它告诉bash脚本在脚本中的一个命令失败后立即报告失败:
#!/bin/bash
set -e
...
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.祝好运!
小智 5
您只需使用以下命令测试您的 tty:
[ ~]#echo "hello" >/dev/tty
hello
Run Code Online (Sandbox Code Playgroud)
如果可行,请尝试:
[ ~]# scp <user>@<host>:<source> /dev/tty 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
这对我有用...