始终记住,命令行的四大要素:环境变量、可执行程序、工作路径、参数。
1.stdin stdout stderr
在操作系统中,每一个进程都绑定了三个文件,暨stdin
、stdout
、stderr
,他们之间用文件描述符fd
区分:
所以可以根据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 查看文件的详细信息,例如:
如何区分可执行程序:windows(.exe/.bat/.com) linux(只看该文件的x位)
所以,对于Linux系统,可以通过chmod {n}{n}{n}
的方式,让文本文件修改为可执行的:
- 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.命令行中的
" "
也会存在参数展开,但是' '
则会原封不动的显示,例如:
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
使得修改立即生效。举例:
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
结束,其他语句同样适用。
符号 | 含义 | 符号 | 含义 |
---|---|---|---|
-n | string is not null. | -z | string is null, that is, has zero length |
-f | True if file exists and is a regular file.(regular文件指的是常规文件,文本、图片、可执行文件等,软链接排除) | .(点) | 相当于source命令 |
-h | if file exists and is a symbolic link. | expr | 用于在Linux中执行表达式,详细内容看参考文档2 |
`{cmd}` 反引号 | 被反引号包裹的部分,为将要执行的命令。 | ; 分号 | 命令分隔符,一行中的多个命令用分号分隔。 |
$$ | Shell本身的PID | $! | Shell最后运行的后台PID |
$? | 命令执行结束的返回值 | $* | $@ | 返回所有的参数,后者用" "分隔 |
$# | 添加到Shell的参数个数 | $0 | Shell本身的文件名 |
$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中定义的变量信息 | ||