在Unix shell编程中,管道操作符是一个非常强大的工具.使用一小组核心实用程序,系统语言(如C)和脚本语言(如Python),您可以构建极其紧凑且功能强大的shell脚本,这些脚本由操作系统自动并行化.
显然这是一个非常强大的编程范例,但我没有看到管道作为除shell脚本之外的任何语言的一流抽象.使用管道复制脚本功能所需的代码似乎总是非常复杂.
所以我的问题是为什么我在C#,Java等现代高级语言中看不到类似于Unix管道的东西?是否有支持一流管道的语言(除了shell脚本)?表达并发算法不是一种方便安全的方法吗?
为了防止有人提起它,我查看了F#管道转发操作符(前向管道操作符),它看起来更像是一个函数应用程序操作符.它将函数应用于数据,而不是将两个流连接在一起,据我所知,但我愿意进行更正.
后记:在做一些关于实现协同程序的研究时,我意识到有一些相似之处.在一篇博客文章中,马丁·沃尔夫描述了一个类似于我的问题,但在协程而不是管道方面.
language-agnostic shell concurrency programming-languages pipe
我有一些脚本,用参数工作,他们工作得很好,但我想他们能够从标准输入读取,例如从一个管道,一个例子,假设这就是所谓的读:
#!/bin/bash
function read()
{
echo $*
}
read $*
Run Code Online (Sandbox Code Playgroud)
现在这适用read "foo" "bar",但我想用它作为:
echo "foo" | read
Run Code Online (Sandbox Code Playgroud)
我该如何做到这一点?
我正在使用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) 基本上我想知道为什么这不输出任何东西:
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
我知道这个语法
var=`myscript.sh`
Run Code Online (Sandbox Code Playgroud)
要么
var=$(myscript.sh)
Run Code Online (Sandbox Code Playgroud)
将捕获结果(stdout)myscript.sh转化为var.我可以重定向stderr到stdout,如果我想同时捕获.如何将它们中的每一个保存为单独的变量?
我在这里的用例是如果返回代码非零,我想要回显stderr并禁止其他方式.可能有其他方法可以做到这一点,但这种方法似乎可行,如果它实际上是可能的.
我一直试图让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,并 …
我知道如何使用参数编程控制台应用程序,例如:myProgram.exe param1 param2.
我的问题是,如何使我的程序与|,例如:echo"word"| myProgram.exe?
我有一个大的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)
我一直在四处寻找,但我找不到答案.我想看看是否有可能.
我希望能够在启动交互式进程时注入初始命令,以便我可以执行以下操作:
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,自动运行命令,然后进行交互式会话)
我有一些bash函数输出一些信息:
我一直在编写读取输出和过滤它的函数:
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实践实现这一目标?