命令行本质

命令行/终端的本质i是一个进程,最流行的是bash/zsh,读取输入并且做出反应。

  • 内置命令,直接执行之
  • 查找$PATH中的对应可执行程序并将参数交给它
  • 如果是exit,终止自己

大多数情况下,执行一个命令=fork一个新的进程

  • ./xx.sh sh java python mvn
  • source exec

命令的四要素

如果四要素完全相同,那么命令一定可以重现,如果命令出现诡异问题,那么一定是四要素之一发生了改变,碰到奇怪的问题,先问自己,四要素是啥?

四要素

1. 可执行程序 executable

  • 什么是可执行程序
    • windows:exe/bat/com
    • unix:+x(rwx里面的x)
  • Shell如何找到可执行程序
    • 内置命令
    • alias
    • 挨个再PATH里面找,找到就执行,找不到就报错
    • 额外的,Windows会再当前目录里面找
  • 二进制可执行程序
    • 符合对应操作系统的要求,能够直接执行,无需解释器
  • 脚本

    • 在第一行指定解释器(Shebang)
    • image.png
    • python/node/groovy/java

      2. 参数 arguments

  • 参数完全由对应的可执行程序负责解析

  • 但是shell可能偷偷摸摸的在参数中动手脚

    • 通配符展开(globbing) eg: java .sh 这个会被自动转换成当前目录所有的文件.sh
    • 变量展开
      • shell中的变量
      • $() 和 ‘’
    • 双引号与单引号

      3. 工作路径 working directory

  • 启动命令的路径 pwd

  • 相对路径都是相对于这个路径
  • 在java中的应用

    • new File(“.”)代表相对当前目录的路劲

      4. 环境变量 environment variable

  • 非常非常非常重要

  • 和进程相绑定的一组键值对
    • 所有的操作系统都支持
      • 但是windows上不区分大小写
    • 所有的变成语言都提供原生支持
    • 可被子进程所继承
      • 但是不能逆向传递
  • 再历史上,使用一些重要的环境变量用于存放重要信息
    • PATH/PS1/LC_ALL/LANG
    • CLASSPATH/GOPATH