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. Servlet面试题归纳

    尊重原创:http://blog.csdn.net/caohaicheng/article/details/38116481 1.说一说Servlet生命周期 Servlet生命周期包括三部分: 初始 ...

  2. 支付宝当面付开发(java)

    支付宝当面付开发(java) 业务流程:       接入准备:   直接下载demo: https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7 ...

  3. echarts自定义提示框数据

    tooltip: { trigger: "axis", axisPointer: { // 坐标轴指示器,坐标轴触发有效 type: "line" // 默认为 ...

  4. TypeScript笔记 4--变量声明

    在上一篇:基础变量中我们在声明变量时使用了关键字let,这和JS中的var有点类似. 语法 基本语法:let 变量名:类型.当然类型不是必须的. let x:number; let y:string ...

  5. 各大型邮箱smtp服务器及端口收集

    >新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sina.com.cn 收件服务器: ...

  6. 如何把本地项目上传到Github

    作为一个有追求的程序员,需要撸点自己的开源项目,虽然我现在只是在学着造轮子,但这并不影响我成为大神的心. Github是基于git实现的代码托管,很多程序员在上面托管自己的开源项目,我使用Github ...

  7. Win7如何分享局域网并设置共享文件夹账户和密码

    https://jingyan.baidu.com/article/ceb9fb10ddf6c08cad2ba017.html 在办公或者其他场所,我们需要分享自己的文件给朋友或者同事,但又不想同一局 ...

  8. Java读书推荐

    想要深入掌握一门技术,读书是必不可少的一步,也是最重要的一步.有些书需要读很多遍才能深入理解,经过几本甚至几十本书的熏陶,才能让你在这个行业中越走越远,爱上这个行业,抽出时间多读本书吧,读书会让人如虎 ...

  9. Codeforces 437 D. The Child and Zoo 并查集

    题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么 ...

  10. Linux系统shell编程自学_第一章基础

    第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...