Articles of ioredirect

支持FD号码和文件名参数化redirect

我正在写一个shell脚本来redirect程序的STDOUT和STDERR输出。 redirect的目标是一个variables。 通常情况下,目标是一个文件,在这种情况下,以下工作正常。 simple_redirect() { myfunc=$1 myfile=$2 myfunc &>myfile } simple_redirect ls text.txt 但是,有时候我不想redirect到一个文件,而是想正常打印到STDOUT 。 如果myfile为&1为STDOUT ,我得到以下错误: $myfile: ambiguous redirect 如果我运行命令ls &>&1 ,则会看到: parse error near '&' 。 我有一个解决方法,分别redirectSTDOUT和STDERR : ls 1>&1 2>&1 。 不过,我更喜欢这个选项,因为我不得不重复使用这个variables,而且它的可读性不好。 有一个更简单的方法来做到这一点?

bash标准输出不能被redirect到文件中

我正在阅读“高级bash脚本”,在第31章中有一个问题。 我想不明白。 tail -f /var/log/msg | grep 'error' >> logfile 为什么没有什么要输出到日志文件? 你能给我一个解释吗? 先谢谢你

Linux的所有输出到文件

有什么办法告诉Linux系统把所有的输出(stdout,stderr)放到一个文件中? 无需使用redirect,pipe道或修改如何调用脚本。 只要告诉Linux使用一个文件输出。 例如:脚本test1.sh: #!/bin/bash echo "Testing 123 " 如果我运行它像“./test1.sh”(与redirect或pipe道),我想看到一个文件(/ tmp / linux_output)中的“testing123” 问题:在系统中,一个二进制文件调用了一个脚本,这个脚本调用了许多其他的脚本。 这是不可能的,所以如果我可以修改Linux把“输出”到一个文件我可以检查日志。

在Linux中查找最长的文件名

我从我的根目录search最长的文件名到最底部。 我编写了一个C程序,将计算最长的文件名的长度和名称。 但是,我不能让shell将文件名的长列表redirect到我的程序接收它的标准input。 这是我做的: ls -Rp | grep -v / | grep -v "Permission denied" | ./home/user/findlongest findlongest已被编译,我检查了我的一个IDE,以确保它正常工作。 目前没有发现运行时错误。 如何通过redirect标准input将文件名列表添加到我的“findlongest”代码中?

一个进程可以创build额外的shell可redirect的文件描述符?

一个进程“foo”是否可以写入文件描述符3,例如,在一个bash shell中可以执行的方式 foo 1>f1 2>f2 3>f3 如果是的话,你怎么写(C)?

Linux / Bash文件描述符在执行守护进程时

我正在为我正在编写的C项目编写一个服务脚本,并在启动时执行一些实用程序。 我想要使​​用日志工具捕获所有的输出。 我在/ etc / rc5 / myscript中有类似的内容 #!/bin/bash #save fd 1 in fd 3 for use later exec 3<&1 $SERVICESCRIPT | logger logging器只是从stdin读取,直到碰到EOF。 第二个脚本是检查一堆公用程序是否正在运行,并触发它自己的一些。 在这些公用事业中,有一个分叉并成为守护进程。 现在,我从脚本运行它,它inheritance了所有的脚本fds。 这会导致脚本在被调用后永远不会返回到命令行。 我试图用几种方法来解决这个问题: 首先,在我的脚本中,我已经完成了以下工作: ( exec 4<&- exec 3<&- $daemon_process ) 这应该启动一个下标,closures3和4(分别用于存储标准输出和pipe道输出)并运行程序。 但是当我试图回到命令行的时候,我仍然觉得这是一个悬而未决的问题,这使我相信pipe道并没有closures。 经过进一步调查,如果我在closures后发出回声,并将它们redirect到input到logging器的fd,我会在日志中看到它们,告诉我fd确实仍然是机智的。 如果我在c程序中closuresfds 2-4,我会看到它返回到命令行,但这是一个非常混乱和不愉快的修复。 其次我尝试了以下内容: $daemon_process 4<&- 3<&- 在调用这个程序的时候应该closuresfds,但是我看到了脚本永远不会回到命令行的结果。 当脚本手中我可以“CTRL-C”它把它回到命令行,但这绝不是一个解决scheme。 有任何想法吗? 谢谢!!!!

一个文件input到脚本中的两个程序

嗨,我有一个脚本,运行两个程序 #Script file ./prog1 ./prog2 prog1是一个C程序 #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ printf("prog1 running\n"); int tmp; scanf("%d", &tmp); printf("%d\n", tmp+10); printf("prog1 ended\n"); return 0; } 编2也是一个C程序 #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ printf("prog2 running\n"); int tmp; scanf("%d\n", &tmp); printf("%d\n", tmp+10); printf("prog2 ended\n"); return 0; } 我运行命令 ./script <文件 文件在哪里 […]

长时间运行的脚本的Unixredirect

我有一个cron工作,基本上看起来像这样: */3 * * * * ruby myscript.rb > /my/location/file.txt myscript.rb基本上是这样的: #!/usr/bin/env ruby sleep(120) puts "Hello" 所以每三分钟我就要运行一个脚本,在写入STDOUT之前运行两分钟。 (实际上,myscript.rb正在做大量的HTTP请求,而不是在睡觉,我怀疑这是重要的时间。) 奇怪的结果是,在一段时间内,/my/location/file.txt是空的。 看起来好像脚本启动,文件被清空,只有当脚本到达结尾时,才会有数据写入文件。 这不是如何* nixredirect工作,对吗?

将stdin _and_ stdoutredirect到一个pipe道

我想运行一个程序“A”,输出到另一个程序“B”的input,以及stdin去input“B”。 如果程序“A”closures,我想“B”继续运行。 我可以轻松地将输出redirect到Binput: ./a | ./b 如果我愿意,我可以将stderr结合到输出中: ./a 2>&1 | ./b 但我无法弄清楚如何将stdin合并到输出中。 我的猜测是: ./a 0>&1 | ./b 但它不起作用。 这是一个不需要我们重写任何testing程序的testing: $ echo ls 0>&1 | /bin/sh -i $ ab info.txt $ /bin/sh: Cannot set tty process group (No such process) 如果可能的话,我想这样做只在命令行上使用bashredirect(我不想写一个C程序来分离subprocess,并做任何复杂的事情,每次我想做一些stdin的redirect到pipe道)。

subprocess的asynchronous双向IOredirect

我想弄清楚一个subprocess的asynchronous双向IOredirect的一般化方法。 基本上,我想产生一个等待input的交互式subprocess,任何输出都应该被回读。 我试图通过产生一个新的Python进程来实验python.subprocess。 一个简单的例子试图实现如下 process = subprocess.Popen(['/usr/bin/python'],shell=False,stdin=subprocess.PIPE, stdout=subprocess.PIPE) while True: output = process.stdout.readline() print output input = sys.stdin.readline() process.stdin.write(input) 并执行上面的代码片断挂起没有任何输出。 我尝试使用/usr/bash和/usr/bin/irb但结果完全相同。 我的猜测是,IOredirect并不能很好地缓冲IO。 所以我的问题是,读取subprocess的输出而不刷新缓冲区或退出subprocess是否可行? 下面的post提到IPC套接字,但为此我将不得不改变subprocess,这可能是不可行的。 有没有其他方法可以实现呢? 注意***我的最终目标是创build一个可以与远程Web客户端交互的服务器REPL过程。 虽然给出的例子是Python,但我的最终目标是通过一个通用的包装器来包装所有可用的REPL。 在答案中的一些build议的帮助下,我想出了以下内容 #!/usr/bin/python import subprocess, os, select proc = subprocess.Popen(['/usr/bin/python'],shell=False,stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE) for i in xrange(0,5): inputready, outputready, exceptready = select.select([proc.stdout, proc.stderr],[proc.stdout, proc.stderr],[proc.stdout, proc.stderr],0) if not inputready: print "No Data", […]