始终记住,命令行的四大要素:环境变量、可执行程序、工作路径、参数。

1.stdin stdout stderr

在操作系统中,每一个进程都绑定了三个文件,暨stdinstdoutstderr,他们之间用文件描述符fd区分:

Linux/Vim命令(持续更新)_Linux

所以可以根据fd不同,将文件重定向到不同的文件中:
java -cp . Demo 1>out.txt 2>err.txt

  • 还可以使用2>&1的形式,将stderr重定向到stdout中。
  • Linux系统的垃圾桶是/dev/null,所以可以将不需要的输出,重定向至垃圾桶中。
  • >>>区别在于,前者是直接覆盖,后者则是追加。

2.路径相关

  • 回到上一次目录: cd -
  • 检索:find
  • 打开文本编辑器:gedit a.txt
  • 查看文本内容:cat a.txt/cat a.txt | less (分页查看)
  • 显示当前目录:pwd (print working directory)
  • 查看某个可执行程序所在的目录:which
    例如:which java | which wget(常见的Linux下载文件工具)

3.用户相关

  • 查看当前登录用户:whoami
  • 查看系统中的所有用户 cat /etc/passwd
  • 切换用户:su (switch user)
  • 为当前系统创建用户 useradd xxx
  • 删除用户 userdel xxx
  • 退出当前用户 exit

4.ssh相关

  • 查看版本 ssh -V(大写)
  • 使用ssh连接远程服务器:ssh {账户名}@{服务器ip地址}
    例如:ssh root@192.168.19.130
  • 生成密钥对:ssh-keygen -t [rsa|dsa]
4.1 解决使用ssh连接root用户出现permission denied的问题

问题详情为:使用sudo su 切换root用户可以正常登录root,但使用ssh root@{ip}却提示密码错误。解决步骤如下:

sudo passwd root  --重置密码

sudo vi /etc/ssh/sshd_config  --修改 PermitRootLogin yes

sudo service ssh restart -- 重启ssh服务复制代码

5.ls命令

众所周知,ls命令用于查看当前目录下的文件信息,对于ls命令下的各个参数,各自的含义如下:

  • ls -l 查看文件的详细信息,例如:

Linux/Vim命令(持续更新)_Vim命令_02 如何区分可执行程序:windows(.exe/.bat/.com) linux(只看该文件的x位)所以,对于Linux系统,可以通过chmod {n}{n}{n}的方式,让文本文件修改为可执行的:Linux/Vim命令(持续更新)_Vim命令_03

  • ls -h 把文件大小换算为人类可读的k/m/g等单位
  • ls -a 查看所有文件,包括隐藏文件(以.开头的文件)

6.其他

  • echo -打印内容,可以通过:echo $PATH --打印环境变量 | echo $HOME --打印HOME目录
  • export -显示系统中的所有环境变量,并且可以通过export AAA=BBB | unset AAA增加|删除环境变量,(在原有环境变量的基础上增加内容使用:export PATH=$PATH:{新增内容})但是注意:在shell中对环境变量的修改,只生效于当前shell中,新建shell则修改失效。
  • file-识别文件的编码和类型
  • ln -创建一个链接
  • mv a b-将文件a移动到文件夹b中
  • apt get | remove安装或卸载
  • history | grep {过滤的关键字}
  • alias指定别名,例如:alias java8 = /root/jdk8u262-b10/bin/java
  • | grep过滤结果
  • | wc -l统计行数

注意:

  • 1.命令行参数中如果存在*,会存在参数的展开问题
  • 2.命令行中的" "也会存在参数展开,但是' '则会原封不动的显示,例如:

Linux/Vim命令(持续更新)_Linux_04

7.进程相关

  • 1.pstree--查看进程树,可选参数-a:显示每个进程的完整指令|-p 显示进程的pid

8.如何将当前session中的export,alias进行持久化

前面提到,在当前session中对环境变量,以及alias所作的修改,在退出登录或者关闭窗口后,所作修改会失效。那么如何将其持久化:

  • 1.如果修改只需要对当前用户生效,则只修改~/.bash_profile文件即可,如果需要对所有用户生效,则修改/etc/.bash_profile文件。
  • 2.修改完成后,重新打开session会话,
    或者. ~/.bash_profile | source ~/.bash_profile使得修改立即生效。举例:

Linux/Vim命令(持续更新)_Vim命令_05

9.常见问题处理

9.1 Linux中端口被占用
  • 使用lsof -i:端口号 查询端口被哪个进程占用
  • 使用sudo kill -9 进程PID 删除指定的PID进程

10.编写Shell脚本

shell脚本的第一行,用于指定shell脚本实际调用程序,前两个字符称为Shebang,由#!构成,例如#!/bin/sh或者(#!/user/bin/env bash),更推荐写后者,后者会去环境变量中找可执行的程序。

  • Shell脚本中," "包裹的内容会展开,先去本地变量中查找,再去环境变量中查找,找不到则置为空。' '包裹的内容会原样打印输出。
  • Shell脚本中,空格很重要,不需要的地方不要随便加空格,并且一个空格与两个空格的作用不相同。
  • Shell中的条件判断,以if开始,fi结束,其他语句同样适用。
符号含义符号含义
-nstring is not null.-zstring is null, that is, has zero length
-fTrue if file exists and is a regular file.(regular文件指的是常规文件,文本、图片、可执行文件等,软链接排除).(点)相当于source命令
-hif file exists and is a symbolic link.expr用于在Linux中执行表达式,详细内容看参考文档2
`{cmd}` 反引号被反引号包裹的部分,为将要执行的命令。; 分号命令分隔符,一行中的多个命令用分号分隔。
$$Shell本身的PID$!Shell最后运行的后台PID
$?命令执行结束的返回值$* | $@返回所有的参数,后者用" "分隔
$#添加到Shell的参数个数$0Shell本身的文件名
$1-$n添加到Shell的各参数值${x:-1}if the third argument is null or unset, replace it with what's after :-
export将变量导出至该进程fork出来的子进程中使用exec用一个新的子进程,代替原有的进程
-x在Shell脚本中,在shebang中加入-x参数,可以在执行该脚本的同时,打印Shell中定义的变量信息