zoukankan      html  css  js  c++  java
  • shell(一)

    1:查看本系统shell的默认交互shell

    yusuwudeMacBook-Pro:~ yusuwu$ cat /etc/passwd
    
    nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
    root:*:0:0:System Administrator:/var/root:/bin/sh
    daemon:*:1:1:System Services:/var/root:/usr/bin/false

    2:查看本系统的shell

    yusuwudeMacBook-Pro:~ yusuwu$ ls -lF /bin/*sh
    -r-xr-xr-x  1 root  wheel   623472  4  7 03:52 /bin/bash*
    -rwxr-xr-x  1 root  wheel   529424  4  7 03:52 /bin/csh*
    -rwxr-xr-x  1 root  wheel   110848  4  7 03:52 /bin/dash*
    -r-xr-xr-x  1 root  wheel  1300256  4  7 03:52 /bin/ksh*
    -rwxr-xr-x  1 root  wheel    31440  4  7 03:52 /bin/sh*
    -rwxr-xr-x  1 root  wheel   529424  4  7 03:52 /bin/tcsh*
    -rwxr-xr-x  1 root  wheel   637632  4  7 03:52 /bin/zsh*

    通过上面命令执行结果来看,*sh都是可执行程序,如果我们想切入到其他的shell,可以直接执行命令:

    yusuwudeMacBook-Pro:~ yusuwu$ /bin/bash 
    
    The default interactive shell is now zsh.
    To update your account to use zsh, please run `chsh -s /bin/zsh`.
    For more details, please visit https://support.apple.com/kb/HT208050.
    bash-3.2$ exit
    exit
    yusuwudeMacBook-Pro:~ yusuwu$ 

    退出exit则可.

     3:shell的父子关系

    yusuwudeMacBook-Pro:~ yusuwu$ ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501  1457  1456   0  6:17下午 ttys000    0:00.02 -bash
    yusuwudeMacBook-Pro:~ yusuwu$ /bin/bash 
    
    The default interactive shell is now zsh.
    To update your account to use zsh, please run `chsh -s /bin/zsh`.
    For more details, please visit https://support.apple.com/kb/HT208050.
    bash-3.2$ ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501  1457  1456   0  6:17下午 ttys000    0:00.02 -bash
      501  1844  1457   0 11:20下午 ttys000    0:00.01 /bin/bash
    bash-3.2$ /bin/dash
    $ ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501  1457  1456   0  6:17下午 ttys000    0:00.02 -bash
      501  1844  1457   0 11:20下午 ttys000    0:00.01 /bin/bash
      501  1846  1844   0 11:20下午 ttys000    0:00.00 /bin/dash
    $ exit 
    bash-3.2$ exit
    exit
    yusuwudeMacBook-Pro:~ yusuwu$ 

    通过上面代码的执行顺序和父子的PID可以看出.

      3.1:进程列表

      命令列表只需要在命令之间加分号“;”即可,命令列表想成为进程列表,这些命令就必须加在园括号里.

      

    yusuwudeMacBook-Pro:~ yusuwu$ pwd;cd /etc/;pwd;cd ;ls;echo $BASH_SUBSHELL 
    /Users/yusuwu
    /etc
    Applications            Movies                YXL.tar
    Applications (Parallels)    Music                eclipse-workspace-20200505
    Desktop                Parallels            iCloud Drive(归档)
    Documents            Pictures            jetbrains-agent
    Downloads            Postman                package-lock.json
    IdeaProjects            Public                resourceFiles
    Library                YXL
    0
    yusuwudeMacBook-Pro:~ yusuwu$ (pwd;cd /etc/;pwd;cd;ls;echo $BASH_SUBSHELL );
    /Users/yusuwu
    /etc
    Applications            Movies                YXL.tar
    Applications (Parallels)    Music                eclipse-workspace-20200505
    Desktop                Parallels            iCloud Drive(归档)
    Documents            Pictures            jetbrains-agent
    Downloads            Postman                package-lock.json
    IdeaProjects            Public                resourceFiles
    Library                YXL
    1
    yusuwudeMacBook-Pro:~ yusuwu$ 

    住: echo $BASH_SUBSHELL 如果这个命令返回0,就表示没有子sehll,如果返回1或者其他更大的数字,就表示存在子shell.上面执行的代码可以看出被园括号括住的命令列表变成了进程列表,

    进程列表会生成一个子shell来执行对应的命令.

      3.2:后台模式:

    要想将命令置入后台模式,可以在命令末尾加上字符&;

    yusuwudeMacBook-Pro:~ yusuwu$ sleep 10
    yusuwudeMacBook-Pro:~ yusuwu$ ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501  1457  1456   0  6:17下午 ttys000    0:00.06 -bash
    yusuwudeMacBook-Pro:~ yusuwu$ sleep 20&
    [1] 1871
    yusuwudeMacBook-Pro:~ yusuwu$ ps -f
      UID   PID  PPID   C STIME   TTY           TIME CMD
      501  1457  1456   0  6:17下午 ttys000    0:00.07 -bash
      501  1871  1457   0 11:34下午 ttys000    0:00.00 sleep 20
    yusuwudeMacBook-Pro:~ yusuwu$ jobs
    [1]+  Running                 sleep 20 &
    yusuwudeMacBook-Pro:~ yusuwu$ jobs -l
    [1]+  1871 Done                    sleep 20

      3.3:将进程列表置入后台:

    yusuwudeMacBook-Pro:~ yusuwu$ (sleep 10; echo $BASH_SUBSHELL ; sleep 10)&
    [1] 1876

    在CLI中运用子shell出创造性方法之一就是将进程列表置入后台模式,这样我们既可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端.

    eg:

    yusuwudeMacBook-Pro:~ yusuwu$ (tar -czf ./YXL.tar.gz ./YXL)&
    [1] 1888

    当然将进程列表置入后台模式并不是子shell在CLI中仅有的创造性用法.协程就是另一种方法.

      3.4:协程

    协程可以同时做两件事,它在后台生成一个子shell,并在这个子shell中执行命令.要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令.

    $ coproc sleep 10

    [1] 2544

    $

    除了会创建在shell外,协程基本上就是将命令置入后台模式.

    $ jobs

    [1]+ Running      coproc COPROC sleep 10 &

    $

    COPROC是coproc命令给进程起的名字,我们也可以使用命令的扩展语法自己设置这个名字

    $ coproc my_job { sleep 10; }

    [1] 2570

    $

    $jobs

    [1]+ Running      coproc my_job { sleep 10; } &

    $

    这里要注意的是:扩展语法写起来必须要确保在第一个花括号"{"和命令之间有一个空格.还必须保证命令以分号";"结尾,另外分号和闭花括号"}"之间也得有一个空格.

    4:理解shell的内建命令

      4.1:外部命令和内建命令的区分

    yusuwudeMacBook-Pro:bin yusuwu$ type -a ps
    ps is /bin/ps
    yusuwudeMacBook-Pro:bin yusuwu$ which ps 
    /bin/ps
    yusuwudeMacBook-Pro:bin yusuwu$ type -a pwd
    pwd is a shell builtin
    pwd is /bin/pwd
    yusuwudeMacBook-Pro:bin yusuwu$ type pwd
    pwd is a shell builtin
    yusuwudeMacBook-Pro:bin yusuwu$ which pwd
    /bin/pwd
    yusuwudeMacBook-Pro:bin yusuwu$ type -a echo
    echo is a shell builtin
    echo is /bin/echo
    yusuwudeMacBook-Pro:bin yusuwu$ 

    外部命令也被称为文件系统命令.是存在于bash shell之外的程序.它们并不是shell程序的一部分,外部命令程序通常位于/bin,/usr/bin,/sbin或/usr/sbin中.

    当外部命令执行时会衍生的创建出一个子进程,当进程必须执行衍生操作时,它需要花费时间和精力来设置新子进程的环境,所以说,外部命令多少还是有代价的.

    内建命令和外部命令的区别在于前者不需要使用子进程来执行,它们已经和shell编译成了一体,作为shell工具的组成部分存在.不需要借助外部程序文件来运行.

    所以内建命令的执行效率更高.

    yusuwudeMacBook-Pro:bin yusuwu$ type -a exit
    exit is a shell builtin

    命令type -a显示出每个命令的两种实现,which命令只显示了外部命令文件.

    [1]:history

    yusuwudeMacBook-Pro:bin yusuwu$ type -a history
    history is a shell builtin
    yusuwudeMacBook-Pro:bin yusuwu$ history
    ...
      111  ls
      112  cd JavaVirtualMachines/
    ...
     609  type -a history
      610  history

    记: !! 加回车:执行刚才执行的一条命令

      !加命令编号: eg:  !112 则会执行history中的112条命令.

      history -a和history -n命令用法

    [2]:命令别名 alias

    yusuwudeMacBook-Pro:~ yusuwu$ la
    -bash: la: command not found
    yusuwudeMacBook-Pro:~ yusuwu$ alias la='ls -al'
    yusuwudeMacBook-Pro:~ yusuwu$ la
    total 721400
    drwxr-xr-x+  50 yusuwu  staff       1600  5 16 00:22 .
    drwxr-xr-x    6 root    admin        192  4  7 03:45 ..
    -r--------    1 yusuwu  staff          9  6 19  2018 .CFUserTextEncoding
    -rw-r--r--@   1 yusuwu  staff      24580  5 13 16:26 .DS_Store
  • 相关阅读:
    多线程及线程池
    自动发送邮件(整理版)
    repeater绑定泛型list<string>
    字符串转换为日期时间类型及正则式拾遗
    自定义控件伪装“病毒”
    Redis-收藏文章
    jQuery对input select操作小结
    Aspose 强大的服务器端 excel word ppt pdf 处理工具
    win7 SSD 如何分区 与安装
    超实用的JavaScript技巧及最佳实践
  • 原文地址:https://www.cnblogs.com/xibushijie/p/12896180.html
Copyright © 2011-2022 走看看