wangjie-fourth 的个人博客

记录精彩的程序人生

目录
命令行
/    

命令行

一、~/.bashrc

.bashrc文件是放在用户的根目录下,在使用bash终端的时候,文件里面的命令会先执行一边。该文件的用处有:(1)定义一些环境变量;(2)定义一些常用命令的别名。

注意:

  • 重新编辑后,要使用source ~/.bashrc让该文件里面命令再重新跑一遍。
  • 这个配置文件值对bash终端有效。如果你使用zsh终端,就需要配置zsh的配置文件~/.zshrc

1、编写命令的别名

alias gs1='git add .; git stash'
alias gs='git pull origin develop'
alias gs2='git stash pop'

二、/ect/profile/etc/profile.d

今天在按照公司文档搭建环境的时候,下面内容有让我疑惑的地方:

vim /etc/profile.d/java.sh

// 配置java环境变量
#set java environment
if [ -z "$JAVA_HOME" ]; then
JAVA_HOME=/data/hzero/java/jdk1.8.0_172
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
fi

// 重新执行配置文件
source /etc/profile

疑惑的点:我在profile.d文件夹下写了一个脚本,但我怎么刷新/etc/profile就能把/etc/profile.d/文件夹下的脚本给执行了呢?
网上参考资料

  • 执行/etc/profile时,是会去执行/etc/profile.d文件夹的脚本;

那为什么要这样设计呢?
/etc/source.d/文件夹设计是为了避免/etc/profile下的脚本过长;将一些特定功能的脚本放在/etc/source.d下更加容易维护。

二、脚本文件

#!/usr/bin/env node 在当前环境中找到node解释器执行以下代码

从当前环境找到node文件去执行脚本。env表示环境啊!
也可以使用绝对路径。在cmd中 使用where node找到决定路径下的node文件,写出

C:\Program Files\nodejs\node node

推荐使用环境的方式引入脚本环境解释器。

三、命令行

命令行是人类使用跟计算机交互的某些字符串。通常上,命令行是与计算机操作系统的内核(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//截止输入
  • 使用<从文件中读取数据输入给进程
  • 使用<<输入块数据

2、输出重定向

  • 将标准输入、标准错误都重定向到某个文件
    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、cd【change directory】:进入目录

  • cd ..:进入上级目录
  • cd ./:进入当前目录

2、ls【list】:展示文件

  • ls:显示当前目录下非隐藏文件和文件夹
  • ls -als --all:展示当前文件夹下的所有文件,包含隐藏文件
  • ls -lll:显示当前目录下文件的详细信息
  • ls -h:按照人类可读性来显示数据
  • ls -t:按照文件修改时间倒序排

3、mv【move】:移动/重命名文件

  • mv 需要改动的文件 目标位置
  • mv public/demo.txt public/demo2.txt

4、rm【remove】:删除文件

  • rm -r xxx:递归删除文件夹里面的所有文件
  • rm -f xxx:强制删除文件

5、cp【copy】:拷贝文件

  • cp -r 需要拷贝的文件 拷贝到的文件:递归拷贝当前目录的所有文件到指定目录下

6、mkdir【make directory】:新建目录

  • mkdir XXX:新建一个名为XXX的文件夹
  • mkdir -p x/x/x/x:同时创建多个目录结构

7、grep【】:查询目录中的内容

  • grep XXX:查询XXX字符串
  • grep XXX -r:查询当前目录下所有文件内容含有XXX的信息
输出数据:echo xxx
设置环境变量:export xxx=XXX
显示当前目录路径:pwd【print working directory】
显示文件内容:cat【concatenate and print files】

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

1、java程序如何获取系统属性、环境变量
javapsvmString[] args参数是用来接收环境中变量信息的!!!!

环境变量:System.getenv("AAA");
系统属性:System.getProperty("AAA");

2、如何向java程序传递系统属性

java -D系统属性名称=系统属性值 执行class文件

java -DAAA=789 Main

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

mvn install -DskipTests

3、加载第三方jar包:classpath

javac -classpath jar包的位置 要编辑的文件.java

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

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

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

windows时,java使用;来分割

4、在java程序中启动一个进程
除了使用脚本执行java程序,还可以在java程序新起一个进程执行脚本。如

// 设置可执行程序
ProcessBuilder pb = new ProcessBuilder("sh","run.sh");
// 设置工作目录
pd.directory(".");
// 设置环境变量
Map<String, String> envs = pb.environment();
// 开启进程
pb.start().waitFor();

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

评论