wangjie-fourth 的个人博客 wangjie-fourth 的个人博客

may be just need work hard

目录
命令行
/    

命令行

三、命令行

命令行是人类使用跟计算机交互的某些字符串。通常上,命令行是与计算机操作系统的内核(kernel)交互。而负责人类与内核之间交互的程序,我们称为壳(shell)。常用的有:shTerminalcmdpowerShellgitBash等等。

Unix中所有位置都是以 /开头。比如说:/c/home

命令行的四要素

  • 可执行程序(Executable
  • 参数
  • 环境变量(Environment variable
  • 工作目录(Work directorty

只要这四个要素完全相同的话,得到的结果一定是相同的。也就是说如果相同的程序在别人的电脑可以,在你的电脑不可以,有很大可能就是这四个要素不同。

1、工作目录

指的是命令行执行的目录。

相对路径下 .表示当前文件夹

2、环境变量

进程相关

(1)概念
进程是计算机程序运行的最小单位。比如说:启动 QQ

  • 进程可以独占自己的内存空间和文件资源;
  • 每个进程都会与一组变量相互绑定;
  • 子进程会继承父进程的环境变量;
  • 在这个进程中启动的所有程序,都可以获取到当前进程的所有环境变量;

(2)进程是从哪里开始的?
进程是由父进程而来的。而最初的进程是由系统开启获取的。

5e01aa5313b345b491490f3d03a0f88b.png

最初的进程就有 Path环境变量,这样之后所有的进程都有这些环境变量。
(3)如何在进程中定义一个环境变量

  • liunx
export 环境变量名称=环境变量值
  • windows
set 环境变量名称=环境变量值
使用环境变量

在程序中,我们通常使用环境变量来为程序传递相关配置信息。

java读取环境变量值:System.getenv("变量名称");

(1)如何让某个环境变量只对当前命令有效

AAA=1 go run main.go

这里的意思是将一个环境变量传入到当前进程。此环境只在新进程中有效,当前进程是没有这个环境变量

3、可执行程序

(1)什么叫可执行程序
windows中,可执行程序是指以 .exe.bat等结尾的文件。在 LinuxMacOS中,可执行程序是指含 x权限的文件。

(2)可执行程序的位置
windows下,可执行程序是在 Path环境变量和当前目录下;
linux下,可执行程序一定在 PATH环境变量中;
比如说:你写一个 demo.sh脚本,在 windows下,你只要执行 demo.sh;而在 linux就需要执行 ./demo.sh
原因是 windows下除了在 path中查找可执行程序,还在当前目录找;而 linux不会,这时候就需要一个相对路径来解释。

4、参数

(1)uninx对参数的一个约定

  • 使用一个-只能跟一个参数,但是可以连接起来。比如说:ls -alth = ls -a -l -t -h
  • 使用一个--,后面跟着一个单词。比如说:ls --all

约定是约定,并不是所有人都会遵守的,比如说 javajava -version

(2)空格、$带来的歧义

  • 使用单引号括起来,表示是一个完整的参数信息;
  • 使用双引号括起来,会将进行相关转换,再作为一个完整的参数信息

有时候也可以转换字符来解决问题 ,如果参数包含空格,可能需要 ''括起来
java的内部类可能会编译出含 $名称的 class文件,如果恰巧后面的名称与当前环境相同的话,就会出现错误。

传单引号参数,这时候需要使用""来包含这个
传含*参数,这时候需要使用''括起来

(3)的使用
git add * 就是将当前所有的文件添加。这是利用
的特性。有时候,不想使用这个特性,就想用* 。这时候,可以使用'*'来处理。

四、Shell相关知识

输入、输出、错误

1583982061439.png

  • 标准输入:<<<
  • 标准输出:>>>
  • 标准错误:2>2>>

一个命令还与标准输入、标准输出、标准错误有关。比如说 cat命令后面需要加入其他的参数可以通过标准输入来提供。比如 cat > out.txt << EOF,从标准输入里读,直到输入 EOF为止。

  1. 输入重定向
  • 如果不指定,通过CTRL +D输入EOF结束
cat > out.txt << EOF
demo
EOF//截止输入
  • 使用<从文件中读取数据输入给进程
  • 使用<<输入块数据
  1. 输出重定向
  • 将标准输入、标准错误都重定向到某个文件

    cat notexist.txt > out.txt 2>&1
    
  • 将标准输入放到out,将错误放到回收站中

    cat demo.txt > out.txt 2> /dev/null
    

管道符

1583992717812.png
管道符会将上一个命令的结果作为下一个命令的输入来执行。比如说:

  • 统计当前文件夹下含class名称文件的个数
ls | grep class | wc -l
  • PATH环境变量,按:分隔,取其第五个
echo ${PATH} | cut -d ':' -f 5
  • 杀掉当前java进程
ps aux | grep java | awk '{print $2}' | xargs kill -9

tee重定向命令

1583993977714.png
适用于将命令输出结果即输出到屏幕上,又输入到文件中。比如说:
当我们运行 mvn -X compile查看错误时,想让它输出到文件里,但又想屏幕接着显示时,就使用:

mvn -X compile | tee output.txt

反引号和 $()

在某个命令中,会先执行反引号和 $()命令,并用其结果替换,再次执行命令。比如:

# 打印当前路径的父目录
ls `pwd`/..

Shell的返回值

每个进程都会有一个返回值:

  • 0:代表一切正常
  • 0:代表出现错误
    使用$?获取上一个进程的返回值。

五、Linux相关命令

六、从程序获取环境变量信息

  1. java程序如何获取系统属性、环境变量javapsvmString[] args参数是用来接收环境中变量信息的!!!!
环境变量:System.getenv("AAA");
系统属性:System.getProperty("AAA");
  1. 如何向java程序传递系统属性
java -D系统属性名称=系统属性值 执行class文件

java -DAAA=789 Main

注意:系统属性、环境变量、执行的class相对的位置不能更改。是有严格定义的。
maven也有类似系统属性的运用。如:

mvn install -DskipTests
  1. 加载第三方jar包:classpath
javac -classpath jar包的位置 要编辑的文件.java

目的是在编译java文件时,能找到对应第三方的依赖。

java -cp jar包的位置:. 要执行的clas文件 [环境变量]

执行 class文件时,请在 jar包和当前目录下查询第三方 class文件

windows时,java使用;来分割

  1. java程序中启动一个进程
    除了使用脚本执行java程序,还可以在java程序新起一个进程执行脚本。如
// 设置可执行程序
ProcessBuilder pb = new ProcessBuilder("sh","run.sh");
// 设置工作目录
pd.directory(".");
// 设置环境变量
Map<String, String> envs = pb.environment();
// 开启进程
pb.start().waitFor();

重定向输出路径:
pb.redirectOutput(xxx);