我有两个命令,build和deploy. 目前我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,为了精明)
我想将这两个步骤结合在一个脚本中。粗略的大纲将包括以下内容:
build0并且输出包含字符串“AMIs was created”,否则中止ami-19601070从输出中提取 AMI 编号 ( )deploy ami-19601070我试图想出将所有内容连接在一起的最佳方法,最好是使用 shell 脚本,但我一直坚持如何为两个单独的模式 grep 输出,同时理想情况下,仍然将所有 …
在构建一个小的 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 中一样。
我的问题是,这里发生了什么以及如何阻止它?
我了解重定向输出如何> /dev/null导致它不打印到屏幕。
但由于某种原因,这并不总是足够的,有些东西仍然会被打印出来。
在这些情况下> /dev/null 2>&1就会达到预期的结果。
然而这让我有点困惑。有人能详细解释一下这是如何工作的吗?
特别令人困惑的是这&1部分。如果我看到,&我会想到“在后台运行”。不知道1是什么意思,如果是2呢?
我被要求澄清这个问题。我不是在询问任何特定程序的行为,但我使用 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实例并以这种方式处理管道。
然后我想知道终端输出与管道输出的关系,以及幕后真正发生的事情。
编辑:当我写的,我忘了,我通常采集和输出都stdout和stderr使用Process类。在Windows下,stderr我的经验中很少使用,是否在Unix中stderr用于非错误终端输出可能是例行公事?只是猜测...
当我试图了解如何工作时,我编写了以下脚本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?
我对standard error和standard output...的了解非常有限
一种常见的方法是重定向standard error到standard output. 这是否意味着错误(通常会发生standard error)永远不会standard error因为重定向而发生?
如果这是真的,是否有任何方法可以复制standard error、重定向副本standard output并让原始文件按照standard error预期的方式定向到?