Bash,标准输出重定向命令,如 scp

标签 bash redirect stdout

我有一个 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/

相关文章:

java - 如何将 System.out、System.err 重定向到日志文件

bash - 使用 perl 就地替换将软链接(soft link)/符号链接(symbolic link)更改为静态文件

python - 从python在windows上找到bash可执行文件的位置

linux - bash 中的自定义命令路径错误

go - 如何重定向到另一个网页

PHP - 使用 if 条件重定向到不同的页面

python - 来自已完成子进程的 stdout.read() 有时会返回空值?

java - Bash Eval 无效命令

javascript - rails : redirect with call to Ajax

emacs - 如何在 elisp 中捕获 shell 命令的标准输出?