标签: pipe

为什么我不会在大多数高级语言中看到管道运营商?

在Unix shell编程中,管道操作符是一个非常强大的工具.使用一小组核心实用程序,系统语言(如C)和脚本语言(如Python),您可以构建极其紧凑且功能强大的shell脚本,这些脚本由操作系统自动并行化.

显然这是一个非常强大的编程范例,但我没有看到管道作为除shell脚本之外的任何语言的一流抽象.使用管道复制脚本功能所需的代码似乎总是非常复杂.

所以我的问题是为什么我在C#,Java等现代高级语言中看不到类似于Unix管道的东西?是否有支持一流管道的语言(除了shell脚本)?表达并发算法不是一种方便安全的方法吗?

为了防止有人提起它,我查看了F#管道转发操作符(前向管道操作符),它看起来更像是一个函数应用程序操作符.它将函数应用于数据,而不是将两个流连接在一起,据我所知,但我愿意进行更正.

后记:在做一些关于实现协同程序的研究时,我意识到有一些相似之处.在一篇博客文章中,马丁·沃尔夫描述了一个类似于我的问题,但在协程而不是管道方面.

language-agnostic shell concurrency programming-languages pipe

42
推荐指数
5
解决办法
5228
查看次数

如何制作一个可以从标准输入读取的bash功能?

我有一些脚本,用参数工作,他们工作得很好,但我想他们能够从标准输入读取,例如从一个管道,一个例子,假设这就是所谓的读:

#!/bin/bash
function read()
{
 echo $*
}

read $*
Run Code Online (Sandbox Code Playgroud)

现在这适用read "foo" "bar",但我想用它作为:

echo "foo" | read
Run Code Online (Sandbox Code Playgroud)

我该如何做到这一点?

bash stdin pipe

42
推荐指数
5
解决办法
8万
查看次数

Angular2日期管道在IE 11和edge 13/14中不起作用

我正在使用Angular 2.0 final,当我在格式字符串中添加小时和分钟时,我的日期格式不正确:

在组件的模板中,我有:

<th id="lastexecution">{{dto.LastExecution | date:'yyyy-MM-dd HH:mm:ss'}}</th>
Run Code Online (Sandbox Code Playgroud)

IE 11中的输出日期是:

2016-09-27 15:00:9/27/2016 3:53:46 PM:9/27/2016 3:53:46 PM
Run Code Online (Sandbox Code Playgroud)

使用{{dto.LastExecution | 日期: 'YYYY-MM-DD'}}

IE 11中的输出日期是正确的:

2016-09-27
Run Code Online (Sandbox Code Playgroud)

这是我在package.json中使用的组件版本:

{
  "name": "ima_sentinel",
  "version": "1.0.0",
  "description": "QuickStart package.json from the documentation, supplemented with testing support",
  "scripts": {
    "start": "tsc && concurrently \"tsc -w\" \"lite-server\" ",
    "docker-build": "docker build -t ima_sentinel .",
    "docker": "npm run docker-build && docker run -it --rm -p 3000:3000 -p 3001:3001 ima_sentinel",
    "pree2e": "npm run webdriver:update",
    "e2e": "tsc && concurrently \"http-server -s\" …
Run Code Online (Sandbox Code Playgroud)

format datetime pipe internet-explorer-11 angular

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

为什么在使用grep两次时没有显示输出?

基本上我想知道为什么这不输出任何东西:

tail --follow=name file.txt | grep something | grep something_else 
Run Code Online (Sandbox Code Playgroud)

你可以假设它应该产生输出我已经运行了另一行来确认

cat file.txt | grep something | grep something_else
Run Code Online (Sandbox Code Playgroud)

好像你不能多次输出尾巴的输出!?任何人都知道这笔交易是什么,有没有解决方案?

编辑:要回答到目前为止的问题,该文件肯定有grep应显示的内容.作为证据,如果grep是这样做的:

tail --follow=name file.txt | grep something
Run Code Online (Sandbox Code Playgroud)

输出显示正确,但如果使用它:

tail --follow=name file.txt | grep something | grep something
Run Code Online (Sandbox Code Playgroud)

没有显示输出.

如果有帮助我运行ubuntu 10.04

linux command-line grep file pipe

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

在Bash中捕获stdout和stderr

我知道这个语法

var=`myscript.sh`
Run Code Online (Sandbox Code Playgroud)

要么

var=$(myscript.sh)
Run Code Online (Sandbox Code Playgroud)

将捕获结果(stdout)myscript.sh转化为var.我可以重定向stderrstdout,如果我想同时捕获.如何将它们中的每一个保存为单独的变量?

我在这里的用例是如果返回代码非零,我想要回显stderr并禁止其他方式.可能有其他方法可以做到这一点,但这种方法似乎可行,如果它实际上是可能的.

bash stdout pipe stream stderr

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

开始显示除文件最后一行之外的所有内容:命令替换和标准I/O重定向

我一直试图让head实用程序显示除标准输入的最后一行之外的所有内容.我需要的实际代码是类似的东西cat myfile.txt | head -n $(($(wc -l)-1)).但那没用.我在达尔文/ OS X上做这个,它没有head -n -1那个可以获得类似输出的漂亮语义.

这些变化都不起作用.

cat myfile.txt | head -n $(wc -l | sed -E -e 's/\s//g')
echo "hello" | head -n $(wc -l | sed -E -e 's/\s//g')
Run Code Online (Sandbox Code Playgroud)

我测试了更多的变化,特别是发现这个工作:

cat <<EOF | echo $(($(wc -l)-1))
>Hola
>Raul
>Como Esta
>Bueno?
>EOF
3
Run Code Online (Sandbox Code Playgroud)

这里的东西也比较简单.

echo "hello world" | echo $(($(wc -w)+10))
Run Code Online (Sandbox Code Playgroud)

这个可以理解地给我一个非法的行计数错误.但它至少告诉我head程序在将内容传递给子shell /命令替换之前没有消耗标准输入,这是一种远程可能性,但我还是想排除它.

echo "hello" | head -n $(cat && echo 1)
Run Code Online (Sandbox Code Playgroud)

如何解释的行为head,并 …

unix bash pipe

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

C#Console通过管道接收输入

我知道如何使用参数编程控制台应用程序,例如:myProgram.exe param1 param2.

我的问题是,如何使我的程序与|,例如:echo"word"| myProgram.exe?

c# pipe

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

如何从stdin中提取tar存档?

我有一个大的tar文件split.是否可以cat使用管道来解压缩文件.

就像是:

cat largefile.tgz.aa largefile.tgz.ab | tar -xz
Run Code Online (Sandbox Code Playgroud)

代替:

cat largefile.tgz.aa largfile.tgz.ab > largefile.tgz
tar -xzf largefile.tgz
Run Code Online (Sandbox Code Playgroud)

我一直在四处寻找,但我找不到答案.我想看看是否有可能.

stdin pipeline pipe tar

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

如何将初始输入传递到进程中,然后进行交互?

我希望能够在启动交互式进程时注入初始命令,以便我可以执行以下操作:

echo "initial command" | INSERT_MAGIC_HERE some_tool

tool> initial command 

[result of initial command] 

tool> [now I type an interactive command]
Run Code Online (Sandbox Code Playgroud)

什么行不通:

  • 只是管道输入初始命令不起作用,因为这导致stdin没有连接到终端

  • 写入/ dev/pts/[number]将输出发送到终端,而不是输入到进程,就像它来自终端一样

什么会有缺点:

  • 创建一个分叉子命令,写入stdin,然后从自己的stdin转发所有内容.下行 - 终端控制事物(如线与字符模式)不起作用.也许我可以用代理伪终端做些什么?

  • 使用命令行选项创建xterm的修改版本(我正在为此任务启动一个),以在遇到所需的提示字符串后注入其他命令.丑陋.

  • 制作我正在尝试运行的工具的修改版本,以便它在命令行上接受初始命令.打破标准安装.

(顺便提一下,当前感兴趣的工具是android的adb shell - 我想在手机上打开一个交互式shell,自动运行命令,然后进行交互式会话)

unix linux pipe

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

在bash脚本中读取函数中的stdin

我有一些bash函数输出一些信息:

  • 发现-MODELNAME功能于爱普生PPDS
  • 发现-MODELNAME功能于三星PPDS
  • 发现-MODELNAME式-HP-PPDS
  • 等......

我一直在编写读取输出和过滤它的函数:

function filter-epson {
    find-modelname-in-epson-ppds | sed <bla-blah-blah>
}

function filter-hp {
    find-modelname-in-hp-ppds | sed <the same bla-blah-blah>
}
etc ...
Run Code Online (Sandbox Code Playgroud)

但我认为最好做这样的事情:

function filter-general {
    (somehow get input) | sed <bla-blah-blah>
}
Run Code Online (Sandbox Code Playgroud)

然后调用另一个高级函数:

function high-level-func {
    # outputs filtered information
    find-modelname-in-hp/epson/...-ppds | filter-general 
}
Run Code Online (Sandbox Code Playgroud)

如何通过最好的bash实践实现这一目标?

bash shell pipe bash-function

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