1.调用系统命令

exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o

func Command(name string, arg ...string) *Cmd {}

调用系统命令:

package main

import (
"os/exec"
"log"
"fmt"
) func main() {
cmd := exec.Command("ls","-l")
out,err := cmd.CombinedOutput()//标准输出 标准错误 组合
//out, err := cmd.Output()
//Output()和CombinedOutput()不能够同时使用,
// 因为command的标准输出只能有一个,同时使用的话便会定义了两个,便会报错
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}

2.交互式调用系统命令

package main

import (
"os/exec"
"bufio"
"fmt"
"log"
"time"
) func main() {
cmd := exec.Command("ls","-l")
out,_ :=cmd.StdoutPipe() //StdoutPipe返回一个连接到command标准输出的管道pipe
if err := cmd.Start();err != nil {
log.Fatal("start error:%v",err)
} f := bufio.NewReader(out)
for {
line,err := f.ReadString('\n')
if err != nil {
break
}
fmt.Print(line)
}
time.Sleep(time.Hour)
//cmd.Wait()
//Wait等待command退出,他必须和Start一起使用,
//如果命令能够顺利执行完并顺利退出则返回nil,否则的话便会返回error,其中Wait会是放掉所有与cmd命令相关的资源
}

不加wait()会产生僵尸进程,3466 defunct 僵尸进程,wait收尸

go build cmd.go
./cmd
[root@greg02 ]#ps -ef |grep cmd2
root 3466 2539 0 20:37 pts/0 00:00:00 ./cmd2
[root@greg02 ]#ps -ef |grep ls
root 683 1 0 18:43 ? 00:00:21 /usr/bin/vmtoolsd
root 3470 3466 0 20:37 pts/0 00:00:00 [ls] <defunct>

3.自制bash

package main

import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
) func main() {
host, _ := os.Hostname()
prompt := fmt.Sprintf("[ningxin@%s]$ ", host)
r := bufio.NewScanner(os.Stdin)
//r := bufio.NewReader(os.Stdin)
for {
fmt.Print(prompt)
if !r.Scan() {
break
}
line := r.Text()
// line, _ := r.ReadString('\n')
// line = strings.TrimSpace(line)
if len(line) == 0 {
continue
}
args := strings.Fields(line)
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
fmt.Println(err)
}
}
}

4.管道pipe

package main

import (
"fmt"
"io"
"log"
"os"
"os/exec"
"strings"
) func main() { line := "ls | grep f"
cmds := strings.Split(line, "|")
s1 := strings.Fields(cmds[0])
s2 := strings.Fields(cmds[1])
fmt.Println(s1)
fmt.Println(s2)
r, w := io.Pipe()
cmd1 := exec.Command(s1[0], s1[1:]...)
cmd2 := exec.Command(s2[0], s2[1:]...)
//cmd1 := exec.Command("ls")
//cmd2 := exec.Command("grep","f")
cmd1.Stdin = os.Stdin
cmd1.Stdout = w
cmd2.Stdin = r
cmd2.Stdout = os.Stdout
cmd1.Start()
cmd2.Start()
log.Print("start") cmd1.Wait()
cmd2.Wait()
}

5.shell.go

https://github.com/ningxin1718/gosubshell

Golang Linux Shell编程(一)的更多相关文章

  1. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  2. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  3. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  4. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  5. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  6. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  7. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  8. linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行

    linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行 crontab每分钟执行一次,但5秒以上才有更新数据,有时候一分钟可能跑不完上一个进程,需要先等10秒再判 ...

  9. 一文学完Linux Shell编程,比书都好懂

    一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...

随机推荐

  1. 蓝桥杯 0/1背包问题 (java)

      今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...

  2. 你必须知道的session与cookie

    Session本质 提到Session我们能联想到的就是用户登录功能,而本身我们使用Session的基础是通过url进行访问的,也就是使用http协议进行访问的,而http协议本身是无状态的,那么问题 ...

  3. javascript 指定绑定函数名称,并且传递参数

      <html> <head> <title> New Document </title> <script type="text/jav ...

  4. FTP下载导致Zip解压失败的原因

    情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功 ...

  5. tp系统常量定义

    (2013-03-06 14:16:31) 转载▼ 标签: it 是已经封装好的系统常量 主要是用在控制器下面的动作当中 这样能很大的提高我们的开发效率 主要有下面的一些      手册上面都有的   ...

  6. 如何在Chrome下使用Postman进行rest请求测试

    在web和移动端开发时,常常会调用服务器端的restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用.这里介绍一下如何在chrome浏览器利用postman应用进 ...

  7. 微信公众号tp3.2放进Model无效,几种实例化的方法试过,还是提示无法提供服务

    http://www.imooc.com/video/10230 解决方案一: $indexModel = D('Index');  实测可行 解决方案一: 使用TP3.2的小伙伴需要注意了,在Mod ...

  8. Struts2------Result处理&获取页面请求参数&API

    一.Result处理 1.1 说明 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为 局部结果页面:但是我们有时候在很多个action里面,针对不 ...

  9. MYSQL GROUP BY Optimization

    GROUP BY Optimization 常规的匹配group by(分组)操作子句是扫整表并且创建包含连续的分组行的临时表, 利用临时表得到group数据,运用appregate function ...

  10. 新装Centos7.2 配置防火墙

    1.安装 yum -y install firewalld2.开机启动 systemctl enable firewalld3.设置防火墙规则 systemctl restart firewalld ...