我有一个 bash 脚本,里面有一些 scp 命令。 它工作得很好,但是,如果我尝试使用“./myscript.sh >log”重定向我的标准输出,“日志”文件中只会显示我的显式回显。 缺少 scp 输出。
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
好的,我现在该怎么办? 谢谢
最佳答案
scp
正在使用交互式终端来打印那个花哨的进度条。将该输出打印到文件根本没有意义,因此 scp
会检测其输出何时被重定向到终端以外的其他地方,并禁用此输出。
然而,有意义的是将其错误输出重定向到文件中,以防出现错误。如果需要,您可能希望禁用标准输出。
有两种可能的方法可以做到这一点。首先是通过将 stderr 和 stdout 重定向到日志文件来调用您的脚本:
./myscript.sh >log 2>&1
其次,是告诉 bash 在您的脚本中正确执行此操作:
#!/bin/sh
exec 2>&1
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
...
如果需要检查错误,执行scp命令后验证$?
为0
即可:
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
另一种选择是在您的脚本中执行 set -e
,它告诉 bash 脚本在脚本中的一个命令失败时立即报告失败:
#!/bin/bash
set -e
...
希望对您有所帮助。祝你好运!
关于Bash,标准输出重定向命令,如 scp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3890809/