标签: stdout

如何在解析命令的同时显示命令的输出?

我有两个命令,builddeploy. 目前我build手动运行,用我自己的眼睛解析它的输出,并使用我在输出中找到的值作为deploy. 该过程类似于:

$ build
==> amazon-ebs: amazon-ebs output will be in this color.
... hundreds of lines of output ...
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-east-1: ami-19601070

$ deploy ami-19601070
... some more output ...
Run Code Online (Sandbox Code Playgroud)

build实际上是Packer,为了精明)

我想将这两个步骤结合在一个脚本中。粗略的大纲将包括以下内容:

  • build
  • 确保退出状态是0并且输出包含字符串“AMIs was created”,否则中止
  • ami-19601070从输出中提取 AMI 编号 ( )
  • deploy ami-19601070

我试图想出将所有内容连接在一起的最佳方法,最好是使用 shell 脚本,但我一直坚持如何为两个单独的模式 grep 输出,同时理想情况下,仍然将所有 …

streaming grep shell-script stdout

0
推荐指数
1
解决办法
1016
查看次数

命令将字符泄漏到 bash

在构建一个小的 Expect 脚本时,我注意到,执行脚本后,一些字符会自动出现在 bash 的输入中。我以前在其他程序上见过这种情况,但在这里我有一些可重现的东西。

我的期望脚本如下:

#!/usr/bin/expect
spawn ssh root@[lindex $argv 0]
expect "password:"
send "[lindex $argv 1]\r"
expect "~#"
Run Code Online (Sandbox Code Playgroud)

这是结果:

user@PC:~$ expect test.exp 192.168.0.2 root
spawn ssh root@192.168.0.2
root@192.168.0.2's password:

^[[51;117Rroot@device:~# user@PC:~$ ;117R
-bash: syntax error near unexpected token `;'
user@PC:~$
Run Code Online (Sandbox Code Playgroud)

正如您在输出的第五行中看到的那样,stdout ( ^[[51;117R) 上有一些随机字符,其中一些泄漏到 shell 输入行 ( ;117R) 上。如果我在执行 Expect 脚本后按 Enter 键,bash 会尝试解释该 ( ;117R),就像我已将其输入到 bash 中一样。

我的问题是,这里发生了什么以及如何阻止它?

shell bash expect stdout stdin

0
推荐指数
1
解决办法
708
查看次数

> /dev/null 2>&1 是如何工作的?

我了解重定向输出如何> /dev/null导致它不打印到屏幕。

但由于某种原因,这并不总是足够的,有些东西仍然会被打印出来。

在这些情况下> /dev/null 2>&1就会达到预期的结果。

然而这让我有点困惑。有人能详细解释一下这是如何工作的吗?

特别令人困惑的是这&1部分。如果我看到,&我会想到“在后台运行”。不知道1是什么意思,如果是2呢?

linux io-redirection shell-script stdout stderr

0
推荐指数
1
解决办法
6417
查看次数

当标准输出通过管道传输时,程序如何输出到终端?

我被要求澄清这个问题。我不是在询问任何特定程序的行为,但我使用 ffmpeg 作为我询问的行为的示例。重申这个问题:

当一个程序通过stdout管道传输到另一个程序时,该程序如何也产生终端输出。是stderr输出流方面的唯一选择吗?

原问题:

我是一名长期的 Windows 开发人员,正在慢慢学习 Linux 以支持各种电子产品和编程爱好。我正在使用一些无头 Raspberry Pi,所以我只通过 ssh 终端与它们交互。我原以为终端输出只是stdout,实际上,当我通过Process类控制从 .NET Core 程序启动的子进程时,终端输出就是我的程序在拦截stdout流时接收到的内容。

但是我需要启动 bash 以便我可以将 ffmpeg 通过管道传输到 VLC,当我从终端“手动”执行此操作时,我意识到 ffmpeg 将处理细节写入终端,同时将数据传输到 VLC。我原以为命令行管道会重定向stdout到另一个程序的stdin.

我在使用 bash 时遇到了问题(它似乎没有将stdin数据从我的程序传递到使用bash -c "ffmpeg ... | cvlc ..."switch启动的程序),所以我正在考虑使用两个Process实例并以这种方式处理管道。

然后我想知道终端输出与管道输出的关系,以及幕后真正发生的事情。

编辑:当我写的,我忘了,我通常采集和输出都stdoutstderr使用Process类。在Windows下,stderr我的经验中很少使用,是否在Unix中stderr用于非错误终端输出可能是例行公事?只是猜测...

bash terminal pipe stdout

0
推荐指数
1
解决办法
450
查看次数

为什么我想在打印到标准输出时避免使用“printf”这种类似于回显的方式?

当我试图了解如何工作时,我编写了以下脚本printf

#!/usr/bin/bash

printf "Give me your three preferences.?
"
read p1
read p2
read p3
printf "%s\n" "${p1}" "${p2}" "${p3}"
printf "Just the same as this, \n"
printf "%s\n%s\n%s\n" "${p1}" "${p2}" "${p3}"
printf "I've found this way to be the easiest, ${p1}\n ${p2}\n ${p3}\n"
Run Code Online (Sandbox Code Playgroud)

通过反复试验,我发现第三种方法是有效的 - 尽管没有指定这个学习资源。我printf最常使用这种方式,因为它echo类似于 -。是否存在这种打印值的方式stdout不起作用的变量情况或值?为什么我想避免这种使用方式printf

bash stdout printf

0
推荐指数
1
解决办法
140
查看次数

标准输出的标准错误 - 除了重定向之外还有其他选项吗?

我对standard errorstandard output...的了解非常有限

一种常见的方法是重定向standard errorstandard output. 这是否意味着错误(通常会发生standard error)永远不会standard error因为重定向而发生?

如果这是真的,是否有任何方法可以复制standard error、重定向副本standard output并让原始文件按照standard error预期的方式定向到?

stdout stderr

-5
推荐指数
1
解决办法
161
查看次数