我的意图是在一行中输出recursionwget日志,'状态栏'就好。 所以我组装了这个pipe道(我的wget调用有更多的select,但是我只留下了那些对于所描述的问题至关重要的东西):
wget -r -nv ftp://example.com 2>&1 | cut -c1-80 | xargs -I line echo -ne 'line 33[0Kr'
让我解释一下我的意思。 也许我的命令有问题。
-r表示“recursion下载”;
-nv使关于每个下载的消息变得简短,如:“time:URL – > local file”;
&2>1将stderrredirect到stdout,所以我可以通过pipe道处理消息。
| cut -c1-80 | cut -c1-80将输出行剪切为80个字符。 有时URL和本地文件名一起构成一个长的string,将一行分成两行或更多。 我需要它来适应一个控制台的一行。 这里只是站在80这个例子。 在我的脚本中,我用tput cols来确定控制台宽度;
| xargs -I line echo -ne 'line 33[0Kr' | xargs -I line echo -ne 'line 33[0Kr'打印上一个命令的输出并添加两个特殊字符: 33[OK – 行结束,清除行的其余部分,如果前面有任何字符输出; 和r – 回车,将光标设置到当前行的开头。
所以想要的行为是:
xargs捕获修剪过的线,并立即用特殊字符打印
所以我应该看到当前下载显示的某种状态栏。
使用PowerShell和Windows窗体插入进度条到状态栏面板
如何正确添加状态栏?
风格0x00000010的用途
获取状态栏文本
Windows 10 Mobile – 无法隐藏状态栏(StatusBar在上下文中不存在)
但! 我所看到的只是10到60秒内没有任何事情发生,然后在大约1秒内打印出所有在那段时间内完成的有关下载的消息。 他们实际上打印我想要的方式,但非常快。 然后再次暂停,另一部分消息在1秒钟内,等等。 所以一切都很好,除了立即 。
当我删除xargs部分时,消息立即显示(但不在一行)。 当我删除cut电话,他们是即时的,但有时线路断开一些真正的长URL。 如果我只从echo调用中删除特殊字符,则输出仍然是“跳跃”而不是在一行中。
为了重现这一点,你可以用任何URLreplace“ftp://example.com”(HTTP也可以),可以用来testingrecursion下载,也就是说,在FTP有很多文件和目录的情况下,如果HTTP有许多链接到有更多链接的页面(不要害怕,它可能会尝试下载所有的互联网,beacuse -r选项的默认recursion级别为5)。 如果你不能重现这一点,那么我认为这是我的分布有问题,请在下面的评论部分写下来。
PS如果您知道为wget组织状态栏的更好方法,您的意见非常受欢迎。 但是我正在学习Bash,想知道是什么原因造成了这种奇怪的行为。 也许有一些关于pipe道或echo或xargs我不知道。 所以问题是为什么这个pipe道工作如此而不是我所期望的。
不幸的是,当我尝试应用它们时,我得到了xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option 。
你必须尝试一种不同的方法,我不认为xargs是这个任务的好选择,试试awk,perl,python,ruby …
xargs会收集许多行,并且只会调用命令(在你的情况下回显)一次*。 将“-L 1”添加到xargs的参数,看看是否有帮助。
*如果命令行变得太长,xargs会使用更多的命令调用,但是尽可能多地进行分组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。