以下Ruby方法有什么区别?
exec,system和%x()或反引号
我知道它们用于通过Ruby以编程方式执行终端命令,但我想知道为什么有三种不同的方法来执行此操作.
当我python从没有参数的终端执行" "时,它会启动Python交互式shell.
当我cat | python从终端执行" "时,它不会启动交互模式.不知何故,没有得到任何输入,它已检测到它已连接到管道.
我如何在C或C++或Qt中进行类似的检测?
我使用的各种bash命令 - 花哨的差异,构建脚本等,产生大量的颜色输出.
当我将此输出重定向到一个文件,然后cat或less更高版本的文件时,着色消失-大概B/C重定向剥离出来,告诉终端改变颜色的色码的输出的行为.
有没有办法捕获彩色输出,包括着色?
``Backtick%x{}百分比X <Backtick的替代语法system()fork()open()IO.popen()<表现相同open()open("|-")IO.popen("-")<表现相同open("|-")Open3.popen3()require 'open3'PTY.spawn()require 'pty'Shell.transact()require 'shell'编辑1. 非常感谢Avdi Grimm的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3.
他们是很好的资源来回答如何,但没有明确的组成来回答每个应该使用或为什么,并因此恕我直言这个问题不完整的答案.
基本上我想知道为什么这不输出任何东西:
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
每当我使用grep,并将其管道到其他程序时,该--color选项不受尊重.我知道我可以使用--color=always,但它也提出了一些其他命令,我想得到该命令的确切输出,如果我在tty中我将得到的输出.
所以我的问题是,是否有可能欺骗命令认为命令是在tty内运行的?
例如,跑步
grep --color word file # Outputs some colors
grep --color word file | cat # Doesn't output any colors
Run Code Online (Sandbox Code Playgroud)
我希望能够写出类似的东西:
IS_TTY=TRUE grep --color word file | cat # Outputs some colors
Run Code Online (Sandbox Code Playgroud)
这个问题似乎有一个工具,可能会做我想要的:空 - 在伪终端(PTY)下运行进程和应用程序,但从我在文档中读到的,我不确定它可以帮助我的问题
我有一个像这样的脚本:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
Run Code Online (Sandbox Code Playgroud)
问题是它将some_binary所有日志记录发送到stdout,并且缓冲使得它只能看到几行的块输出.当一些事情陷入困境时,这很烦人,我需要看看最后一行说的是什么.
有没有办法让stdout在我执行会影响some_binary的exec之前没有缓冲,所以它有更多有用的日志记录?
(包装器脚本只在exec之前设置一些环境变量,因此perl或python中的解决方案也是可行的.)
某些命令生成彩色文本以提高可读性.
我正在使用Linux.例如,当我使用rak或hg diff
输出为彩色时,为了更好的可读性.
但是,当我通过管道输出 less
hg diff | less
Run Code Online (Sandbox Code Playgroud)
颜色丢失了.
我该如何保留颜色?
谢谢!
python脚本控制Linux上的外部应用程序,通过管道将输入传递到外部应用程序stdin,并通过外部应用程序stdout的管道读取输出.
问题是对管道的写入是按块而不是按行缓冲的,因此在控制脚本通过外部应用程序中的printf接收数据输出之前会发生延迟.
无法更改外部应用程序以添加显式fflush(0)调用.