我一直在尝试从程序输出中读取环境变量的输入,如下所示:
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中执行?
我需要串行运行两个需要从同一个流中读取数据的命令.将流传输到另一个流后,缓冲区被清空,因此我无法再次从该流中读取数据,因此这不起作用:
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当然会产生同样的问题.我不想写入文件,而是以某种方式重用请求生成的流(或其他任何内容).
有没有办法在完成管道后重复使用可读流?完成上述例子的最佳方法是什么?
我|在函数调用中看到一个"管道"字符():
res = c1.create(go, come, swim, "", startTime, endTime, "OK", ax|bx)
Run Code Online (Sandbox Code Playgroud)
管道的含义是什么ax|bx?
我在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)
像这样.
我正在寻找一个选项,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文件.
这样的事情是存在的,还是我必须使用临时文件?
如何在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) 我经常在Bash中使用管道,例如:
dmesg | less
Run Code Online (Sandbox Code Playgroud)
虽然我知道这是什么输出,它需要dmesg并让我滚动它less,我不明白|它在做什么.它恰恰相反>吗?
|?我想在后台运行一个程序(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?
在GCC 4.1.2的文件有这样说的-pipe选项:
-管
使用管道而不是临时文件进行编译的各个阶段之间的通信.这无法在汇编程序无法从管道读取的某些系统上运行; 但GNU汇编程序没有问题.
我假设我能够从错误消息中判断我的系统的汇编程序是否不支持管道,所以除了这个问题,我何时使用该选项才有意义?决定使用它应该考虑哪些因素?
如何将多个命令的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) pipe ×10
bash ×5
gcc ×2
command-line ×1
dev-null ×1
flex-lexer ×1
go ×1
javascript ×1
linux ×1
node.js ×1
piping ×1
process ×1
python ×1
shell ×1
stream ×1
subshell ×1
while-loop ×1