16中级 - 操作系统与计算机原理:命令行详解

154 阅读5分钟

命令行入门、历史与启动

  • 内核就是和硬件交互的那部分代码,负责cpu的调度,进程的调度的核心代码

    • linux内核的代码
https://github.com/torvalds/linux
  • shell 壳和内核kernel相对

什么是命令⾏行行

  • 广义的命令⾏行行包括一切通过字符终端控制计算机的⽅方式

    • Windows - cmd/PowerShell/Git bash
    • UNIX/Linux系列列:sh/zsh/Terminal, etc.

为什么需要命令行

  • 你不得不用

    • 因为所有公司的服务器都运行在Linux上
  • 将⼯工作⾃自动化

    • 自动化是⼀切⽣产⼒的根源
  • 举个栗⼦

    • 相比GUI,命令⾏ 更容易开发维护
    • 说⽩了就是bug更少
  • 远程连接时命令⾏占⽤用资源远低于GUI

    • 命令⾏上的开发者⼯具更丰富

命令行的历史与流派

  • UNIX家族

    • POSIX标准
    • macOS
    • Linux
    • Windows Subsystem for Linux
  • Windows

    • 奇葩

1.png

1.png

工作目录和环境变量

  • 可执⾏行行程序(Executable)
  • 参数
  • 环境变量量(Environment variable)
  • 工作目录(Working directory),当前所处的目录
  • 以上四个要素相同,就可以完全地“重现”⼀一个命令
  • 你碰到的各种各样古怪的问题,原因⼀一定是上述四个要素之⼀一
ls -l
// ls称为可执行参数,后面的都是参数
// ~代表home目录

命令的组成部分

  • 工作目录

    • 启动命令的路径
    • 相对路路径都是相对于这个路径
    • 在Java中的应⽤用

进程

  • 进程(Process)

    • 进程是计算机程序运行的最⼩单位
    • 独占自⼰的内存空间和⽂件资源
  • 每个进程都和一组变量相绑定

    • 传递不同的环境变量可以让程序表现出不同的⾏为
    • CLASSPATH/GOPATH
export FANGFANG=congmingren
// process.env.FANGFANG就会有值
  • 在进程的fork过程中,环境变量可以被完全继承,fork可以理解成生儿子
  • 所有的操作系统/编程语⾔都支持环境变量 2.png
  • 局部和全局的环境变量
  • export列出当前环境的所有环境,它爹有很多环境变量

2.png

环境变量量实战

  • 通过export/set设置环境变量,通过echo读取环境变量
  • 从Java/Go/Python/Node.js中读取环境变量
  • 向Docker容器器传递环境变量
  • 快速传递一个环境变量AAAAA=1 go run main.go
  • 使⽤环境变量 控制程序的行为
  • 环境变量只对当前一个命令有效AAAAA=1 go run main.go
  • 全局的环境变量,配置好了记得source,bash_profile只对bash有效
vi ~/.bash_profile

可执行程序

  • UNIX/Linux:x权限 - 可执⾏权限

    • linux和unix有个x权限才是可执行程序
    • chomd 777 echo.sh如果强行加可以执行x权限,可以自动跑
    • 教终端做人,# !/user/bin/env node第一行告诉终端如何解释和执行。env代表从环境中读取,更安全
  • Windows:exe/bat/com

  • 去哪里找程序?

  • Windows:Path环境变量 + 当前⽬录

  • UNIX/Linux:PATH环境变量

  • 在脚本的第⼀行指定解释器(shebang)

  • 别名(alias)

参数

  • 把可执行程序后面的参数直接丢给可执行参数

  • unix的约定

    • ls -a -l -t -h 后面四个- 可以进行合并,合并成ls -alth
    • 两个-,ls -a 和ls --all相同, git push --force = git push -f
  • java不鸟unix的约定

  • 参数最坑爹的事情

    • 通过把''参数强合到一起传给程序
    • 需要注意java文件名的符号,会被环境变量替换进去,用单引号强行保持符号,会被环境变量替换进去,用单引号强行保持不替换
    • 换成双引号会展开
    • ls *.go 会展开所有的go文件传入,除非用*.go括起来就可以取消掉通配性

Linux文件权限

3.png 4.png 5.png 6.png

输入与输出

  • 标准输⼊stdin

  • 标准输出stdout

  • 标准错误 stderr

  • 输出的重定向

    • 覆盖⽂文件
    • 追加⽂文件
    • 改变流向
    • /dev/null,垃圾桶概念,java Main 2> /dev/null就会丢失错误的输出

7.png

  • 标准输出,> 重定向到某个文件,会覆盖, >>表示追加

  • 1号是标准输出,2号四号标准错误, java Main 2> output.txt

    • 同时输出java Main >output.txt 2>&1\

8.png

Linux常用命令详解

  • 进入目录 cd (change directory)
  • 展示⽂件 ls/ll/ls -alth (list)
  • 移动/重命名⽂件 mv (move)
  • 删除⽂件 rm/rm -r/rm -rf (remove)
  • 拷⻉贝⽂件 cp/cp -r (copy)
  • 显示变量 echo,可以快速创建环境变量
  • 导出变量 export
  • Git系列列操作 git pull/push/add/commit/...
  • 新建目录 mkdir/mkdir -p (make directory)
  • 当前目录 pwd (print working directory)
  • 显示⽂件 cat (concatenate and print files)
  • 编辑文件 vi

如何学好命令行

  • 自⼰对着书敲命令

  • 尽可能地在开发中使用命令⾏

    • vi/git/mkdir, etc.
  • 使⽤命令行的各种⼩工具

  • 开发命令⾏的程序

  • ⾃行在云服务器上开发部署博客

  • ⾃行在云服务器器上进⾏持续集成实战

  • ⽇常使⽤Linux进⾏开发

java和命令行

  • Java世界里的⼀切工具都只做⼀件事:拼接命令行

  • javac Main编译成字节码

  • java Main执行字节码

  • 使⽤用命令行编译、运行Java程序

  • Java程序中的环境变量与系统属性详解,只针对jvm内部叫做系统属性,就是jvm里面的环境变量

9.png

10.png

  • 传递系统属性, -D在java中非常常用,需要注意左侧是传递给jvm的参数\

11.png

  • java -cp commons-lang3-3.9.jar:. StringIsBlank 1 2 3

  • 使⽤Java程序启动新的进程

    • 好处: 1.工作中不可避免的要folk其他进程,比如需要用到视频分割,不可避免用到ffmpeg的库
  • windows用git bash还算能用

安装maven

  • maven clean test,没安装的情况,无法使用