`

Java/Ruby/C程序调用Shell脚本的方法

 
阅读更多

JAVA中

protected void onPostExecute(Integer result) {
   if (bBackground) {
    // 启动安装程序
    if (0 == result) {
     String path = FileUtils.getSDPATH(HActivity.this)
       + "mapp.apk";
     chmod("777", path);
     File apkFile = new File(path);
     if (apkFile.exists()) {
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.fromFile(apkFile),
        "application/vnd.android.package-archive");
      startActivity(intent);
     }
    }
   } else {
    resultFile(result);
   }
  }
 
 
private static void chmod(String permission, String path) {
  try {
   String command = "chmod " + permission + " " + path;
   Runtime runtime = Runtime.getRuntime();
   runtime.exec(command);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 

 

 

在Linux环境下工作的话,Shell脚本是经常用到,在很多其他 程序中都有可能调用到。被人问到,怎样在Ruby程序中调用Shell脚本;经过总结整理,我分别说明一下如何在Ruby、C、Java代码中怎样调用 shell脚本吧。

Ruby中调用Shell有很多种方 法;下面代码简单说明一下吧。

// 第一种 用反引号将shell命令引起来,如果是shell脚本可写上绝对路径(总之就是可以直接运行的)
ipinfo=`ifconfig`
puts ipinfo

// 第二种 用system函数来实现
system 'echo "hello $HOSTNAME"'

// 第三种 用IO类的popen方法
IO.popen("date") { |f| puts f.gets }

// 第四种 用Ruby标准库open3中的方法
require "open3"
stdin, stdout, stderr = Open3.popen3('date')
stdin.puts('')
stdout.gets
stderr.gets
其实还有其他一些方式,这里有篇博客写了Ruby调用shell的六种方法:
http://blackanger.blog.51cto.com/140924/43730

C程序中调用shell脚本,一般通过system函数来执行shell脚本。参考代 码如下:
#include   <stdlib.h>
int main(int argc, char* argv[])
{
    system("echo 'hello world'");
    system("/bin/ls /home");
}
更多详细内容,可查一下system函数的用法。

Java中调用Shell脚本,一般通过运行时类Runtime的方法来实现 (Runtime.getRuntime().exec),参考代码如下:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class CallShell {
    public static void main(String[] args) {
        try {
            // 被注释掉的这个仅仅是执行了test.sh脚本,但没有获取它的输出
            // Runtime.getRuntime().exec("/home/master/workspace/shell/test.sh");
            Process process = Runtime.getRuntime().exec(
                    "/home/master/workspace/shell/test.sh");
            InputStreamReader ir = new InputStreamReader(process
                    .getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            String line;
            while ((line = input.readLine()) != null)
                System.out.println(line);
            input.close();
            ir.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

另外,再附带贴一个,Java调用 Shell并打印标准输出、标准错误的Java类,代码如下,供参考:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @className ShellCmdLog.java
 * @author 笑遍世界
 * @description Java程序调用一个系统的shell脚本,并且将标准输出和标准错误打印出来
 * @date 2010-11-26
*/
public class ShellCmdLog extends Thread {
    private boolean bLog2Error; // 是否打印错误Error标志
    private InputStream ins; // 待转换文件输入流

    /**
     * @param args
     */
    public static void main(String[] args) {
        // java调用shell脚本
        String path = "/home/master/workspace/shell/test.sh";// 脚本位于服务器中的路径
        String statement[] = { "/bin/sh", path };
        try {
            Process process = Runtime.getRuntime().exec(statement);
            InputStream in = process.getInputStream(); // 获取输入流
            InputStream err = process.getErrorStream();// 获取错误流

            ShellCmdLog sgStdout = new ShellCmdLog(in, false);
            ShellCmdLog sgStderr = new ShellCmdLog(err, true);

            sgStdout.start();
            sgStderr.start();

            // final int result = process.waitFor();

            // 为流读出捕获流设定的时间间隔。
            Thread.sleep(100);

            if (process != null) {
                process.destroy();
            }

            // 集合读取线程
            sgStdout.join();
            sgStderr.join();

        } catch (Exception e) {
            e.toString();
        }
    }

    /**
     * 设置是否打印错误Error,设置待转换文件的输入流
     * 
     * @param is
     *            待转换文件输入流
     * @param flag
     *            是否打印错误Error标志
     */
    
    public ShellCmdLog(InputStream is, boolean flag) {
        super("ShellCmdStream" + (flag ? "-error" : "-out"));
        bLog2Error = flag;
        ins = is;
    }

    /**
     * 执行转换线程
     */
    public void run() {
        if (ins != null) {
            InputStreamReader isr = new InputStreamReader(ins);
            BufferedReader br = new BufferedReader(isr);
            try {
                String line = null;
                while ((line = br.readLine()) != null) {
                    if (bLog2Error) {
                        System.out.println("Shell_Err>" + line);
                    } else {
                        System.out.println("Shell_Out>" + line);
                    }
                } // end of while(true)
            } catch (IOException ioe) {
                System.out.println("ShellCmdLog error:" + ioe);
            } finally {
                try {
                    if (isr != null) {
                        isr.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (br != null) {
                        br.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

分享到:
评论

相关推荐

    java调用脚本语言笔记(jython,jruby,groovy)

    本文将深入探讨如何在Java中调用三种流行的脚本语言:Jython、JRuby和Groovy。 ### Jython Jython是Python的一个Java实现,它允许Java开发者利用Python的强大语法和丰富的库。要使用Jython,首先需要在项目中引入...

    java android 执行脚本代码(java代码)

    在Android开发中,Java语言是主要的编程工具,但有时候我们可能需要在应用程序中执行一些脚本代码,比如JavaScript、Python或Shell等。这通常是为了实现一些特定功能,如自动化处理、数据解析或是利用第三方库的脚本...

    shell+ruby.zip

    其次,`shadowStatusRedis.sh`则是一个Shell脚本,它可能是用来调用Ruby脚本并管理文件系统的。它可能会检查当前正在写入的文件大小,一旦超过500MB,就会关闭当前文件,创建新的文件继续写入。Shell脚本中的`awk`、...

    Ruby中调用执行shell命令的6种方法

    碰到需要调用操作系统shell命令的时候,Ruby为我们提供了六种完成任务的方法: 1.Exec方法: Kernel#exec方法通过调用指定的命令取代当前进程例子: 代码如下:  $ irb  &gt;&gt; exec ‘echo “hello $HOSTNAME”‘  ...

    ruby programming

    - **可扩展性**:Ruby可以通过C语言编写扩展模块来增强功能。 - **强大的标准库**:Ruby拥有一个强大的标准库,支持多种编程任务。 #### 参考资料 - [Ruby官方网站](https://www.ruby-lang.org/) - [Ruby文档]...

    ruby初学者教程(对初学者很有帮助)

    Ruby的动态特性体现在其可以动态地创建类和方法,甚至可以在运行时修改现有的类和方法。 **3.8 变量** - **局部变量**:以小写字母或下划线开头的变量,作用域限于当前块。 - **实例变量**:以`@`开头的变量,属于...

    ruby解释性脚本语言中文文档

    Ruby是一种解释性的、面向对象的脚本语言,它以其简洁、优雅的语法和强大的功能而闻名。Ruby的设计理念强调程序员的生产力和代码的可读性,使得开发过程快速且反馈及时,非常适合进行快速原型开发和迭代。 在Ruby中...

    Ruby程序设计.doc

    Ruby支持动态方法定义、方法重写等特性,使得程序能够在运行时动态地改变其行为。 **3.8 变量** - **局部变量:** 在特定的作用域内有效。 - **实例变量:** 存储在对象中,对象间的实例变量相互独立。 - **类变量...

    ruby 程序设计

    ### Ruby 程序设计知识点概览 #### 一、Ruby语言概述 ##### §1.1 Ruby的历史 - **起源与发展**:Ruby是由日本程序员松本行弘(Yukihiro Matsumoto)于1995年开始开发的一种面向对象的脚本语言。它结合了Perl的...

    Ruby-JRuby一个Ruby语言的Java实现

    Ruby是一种动态、面向对象的脚本编程语言,以其简洁、优雅的语法和强大的元编程能力而受到程序员的喜爱。然而,由于其原生解释器是用C语言编写的,它在某些场景下可能无法充分利用现代多核处理器的性能,或者无法很...

    Ruby中执行Linux shell命令的六种方法详解

    这些方法都很简单,本文将具体介绍一下如何在Ruby脚本中进行调用终端命令。 exec exec会将指定的命令替换掉当前进程中的操作,指定命令结束后,进程结束。 代码如下: exec ‘echo “hello world”‘ print ‘abc’ ...

    Alexa网络信息服务_Ruby_Shell_下载.zip

    2. **Shell脚本**:在Ruby中,可以使用`sh`或者`system`等方法来执行Shell命令,这使得Ruby成为编写系统管理脚本的有效工具。 3. **Alexa API**:如果项目是围绕Alexa网络信息服务,那么开发者可能使用了Alexa的API...

    linux运维学习笔记:Shell前言.pdf

    Shell脚本的独特优势在于它可以直接调用Linux系统中的大量内置命令,如grep、awk和sed,这使得它在处理操作系统级别的任务时尤为高效。 在Linux系统中,存在多种不同的Shell,如Bourne Shell(/bin/sh)、Bash(/...

    Ruby程序设计(简洁清新的教程)

    方法是Ruby程序的核心组件之一,它们可以接受参数,并返回值。 **7.1 运算符重定义** Ruby允许重新定义运算符的行为: ```ruby class MyClass def +(other) "Result: #{self} + #{other}" end end a = ...

    java开源包1

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    linux-Laptop一个用于为Web和移动开发的搭建一个macOSlaptop的shell脚本

    `Laptop`是一个shell脚本,旨在简化在macOS笔记本电脑上配置开发环境的过程。这个脚本包含了安装和配置一系列常用工具、库和框架的指令,使开发者能够快速地将他们的macOS设备转变为高效的工作站,特别适合Web和移动...

    利用Shell解析处理XML的方法汇总

    在IT领域,尤其是在系统管理和自动化任务中,Shell脚本经常被用来处理各种任务,包括解析和操作XML数据。XML作为一种结构化的数据交换格式,广泛应用于配置文件、数据传输和存储等场景。本文将详细介绍如何利用Shell...

    dots:我的shell脚本集合

    标题 "dots:我的shell脚本集合" 暗示了这是一个个人收集的Shell脚本集合,用于管理和优化开发环境。Shell脚本是Unix或Linux操作系统中的命令行脚本,允许用户自动化一系列系统任务,提高效率。这个集合可能包含了...

    essential_ruby

    ### Ruby语言概述 ...总的来说,Ruby不仅适合网络编程、Web应用开发、Shell脚本编写、数据处理和文本操作等多种任务,而且对于Python和Perl程序员来说尤其熟悉,因为Ruby在某些方面受到了Perl的启发。

Global site tag (gtag.js) - Google Analytics