zoukankan      html  css  js  c++  java
  • 一、Shell编程入门

    什么是Shell

    Shell是一个命令解释器,它在操作系统最外层,它的作用是把用户输入的命令交给操作系统,并将操作系统反馈的结果输出到屏幕,这种对话方式可以是交互也可以是非交互的(比如后台运行的服务)。

      输入的命令会被SHELL解释器变成计算机能识别的二进制程序给计算机。

    编程语言分类

    • 低级语言
    • 高级语言

    低级语言

    机器语言:二进制语言

    汇编语言:符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码。

    它们都是面向机器的语言

    高级语言

    它是比较接近自然语言或者说人类语言的一种编程,用人们能够容易理解的方式进行编写程序。

    静态语言:编译型语言 如:c 、 c++ 、 java

    动态语言:解释型语言 如: php 、 shell 、 python 、  perl

    常见操作系统默认Shell

    • bash(Linux下默认)
    • sh(Solaris和FreeBSD默认)
    • ksh(AIX默认)

    shell的类型

    在/etc/passwd第7个字段中列出了该用户默认的shell程序

    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin

     查看系统默认Shell命令

    [root@tz ~]# echo $SHELL
    /bin/bash
    [root@tz ~]# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash

    查看Shell版本

    [root@tz yum.repos.d]# bash --version
    GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    

    查看bash软件是否有破壳漏洞

    [root@tz yum.repos.d]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
    this is a test
    

    输出be  careful需要升级bash

    [root@tz yum.repos.d]# yum -y update bash
    [root@tz yum.repos.d]# rpm -qa bash
    bash-4.2.46-31.el7.x86_64

    Shell的父子关系

    用于登陆某个虚拟终端所启动的默认的交互shell是父shell,也就是开机启动的shell。

    在父shell输入/bin/bash命令或其他等效bash命令时会创建一个子Shell。

    [root@tzPC ~]# ps -f
    UID         PID   PPID  C STIME TTY          TIME CMD
    root      74219  74215  0 12:59 pts/0    00:00:00 -bash
    root      88330  74219  0 17:41 pts/0    00:00:00 ps -f
    [root@tzPC ~]# bash
    [root@tzPC ~]# ps -f
    UID         PID   PPID  C STIME TTY          TIME CMD
    root      74219  74215  0 12:59 pts/0    00:00:00 -bash
    root      88332  74219  0 17:41 pts/0    00:00:00 bash
    root      88348  88332  0 17:41 pts/0    00:00:00 ps -f

    使用ps --forest命令展示父子shell嵌套结构

    [root@tzPC ~]# ps --forest
       PID TTY          TIME CMD
     74219 pts/0    00:00:00 bash
     88332 pts/0    00:00:00  \_ bash
     88429 pts/0    00:00:00      \_ ps

    进程列表

    如下为命令列表

    [root@tzPC ~]# pwd;ls;cd /etc;pwd;cd;pwd;ls

    命令列表想成为进程列表需要加在()里,他们之间的区别是进程列表是生成了一个子shell来执行

    可使用环境变量$BASH_SUBSHELL来区分是否生成了子shell,返回值0表示没有,1表示创建了子shell。

    [root@tzPC ~]# pwd;ls;cd /etc;pwd;cd;pwd;ls; echo $BASH_SUBSHELL
    /root
    test1  test2  test.tar
    /etc
    /root
    test1  test2  test.tar
    0
    [root@tzPC ~]# (pwd;ls;cd /etc;pwd;cd;pwd;ls; echo $BASH_SUBSHELL)
    /root
    test1  test2  test.tar
    /etc
    /root
    test1  test2  test.tar
    1

     后台模式

    &将命令放入后台执行,会返回一个后台作业号如下图为1,跟进程ID如下图89248

    [root@tzPC ~]# sleep 10 &
    [1] 89248
    [root@tzPC ~]# jobs
    [1]+  Running                 sleep 10 &

     常用来后台运行备份打包文件等,文件不宜过大,因为断开连接后进程会结束!

    [root@tzPC ~]# (tar -cf Rich.tar /home/rich;tar -cf My.tar /home/christine)&

    携程

    可以同时做两件事,他在后台生成一个子shell,并在子shell中执行命令

    [root@tzPC ~]# coproc sleep 10 
    [1] 89748
    [root@tzPC ~]# jobs
    [1]+  Running                 coproc COPROC sleep 10 &

     COPROC是coproc命令给进程起的名字,可以使用扩展语法修改

    注意分号跟空格

    [root@tzPC ~]# coproc My_Job { sleep 10;  }
    [1] 89854
    [root@tzPC ~]# jobs
    [1]+  Running                 coproc My_Job { sleep 10; } &
    [root@tzPC ~]# coproc (sleep 10;sleep 2)
    [1] 89978
    [root@tzPC ~]# jobs
    [1]+  Running                 coproc COPROC ( sleep 10; sleep 2 ) &
    [root@tzPC ~]# ps --forest
       PID TTY          TIME CMD
     89416 pts/0    00:00:00 bash
     89978 pts/0    00:00:00  \_ bash
     89979 pts/0    00:00:00  |   \_ sleep
     89986 pts/0    00:00:00  \_ ps

     外部命令

     也称为文件系统命令,通常位于/bin、/usr/bin、/sbin或/usr/sbin中

    可通过命令which或type找到命令所在的位置

    [root@tzPC ~]# which ps
    /usr/bin/ps
    [root@tzPC ~]# type -a ps
    ps is /usr/bin/ps

    外部命令执行时会创建一个子进程,称为衍生

    [root@tzPC ~]# ps -f
    UID         PID   PPID  C STIME TTY          TIME CMD
    root      90651  90647  0 21:54 pts/0    00:00:00 -bash
    root      91076  90651  0 22:02 pts/0    00:00:00 ps -f

    内部命令

    与外部命令区别在于不需要子进程来执行,可使用type命令查看是否为内部命令

    [root@tzPC ~]# type cd 
    cd is a shell builtin

    内部命令执行速度更快效率更高

    有些命令有内部命令也有外部命令,可使用type -a 查看

    [root@tzPC ~]# type -a echo
    echo is a shell builtin
    echo is /usr/bin/echo
    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    java并发编程(五)lock
    java并发编程(一)线程状态 & 线程中断 & 线程间的协作
    java基础之 clone
    java基础 小知识点汇总篇
    java并发编程(四) 线程池 & 任务执行、终止源码分析
    GC(一)内存管理与垃圾回收
    java并发编程(三)cpu cache & 缓存一致性
    java并发编程(八) CAS & Unsafe & atomic
    @PathVariable注解
    redis分布式锁
  • 原文地址:https://www.cnblogs.com/tz90/p/12631973.html
Copyright © 2011-2022 走看看