标签: pipe

为什么管道输入"读取"仅在输入"while read ..."构造时有效?

我一直在尝试从程序输出中读取环境变量的输入,如下所示:

echo first second | read A B ; echo $A-$B 
Run Code Online (Sandbox Code Playgroud)

结果是:

-
Run Code Online (Sandbox Code Playgroud)

A和B都是空的.我读到了bash在子shell中执行管道命令,并且基本上阻止了管道输入读取.但是,以下内容:

echo first second | while read A B ; do echo $A-$B ; done
Run Code Online (Sandbox Code Playgroud)

似乎工作,结果是:

first-second
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里的逻辑是什么吗?是while...... done构造中的命令实际上是在同一个shell中执行echo而不是在子shell中执行?

bash pipe while-loop piping

69
推荐指数
3
解决办法
3万
查看次数

Node.js将相同的可读流管道化为多个(可写)目标

我需要串行运行两个需要从同一个流中读取数据的命令.将流传输到另一个流后,缓冲区被清空,因此我无法再次从该流中读取数据,因此这不起作用:

var spawn = require('child_process').spawn;
var fs = require('fs');
var request = require('request');

var inputStream = request('http://placehold.it/640x360');
var identify = spawn('identify',['-']);

inputStream.pipe(identify.stdin);

var chunks = [];
identify.stdout.on('data',function(chunk) {
  chunks.push(chunk);
});

identify.stdout.on('end',function() {
  var size = getSize(Buffer.concat(chunks)); //width
  var convert = spawn('convert',['-','-scale',size * 0.5,'png:-']);
  inputStream.pipe(convert.stdin);
  convert.stdout.pipe(fs.createWriteStream('half.png'));
});

function getSize(buffer){
  return parseInt(buffer.toString().split(' ')[2].split('x')[0]);
}
Run Code Online (Sandbox Code Playgroud)

请求抱怨这个

Error: You cannot pipe after data has been emitted from the response.
Run Code Online (Sandbox Code Playgroud)

并改变inputStreamfs.createWriteStream当然会产生同样的问题.我不想写入文件,而是以某种方式重用请求生成的流(或其他任何内容).

有没有办法在完成管道后重复使用可读流?完成上述例子的最佳方法是什么?

javascript pipe stream node.js node.js-stream

65
推荐指数
4
解决办法
4万
查看次数

Python中的管道字符

|在函数调用中看到一个"管道"字符():

res = c1.create(go, come, swim, "", startTime, endTime, "OK", ax|bx)
Run Code Online (Sandbox Code Playgroud)

管道的含义是什么ax|bx

python pipe bitwise-operators

64
推荐指数
6
解决办法
4万
查看次数

管道输出到bash功能

我在bash脚本中有一个简单的函数,我想将stdout作为输入传递给它.

jc_hms(){
  printf "$1"
}
Run Code Online (Sandbox Code Playgroud)

我想以这种方式使用它.

var=`echo "teststring" | jc_hms`
Run Code Online (Sandbox Code Playgroud)

当然我使用冗余函数echo和printf来简化问题,但是你明白了.现在我得到一个"未找到"错误,我认为这意味着我的参数分隔错误("$ 1"部分).有什么建议?

最初jc_hms函数的使用方式如下:

echo `jc_hms "teststring"` > //dev/tts/0
Run Code Online (Sandbox Code Playgroud)

但是我想先将结果存储在一个变量中,然后再将其发送到串口.

编辑:所以澄清一下,我不是想把东西打印到串口,我想接口我的bash函数应该是"|" 管道人物,我想知道这是否可行.

编辑:好的,这是完整的功能.

jc_hms(){
  hr=$(($1 / 3600))
  min=$(($1 / 60))
  sec=$(($1 % 60))

  printf "$hs:%02d:%02d" $min $sec
}
Run Code Online (Sandbox Code Playgroud)

我正在使用该函数来形成一行代码

songplaytime=`echo $songtime | awk '{print S1 }'`
printstring="`jc_hms $songplaytime`"  #store resulting string in printstring
Run Code Online (Sandbox Code Playgroud)

其中$ songtime是一个以空格分隔的"playtime totaltime"表示的字符串.

我希望我可以在一行中执行此操作,并在awk之后将其管道化

printstring=`echo $songtime | awk '{print S1 }' | jc_hms`
Run Code Online (Sandbox Code Playgroud)

像这样.

linux bash pipe

64
推荐指数
5
解决办法
6万
查看次数

是否有可能从管道中读取gcc?

我正在寻找一个选项,gcc它会使它从标准输入读取一个源文件,主要是因为我可以做这样的事情从flex生成C代码的工具生成一个目标文件(flex's -t选项写入生成的C到标准输出):

flex -t lexer.l | gcc -o lexer.o -magic-option-here
Run Code Online (Sandbox Code Playgroud)

因为我并不真正关心生成的C文件.

这样的事情是存在的,还是我必须使用临时文件?

command-line gcc pipe flex-lexer

61
推荐指数
2
解决办法
2万
查看次数

如何在Go中管理几个命令?

如何在Go中将多个外部命令一起管道?我试过这段代码,但是我收到一条错误exit status 1.

package main

import (
    "io"
    "log"
    "os"
    "os/exec"
)

func main() {
    c1 := exec.Command("ls")
    stdout1, err := c1.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err = c1.Start(); err != nil {
        log.Fatal(err)
    }
    if err = c1.Wait(); err != nil {
        log.Fatal(err)
    }

    c2 := exec.Command("wc", "-l")
    c2.Stdin = stdout1

    stdout2, err := c2.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err = c2.Start(); err != nil {
        log.Fatal(err)
    }
    if …
Run Code Online (Sandbox Code Playgroud)

pipe go

61
推荐指数
5
解决办法
3万
查看次数

管道如何在Bash中工作的简单解释是什么?

我经常在Bash中使用管道,例如:

dmesg | less
Run Code Online (Sandbox Code Playgroud)

虽然我知道这是什么输出,它需要dmesg并让我滚动它less,我不明白|它在做什么.它恰恰相反>吗?

  • 对于什么有简单或隐喻的解释|
  • 在一条线路中使用多个管道时会发生什么?
  • 管道的行为在Bash脚本中出现的位置是否一致?

bash pipe

59
推荐指数
7
解决办法
5万
查看次数

如何将所有输出重定向到/ dev/null?

我想在后台运行一个程序(google-chrome),但是阻止它向终端输出任何消息.

我试过这样做:

google-chrome 2>&1 1>/dev/null &
Run Code Online (Sandbox Code Playgroud)

但是,终端仍然填满没有消息,如:

[5746:5746:0802/100534:错误:object_proxy.cc(532)]无法调用方法:org.chromium.Mtpd.EnumerateStorag ...

我究竟做错了什么?如何将所有输出重定向到/dev/null

bash pipe output-redirect dev-null

58
推荐指数
2
解决办法
6万
查看次数

我什么时候应该使用GCC的-pipe选项?

GCC 4.1.2的文件有这样说的-pipe选项:

-管

使用管道而不是临时文件进行编译的各个阶段之间的通信.这无法在汇编程序无法从管道读取的某些系统上运行; 但GNU汇编程序没有问题.

我假设我能够从错误消息中判断我的系统的汇编程序是否不支持管道,所以除了这个问题,我何时使用该选项才有意义?决定使用它应该考虑哪些因素?

gcc pipe compiler-options

56
推荐指数
5
解决办法
4万
查看次数

将多个命令传递到单个命令中

如何将多个命令的stdout传递给单个命令?

示例1:组合并排序所有三个echo命令的输出:

echo zzz; echo aaa; echo kkk
Run Code Online (Sandbox Code Playgroud)

期望的输出:

aaa
kkk
zzz
Run Code Online (Sandbox Code Playgroud)

示例2:重写以下内容,以便所有命令都使用管道在单个命令行中,而不重定向到临时文件:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
Run Code Online (Sandbox Code Playgroud)

bash shell pipe process subshell

54
推荐指数
2
解决办法
4万
查看次数