题
我正在尝试从安装脚本(使用scp)捕获输出并记录它。但是,我没有得到scp正在打印的所有内容,即进度条。
屏幕输出:
复制 / user2 / cdb / builds / tmp / uat / myfiles / * to server / users / myfiles as cdb
cdb @ server的密码: myfile 100%| ***************************** | 2503 00:00
日志输出:
复制 / user2 / cdb / builds / tmp / uat / myfiles / * to server / users / myfiles as cdb
我真的很想知道我的文件到了那里。这就是我现在尝试的无济于事:
myscript.sh 2>& 1 | tee mylogfile.log
有没有人有一个很好的方法来捕获scp输出并记录它?
感谢。
解决方案
看起来你只是想知道scp是否成功了。
我猜测滚动条不会打印到stdout并使用ncurses或其他类型的TUI?
您可以查看scp的返回值以查看它是否成功。喜欢
scp myfile user@host.com:. && echo success!
man scp
说
scp exits with 0 on success or >0 if an error occurred.
其他提示
scp使用控制代码将其进度条打印到终端。它将检测您是否重定向输出,从而省略进度条。
你可以通过欺骗scp认为它使用“脚本”在终端中运行来解决这个问题。默认情况下安装在大多数发行版上的命令:
script -q -c "scp server:/file /tmp/" > /tmp/test.txt
test.txt的内容将是:
file 0% 0 0.0KB/s --:-- ETA
file 18% 11MB 11.2MB/s 00:04 ETA
file 36% 22MB 11.2MB/s 00:03 ETA
file 54% 34MB 11.2MB/s 00:02 ETA
file 73% 45MB 11.2MB/s 00:01 ETA
file 91% 56MB 11.2MB/s 00:00 ETA
file 100% 61MB 10.2MB/s 00:06
......这可能是你想要的。
我在将交互式脚本的输出重定向到日志文件时偶然发现了这个问题。在日志中没有结果不是问题,因为您始终可以评估退出代码。但我真的希望交互式用户看到进度条。这个答案解决了这两个问题。
也许你可以使用'脚本'记录终端会话。
scp myfile user@host.com:. && echo success!
非常有用,但要将消息写入日志文件,我就像这样更改了
scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1
这将写入“myfile已成功复制!”消息到日志文件。
尝试:
scp server:/file /tmp/ > /dev/tty
我还不能发表评论:(所以我会在这里添加更新...
@Martin对我来说是最好的解决方案,虽然如果你的scp命令在你的脚本中间,那么它的输出可能出现在之后实际运行的命令之后。
我认为这是因为脚本必须在子shell中运行命令,但我还没有测试。
编辑:它确实产生了一个shell,所以如果你需要以顺序的方式运行(实际上是失败的)(比如在构建脚本中),那么你必须在脚本命令的使用周围添加一些逻辑。即
script -q -c" your command" &安培;&安培;睡1个
或类似的东西,以便你的父shell在继续之前等待子shell完成。
是的,我最近试图从proc_open()获取php脚本中的输出 我试图获得输出时失去了安静:-) 但它有点晚了,然后我在这里阅读这篇文章让我意识到我真的不需要这个垃圾输出到我的脚本
只需退出代码即可完成工作: - )
$ exit_code = proc_close($ process);
$ grep -r "Error" xyz.out > abc.txt
在上面的命令中,我将输出存储到文件abc.txt。
此 grep
命令用于在文件 xyz.out 中搜索包含错误的文本,并将输出存储在 abc.txt 没有在控制台上显示。