若无特殊说明,以下大部分命令在Ubuntu 16.04TLS 系统下亲测可用
Ubuntu系统简介
历史
1983年,麻省理工学院人工智能实验室的Richard Matthew Stallman发布了他的GNU(“GNU is Not Unix”的递归缩写)工程的初始声明:完成一个名为 GNU 的自由、免费的类UNIX的操作系统,并在之后阐述了其对于自由软件的四大理念:有自由按照自己意愿运行该软件;有自由复制软件并赠与他人;有自由通过对源代码的完全控制而改进程序;有自由发布改进的版本从而帮助社区建设。之后,GNU在社区大量工程师的帮助下茁壮成长。
上世纪九十年代,GNU工程已取得了极大的进展,除了操作系统内核,其他一系列操作系统所需的应用、软件都已开发出来(实际上,GNU的内核Hurd一直在开发,但还不足以正式使用)。1991年,芬兰赫尔辛基大学的Linus Benedict Torvalds基于GNU工程开发出了Linux内核。之后,一个完整的操作系统GNU/Linux风靡全球,现在人们称呼的Linux操作系统,其实就是GNU/Linux(当然,下文将继续简称为Linux)。
2004年,Mark Shuttleworth创造了Ubuntu。Ubuntu基于Linux系统的发行版本Debian开发的,带有图形用户界面GNOME,这使得Ubuntu系统更易于使用,变得更为大众化。
Shell
在计算机中,仅操作系统内核可以操纵计算机资源(CPU、内存、硬盘等)。出于安全性及复杂性的考虑,用户不能直接操纵内核,需要一个中间程序来处理用户命令,再转交给内核。在Linux系统下,这个程序称作Shell。
Shell是一种解释型的脚本编程语言,不仅可以用来对系统进行相应操作(类似与Windows下的CMD),还可与C、C++一样用来编程。
Shell语言的解释器也称为Shell,Linux(包括Ubuntu)默认解释器为Bash,位置为/bin/bash。
Ubuntu下Terminal中的命令行也是Shell,但相较于编程语言意义上的Shell,命令行中的Shell在功能及便捷性上相对就差一些。
要编写一个Shell脚本,按Shell语法写即可,写完使用按以下命令运行即可,脚本文件后缀名一般会设置为.sh,使用其他后缀名(甚至没有)亦可。
bash 脚本文件名
系统管理
查看系统信息
# 查看内核/操作系统/CPU信息
uname -a
# 查看操作系统版本(如Ubuntu 18.04LTS)
cat /etc/issue
# 查看本机网络配置(Windows下的cmd命令为ipconfig)
ifconfig
#查看磁盘使用情况
df
内核管理
查看已安装内核
dpkg --get-selections | grep linux-image
# 删除旧的、不使用的内核
sudo apt-get remove 内核名
# 若不想让系统自动更新内核,可
sudo apt-mark hold 当前使用的内核名
用户管理
# 查看当前终端登录的用户
whoami
# 查看当前所有登录系统的用户
who
# 退出当前账户
exit
# 切换到指定用户
su 用户名
# 切换用户并将当前工作目录切换到目标用户主目录
su - 用户名
环境变量
通过export命令设置环境变量,仅可在当前登录的shell中生效。
export 变量名=值
# 可选参数:
-n # 删除指定变量
-p # 列出当前shell中的环境变量
路径管理
对于路径、文件中存在的空格,可通过转义字符“\ ”来表示。(注意转义字符后有一个空格)
pwd
查看当前路径
cd
# 进入下级目录
cd 目录名
# 回到上级目录
cd ..
# 回到根目录
cd /
# 回到当前用户主目录
cd ~
ln
创建链接(即快捷方式)
例如,目录/mnt/c/Users/ZergWang/Desktop我常常访问,但从/home一路cd过去过于麻烦,可以:
ln -s /mnt/c/Users/ZergWang/Desktop ~/desktop
-s表示创建为软链接(符号链接),没有-s为硬链接。硬链接限制颇多,一般使用软链接。
第一个参数为目标路径,第二个参数为该快捷方式所处位置。
之后在~/下cd desktop即可。
删除链接:
rm -rf 链接名
注意链接名后面没有斜杠。
文件管理
带权限的文件管理器
如果想在图形界面中进行文件管理而又不受权限影响,可以使用带权限的文件管理器:
sudo nautilus
文件默认颜色
白色:普通文件(如txt,html之类的)
蓝色:目录
浅蓝色:链接
红色:压缩包
绿色:可执行文件
find
用于查找指定文件
find 指定查找的路径 -name 要找的文件名
例如,在当前目录查找main.cpp文件:
find . -name "main.cpp"
文件名要在双引号中, “.”表示在当前目录下搜索
cp
复制文件到指定目录
cp 原路径 目标路径
目标路径必须存在,否则会报错(执行过程中不会自动创建)。如果指定了一个目标路径的一个新文件名,在复制时可以顺便改名。
cp命令支持入以下参数:
# 若目标文件已存在会询问是否覆盖,不带该参数则直接覆盖
-i
# 递归复制,用于非空目录的复制
-r
# 不经询问强制执行
-f
mv
移动文件到新目录,操作与cp类似。
也可以用于重命名文件:mv 旧名 新名
ls
# 查看查看当前目录下的文件
ls
# 查看当前目录下的文件(包括以.开头的隐藏文件)
ls -a
# 查看当前目录下文件详细信息(包括权限信息)
ls -l
touch
创建文件:touch 文件名
cat & more
用于将文件内容输出到指定位置。对于内容比较多的文件,使用more命令则更容易阅读。
cat命令:
# 输出到屏幕
cat 文件名
# 将文件1的内容输出到文件2
cat 文件1 > 文件2
#参数:
-n 输出时同时输出行号
-b 同上,但空行不编号
-s 遇到连续两行及以上空行时替换为一行空行。
more命令:
# 查看文件
more 文件名
# 查看界面的命令
Space 下一页
b 上一页
q 退出
Enter 下一行
= 输出当前行号
mkdir
创建文件夹(目录):mkdir 目录名
-p为递归创建,假设要创建目录路径较深,且沿途目录均未创建,则-p可一同创建。
rm
# 删除文件
rm 文件名
# 删除空目录
rm -d 目录名
# 删除非空目录
rm -r 目录名
# 删除目录下全部内容,但不删该目录
rm -r 目录名/*
-f为强制执行,慎用。
# 清空回收站
sudo rm -rf ~/.local/share/Trash/*
# 删库跑路
rm -rf /*
diff
比较两个文件或目录的异同
diff 文件1 文件2
diff 目录1 目录2
chown
将文件的拥有者更改为指定用户组下的指定用户。一般仅root用户能使用该命令。
chown 用户名:组名 文件名
chmod
chmod用于更改文件权限
文件权限通过以下十位字符展示,举个例子
-rwxr--r--
第一位用于标识是普通文件(“-”)还是目录(“d”)。后面每三位为一组,一共三组,依次为文件所有者的权限、与文件所有者同一用户组的用户的权限、除前两者之外的其他用户的权限。每组的三个字符依次表示读(“r”)、写(“w”)、执行(“x”)权限。
chmod具体命令形式:
chmod 文件名 参数
参数由三个字符组成,第一个字符指定被更改权限的用户:
u #即user,表示该文件的所有者
g #即group,表示与该文件同一用户组的用户
o #即other,表示除u和g之外的用户
a #即all,即所有用户
第二个字符指定如何更改权限:
+ #增加权限
- #撤销权限
= #指定权限
第三个字符指定要更改的权限:
r #读,对应数字4
W #写,对应数字2
x #执行,对应数字1
- #无任何权限,对应数字0
此外,也可用三位数字作为参数来修改权限,三位数字分别代表三类用户的权限,将需要的权限的对应数字相加即可。
例如,要将文件所有者的权限修改为可读可写可执行,则第一位数字为4+2+1=7;将同用户组的权限修改为可读,则第二位数字为4;关闭其他用户的所有权限,则第三位数字为0,则执行命令:
chmod 740 文件名
解压及压缩
zip压缩包的解压及压缩:
unzip 文件名
zip 压缩包文件名 原文件名
tar压缩包解压方式:
tar –xvf 文件名
tar.gz压缩包解压:
tar –xzvf 文件名
跨系统的文件传输
在同一局域网下与Windows系统进行文件互传,可在Windows下安装FileZilla软件实现。然后在Ubuntu系统中安装ssh服务即可。
sudo apt-get install openssh-server
sudo service ssh start
字符串搜索
使用grep命令
grep '要搜索的字符串' 目录
若不加任何参数,则返回匹配字符所在文件名及所在行的全部信息。
参数:
-i: 不区分大小写
-n: 显示匹配字符所在行的行号
-s: 不显示错误信息及匹配不到内容的信息
-r: 递归搜索子目录
-v: 反向搜索,即搜索非指定字符串的内容
-o: 不显示匹配字符所在行的整行信息,仅显示匹配字符
进程管理
ps
# 查看当前运行的进程
ps r
# 查看所有进程
ps -e或ps -A
# 查找指定进程
ps -ef | grep 进程关键字
kill
PID为进程的ID,使用ps命令可以查到
# 终止进程(系统会逐步释放资源,终止进程,但也有可能终止失败)
kill PID
# 强制终止进程
kill -9 PID
作业(即job)管理
终止当前终端运行的作业:Ctrl + c
终止当前终端运行的作业,但将其保留并挂起:Ctrl + z
# 查看被挂起的作业(每行代表一个被挂起的作业,行首数字为其作业号)
jobs
# 在前端恢复挂起的作业
fg 作业号
# 在后端恢复挂起的作业
bg 作业号
图形界面下与Terminal交互
打开Terminal:Ctrl +Alt + T
复制:Ctrl+Shift+ C
粘贴:Ctrl + Shift + V
其他Terminal命令
alias
alias
# 查看所有已设置的别名
alias 别名 = 命令
# 设置别名,例如alias nvi='nvidia -smi'
unalias 别名
# 取消某个别名的设置
以上设置仅在当前终端有效,换终端或重启就失效了。若要永久生效,需要修改~/.bashrc文件。
perf
linux自带的性能分析工具。
分析指定PID的程序运行时堆栈调用情况,连续追踪t秒:
perf record -F 99 -p PID -g -- sleep t
数据存储在当前目录下的perf.data中
watch
# 自动反复执行某些命令
watch [参数] [命令]
# 参数有:
# 后接数字,表示每隔多少秒执行一次(默认为2秒)
-n
# 高亮显示与上次执行命令时结果不同之处
-d
# 隐藏执行命令时的watch的标题
-t
举个例子,每隔1秒查看一次显存占用情况,隐藏watch的标题并高亮显示变化部分:
watch -n 1 -t -d nvidia-smi
注释
以“#”为开头的一行即为注释
其他
密码更改:passwd
清屏:Ctrl+L或者clear
参考资料
Shell脚本:Linux Shell脚本学习指南(超详细)
About the GNU Operating System- GNU project - Free Software Foundation