查找当前标准输出或如何将输出重定向回控制台

时间:2009-08-04 07:47:26

标签: ruby linux terminal subprocess

我正在使用Ubuntu 9.04 x64和

我有一个文件 startup.rb ,我在其中调用 sudo bash ,因此我总是有一个根控制台来执行管理任务,而不是每15分钟输入一次密码左右。

此脚本由另一个脚本 Startup.rb 调用,两个文件的内容都是这样的 -

文件〜/ Startup.rb

#!/usr/bin/ruby
system "gnome-terminal --maximize -x ruby ~/startup.rb"

文件〜/ startup.rb

#!/usr/bin/ruby
`sudo some-repetitive-administrative-task`
....
....
`sudo bash` #Not using `sudo -i`, since that makes `pwd` -> /root

我已将〜/ Startup.rb 文件包含在启动应用程序列表中。

现在的问题是,在sudo bash的终端,如果我输入内容并期望输出,我就不会得到任何输出。所以,如果我写echo hello world,我就不会得到任何输出。这让我相信sudo bash命令的标准输出(stdout)控制台。

所以,我想知道为什么会这样?我怎么知道当前的stdout路径?或者如何将stdout恢复到我当前的控制台?

- 谢谢

2 个答案:

答案 0 :(得分:5)

您正在使用inapproriate方法从Ruby运行系统命令。试试这个:

#!/usr/bin/ruby

system 'bash'

您正在使用的语法(使用反引号)捕获命令的标准输出并将其以字符串形式返回。这就是你在终端上没有看到它的原因。

以下是对从Ruby运行命令的不同方法的一个很好的回顾:6 Ways to Run Shell Commands in Ruby

答案 1 :(得分:1)

如果您只对以root身份运行管理任务的简单方法感兴趣,可能还会考虑其他一些事项。

$sudo -s

这将为您提供一个shell,您可以在其中提交命令作为您的sudo'd self(假设已经设置了sudo以便您可以通过sudo运行shell)。

你可以做的另一件事,虽然在Ubuntu中并不总是被推荐或被视为好的形式,但是create a root account

$sudo passwd root

然后您可以以root身份登录并以这种方式管理。

我知道这并没有回答你关于红宝石的具体问题,但我希望你发现它有用。