目录

linux 基本命令使用

一、认识linux

linux发行版本
deb派系--桌面版系统

1、Debian(读音:‘debeen 待宾)
2、Ubuntu(读音:u’bʌntu 乌班图)
3、Deepin(读音:diːpin 低评)
……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#〖安装本地软件包方法〗
sudo dpkg -i xxxx.deb     #安装【本地软件包】
sudo dpkg -r xxxx         #卸载【本地软件包】(保留配置)(不保留配置使用 -P 选项)
sudo dpkg -l xxxx         #显示软件的版本

#【安装远程软件包方法】
sudo apt-get install xxxx #安装软件包的最新版本
sudo apt-get remove  xxxx #从系统中删除指定的软件包
sudo apt-get update       #检测已安装软件包是否有更新(如果指定软件名则表示指定软件包是否有更新)
sudo apt-get upgrade xxxx #升级指定的软件包(前提:先运行 update 检测)(而使用 dist-upgrade 则以更聪明的方式来解决更新过程中出现的软件依赖问题)
sudo apt-cache  list xxxx #从资源库中查询可用的软件包
sudo apt-cache search g++ #搜索单词为g++的软件包
sudo apt-cache show   g++ #显示g++软件包详细信息

rpm派系--服务器系统

1、RedHat(读音:‘redhæt [红帽])
2、CentOS(读音:sen’tus 圣斗士)
3、Fedora(读音:fɪ’dɔːrə 费多拉帽)
……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#〖安装本地软件包方法〗
sudo rpm -ivh xxxx.rpm    #安装【本地软件包】(其中 v 显示详细信息,h 显示安装进度)
sudo rpm -e   xxxx        #卸载【本地软件包】
sudo rpm -Uvh xxxx.rpm    #升级软件     (其中 v 显示详细信息,h 显示安装进度)

#【安装远程软件包方法】
sudo yum install xxxx     #安装软件包的最新版本
sudo yum remove  xxxx     #从系统中删除指定的软件包
sudo yum update  xxxx     #升级指定的软件包
sudo yum list             #列出所有可安装的软件包(如果指定软件名则表示列出指定可安装的软件包)
sudo yum list installed   #列出已安装的软件包
sudo yum list updates     #列出所有可更新的软件包

linux在线源码

如果想了解 linux 内核源代码,强烈推荐在 Bootlin 上阅读。
Linux 全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,其内核由 Linus Benedict Torvalds(林纳斯·本纳第克特·托瓦兹)于 1991 年 10 月 5 日首次发布,它主要受到 Minix 和 Unix 思想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux 有上百种不同的发行版,如基于社区开发的 debian、archlinux,和基于商业开发的 Red Hat Enterprise Linux、SUSE、Oracle Linux 等。

linux核心思想

linux 核心思想
首先记住这个:Linux 的核心思想即一切皆是文件,设备是文件,系统是文件。比如在我们插入一个 USB 设备,/etc 的目录下多一个 USB 设备的文件夹。而对 USB 所有的操作都是通过读写这个文件进行。脚本(Script /skrɪpt/)是存储在文件中的命令的集合,命令(Command /kə'mɑːnd/)是针对计算机的指令,终端/控制台(tty,Termial /'tɜːmɪnl//console /kən'səʊl/)是命令行接口,壳(Shell /ʃel/)是一个命令行解释器,内核(Kernel /'kɜːnl/)是 Linux 操作系统的核心。


linux 脚本解释器
Bash /bæʃ/是大多数 Linux 系统默认的 shell 脚本解释器(注:我们平时说 Linux 中有多少种 shell 其实指的就是其中存在几种 shell 脚本解释器),可以使用命令cat /etc/shells打开文件查看到系统可用的 shell 。在脚本文件中,我们常看到第一行内容为#!/bin/bash,表示告知系统使用哪个脚本解释器来执行脚本文件,即使用哪一种 shell 。(补充:Bourne Again shell /bʊən/ə'ɡen/ʃel/(简写为 Bash)(标记为#!/bin/bash)是 Bourne shell(标记为#!/bin/sh) 的扩展,与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加、增强了很多特性。特别说明#!/bin/bash这些信息在首行且必须使用\n来换行,不能是\r\n之类的来换行,否则会提示 ^M 错误!!!


linux 环境变量
shell 中环境变量变量分三种:内部变量、系统变量、用户变量。
内部变量:系统提供,不用定义,不可修改;($$ $? $0 $# $* $@ $1 … $SHELL(当前使用的shell(路径)) $HOME(家目录)
系统变量:系统提供,不用定义,可以修改,利用export将用户变量转为系统变量;
用户变量:用户提供,用户定义,可以修改,利用export将用户变量转为系统变量;
环境变量(environment variables /ɪn'vaɪrənmənt/'veəriəbls/)一般是指在操作系统中用来指定操作系统运行环境的一些参数,其中一个目的是告诉系统知道应用程序所在哪个路径下,让系统可直接运行应用程序(如果应用程序已在系统标准位置下,则不需要增加环境变量。linux系统几个标准位置:/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin 等)(Windown 系统使用分号分隔,而 linux 系统使用冒号分隔)。一般提到的环境变量主要指系统变量。环境变量配置推荐:如果要修改所有用户环境配置的话修改/etc/profile,修改单个用户的话修改~/.bashrc(如:开发板的 /root/.bashrc)。
1.1、export显示包括利用 export 将用户变量转为环境变量的 shell 变量。
1.2、echo $PATH命令为输出当前的 PATH 环境变量的值(以冒号分割不同路径)
1.3、export PATH=$PATH:/home/abc/mysql/bin可临时/永久配置环境变量(例子)。
2.1、/etc/environment整个系统环境变量,不能使用 export PATH,不建议改!
2.2、/etc/profile所有用户环境变量,只在用户登录的时候读取一次。
2.3、/etc/bash.bashrc所有用户环境变量,每次运行 Shell 就会读取一次,影响效率。
2.4、~/.profile只针对当前用户,只在用户登录的时候读取一次(不同系统可能是:~/.bash_profile、~/.bash_login、~/.profile)
2.5、~/.bashrc只针对当前用户,每次运行 Shell 就会读取一次。
2.6、source xxxxxx手动生效上面脚本文件(如:source /etc/profile)。

linux软件安装

所谓命令,其实就是在终端机下调用某个软件(工具)运行。这些软件大部分是系统自带的,但有些需要我们去安装,安装的方式有在线安装、离线安装(离线软件包括:解压版、源码版、安装版)。
在线版:利用系统提供的服务,直接运行命令安装软件;(常规方式)
解压版:直接解压即可使用,建议移到合理目录;(推荐方式)
源码版:先编译源代码,再复制到目标(板)运行;
安装版:执行后按照提示安装;
【补充:通常还需要配置环境变量!】

在线版-安装示例:

1
2
sudo apt-get update                  # 更新软件包列表
sudo apt-get install python3         # 安装python3

解压版-安装示例:

1
2
3
4
5
6
7
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 # 下载交叉编译器压缩包
sudo tar -xjvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /usr/lib/gcc # 将交叉编译器压缩包解压到:/usr/lib/gcc
sudo gedit /etc/profile              # 打开环境变量,在文件最后添加内容:export PATH=$PATH:/usr/lib/gcc/gcc-arm-none-eabi-10.3-2021.10/bin
source /etc/profile                  # 使能环境变量。
sudo apt-get install lsb-core        # 64位操作系统需要安装32位依赖库:lsb-core     (arm-none-eabi-gcc 用到)
sudo apt-get install lib32ncurses5   # 64位操作系统需要安装32位依赖库:lib32ncurses5(arm-none-eabi-gdb 用到)
arm-none-eabi-gcc -v                 # 查看版本(验证是否安装成功)

源码版-安装示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
wget https://cgdb.me/files/cgdb-0.8.0.tar.gz  # 下载软件源码
sudo tar -xzvf cgdb-0.8.0.tar.gz     # 解压文件
cd cgdb                              # 进入文件夹
./autogen.sh                         # 自动生成配置(文件)(前提需要安装依赖:sudo apt-get install autoconf automake libtool-bin)
./configure --prefix=/usr/local/cgdb # 手工修改配置,并设置安装目录
sudo gedit /etc/profile              # 打开环境变量,在文件最后添加内容:export PATH=$PATH:/usr/local/cgdb/bin
source /etc/profile                  # 使能环境变量。
make                                 # 编译CGDB软件,
sudo make install                    # 安装CGDB软件。
cgdb --version                       # 查看CGDB版本(验证是否安装成功)

多版本共存处理方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 例如系统自带了【gcc-5.4】版,现在又要安装【gcc-9】版。    # 扩展:【apt命令Linux发行商都在推荐】(网文`apt`对比`apt-get`:https://www.sysgeek.cn/apt-vs-apt-get/)
sudo apt install software-properties-common          # 安装`PPA`仓库工具(只需要安装一次)
sudo add-apt-repository ppa:ubuntu-toolchain-r/test  # 加入`PPA`仓库  (gcc 新版本仓库)
sudo apt update                                      # 更新`PPA`仓库信息
sudo apt install gcc-9 g++-9                         # 安装`GCC`和`G++`(安装 gcc g++ 9)

#####加gcc版本优先级方法#####                           # 注意要把之前在环境变量加入的软件执行文件路径移除,否则可能会冲突!
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90  --slave /usr/bin/g++ g++ /usr/bin/g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 999 --slave /usr/bin/g++ g++ /usr/bin/g++-5

#####选择gcc工作版本方法#####                           # alternative /ɔːl'tɜːnətɪv/ 可选
sudo update-alternatives --config gcc                # 选择gcc工作版本,根据界面提示输入对应数字+回车选择
                                                     # ● 原理只是快捷方式链接不同对象 ●
#####移除gcc某优先级方法#####
sudo update-alternatives --remove gcc /usr/bin/gcc-9 # 移除 gcc 9 的优先级(将从优先级列表中移除)

#####移除专用PPA仓库方法#####
sudo add-apt-repository --remove ppa:ubuntu-toolchain-r/test
                                                     # 移除上面加入的PPA仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 又如安装【node】两个版本

####下载软件####
wget https://nodejs.org/dist/latest-v10.x/node-v10.24.1-linux-x64.tar.xz  # 在命令窗口直接下载[node-v10.24.1]
wget https://nodejs.org/dist/latest-v10.x/node-v16.19.0-linux-x64.tar.xz  # 在命令窗口直接下载[node-v16.19.0]
tar -xf node-v10.24.1-linux-x64.tar.xz                                    # 将压缩包解压到当前目录
tar -xf node-v16.19.0-linux-x64.tar.xz                                    # 将压缩包解压到当前目录
sudo mv node-v10.24.1-linux-x64 /usr/local/node-v10.24.1                  # 将文件夹移到/usr/local/目录并重命令为[node-v10.24.1]
sudo mv node-v16.19.0-linux-x64 /usr/local/node-v16.19.0                  # 将文件夹移到/usr/local/目录并重命令为[node-v16.19.0]

####加入列表####
sudo update-alternatives --install /usr/bin/node node /usr/local/node-v10.24.1/bin/node 1024 --slave /usr/bin/npm npm /usr/local/node-v10.24.1/bin/npm
sudo update-alternatives --install /usr/bin/node node /usr/local/node-v16.19.0/bin/node 1619 --slave /usr/bin/npm npm /usr/local/node-v16.19.0/bin/npm
#sudo update-alternatives --remove node /usr/local/node-v10.24.1/bin/node # 移除某项列表的方法

####选择版本####
sudo update-alternatives --config node               # 选择默认版本,根据界面提示输入对应数字+回车选择

linux命令常识

●【命令的基本格式】:
command [options] [arguments]
选项options(/‘ɒpʃnz/)是命令的行为开关,分为短选项和长选项,短选项-例如:-l -a,某些可组合-例如-la,其带子参数为-p 1234(通常中间使用空格),长选项-例如:--help,其带子参数为--size=1G(通常中间使用=)。补充:选项一般在命令右边及作用对象的左边。
参数arguments(/‘ɑːgjʊmənts/)是命令的作用对象,例如:cat 123.txt表示查看 123.txt 文件内容。


●【多条命令方式】:
command_1; command_2; command_3表示如果一件事情需要多行命令运行,无论命令成功与否都会往下一条指令执行,免去等待时间;
command_1 && command_2表示如果一件事情需要多行命令运行,并确保命令【成功】才往下一条指令执行,例如:一些编译命令;
command_1 || command_2表示如果一件事情需要多行命令运行,并确保命令【失败】才往下一条指令执行;
command_1 & command_2表示两行命令【同时】执行(补充:实际优先执行前行命令)


●【在 bash 中的 命令、选项、参数 处理方式】:网文
直接来处理,依次对 $1, $2, ..., $n 进行解析。
getopts来处理,只能处理单个字符选项的情况(如:-n 10 -f file.txt等)。
getopt来处理,既可处理单个字符选项,也可处理长选项(如:–prefix=/home等)。


●【. .. / $ % = - – | > » ~ # 常识网文
. 一般表示当前位置
.. 一般表示上一级位置
/ 一般表示文件夹或路径
$ 一般表示变量/参数/最尾部
% 一般表示通配符/所有
= 一般表示赋值
- 一般表示短选项
-- 一般表示长选项
| 一般表示管道命令
> 一般表示以覆盖方式输出保存至某文件
>> 一般表示以追加方式输出保存至某文件
~ 一般表示用户 home 目录
# 一般表示注释(在脚本中)


●【-a -l -n -t -r -f -i -v -u -p 常用选项
-a 一般表示全部
-l 一般表示列表
-n 一般表示行/行号
-t 一般表示类型
-r 一般表示递归/文件夹/重启
-f 一般表示强制/文件
-i 一般表示互动/输入/不区分大小写
-v 一般表示详情
-u 一般表示用户/差异
-p 一般表示密码/进程号

linux命令资料
  1. Linux 的一些基础命令汇总
  2. 必知必会的 Linux 命令
  3. 鸟哥的 Linux 私房菜 - 基础学习篇
  4. Linux 笔记:核心思想、常用命令以及脚本语法
  5. 菜鸟教程-shell
  6. Ubuntu系统环境变量详解
  7. Linux 环境变量配置汇总
  8. Linux export、set、env和source作用详解
  9. 常见编程语言选择
  10. 作为程序员的你,常用的工具软件有哪些?
  11. Codelf 帮开发者命名变量的开源搜索服务
  12. 单片机 -> RTOS -> Linux

二、基本命令

1、常用的快速键

Ubuntu 拥有多个操作终端(使用Ctrl+Alt+F1~F7切换),F7为系统默认启动&加载的图形操作终端,其余都是为纯命令行界面终端。

  • Ctrl+Alt+F1切换到命令行界面终端。
  • Ctrl+Alt+F7切换到图形界面终端。
  • Ctrl+Alt+t图形界面下打开命令行终端机。
  • Ctrl+d关闭当前命令行终端机(纯终端则重启)。
  • Ctrl+c强制退出在当前命令行终端机的程序。
  • Ctrl+Insert复制选择的文本内容。
  • Shift+Insert粘贴缓存的文本内容。
  • Ctrl+a 或 Home转到行的开头。
  • Ctrl+e 或 End转到行的结尾。
  • Ctrl+u把光标前面的内容全删掉。
  • Ctrl+k把光标后面的内容全删掉。
  • Ctrl+l输入行移到页面顶部(相当清屏)。
  • ↑ 和 ↓方向键调取之前执行过的 Linux 命令。
  • Tab 自动补全命令,提高输入速度及精准度。
  • $ 命令行前面显示此字符,表示以用户权限操作。
  • # 命令行前面显示此字符,表示管理员权限操作。(root 权限)
2、系统权限操作

sudo su chmod chown chgrp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
sudo su                             # su 仅仅取得 root 权限,工作环境不变。
su root                             # 切换到root
exit                                # 退出root(前提已进入root)
                                    # 【关于提示符】: 
                                    # ~$ 表示处于普通用户权限
                                    # ~# 表示处于 root 权限
sudo passwd                         # 设置root的密码 (根据提示输入:一般先要经过输入当前用户密码验证,再输入两次设置root新密码)
                                    # 【扩展说明】: 
                                    # [su   ] 向当前用户授权管理员权限级别许可,但工作环境没有任何变动
                                    # [sudo ] 以管理员身份操作(只在操作过程中变成管理员工作环境,平常还是当前用户工作环境)
                                    # [chmod] 修改文件(夹)操作权限,特别是从Windows拷贝到linux时,经常要改权限,否则不能执行
sudo chmod 777 /srv/ftp/upload      # 对目录[/srv/ftp/upload]拥有者rwx,用户组rwx,其它用户rwx
sudo chmod 751 /srv/ftp/download    # 对目录[/srv/ftp/upload]拥有者rwx,用户组r-x,其它用户--x
sudo chmod ug+rw /srv/ftp/upload    # 对目录[/srv/ftp/upload]拥有者u和用户组g[增加]读r和写w权限
sudo chmod ug-rw /srv/ftp/upload    # 对目录[/srv/ftp/upload]拥有者u和用户组g[移除]读r和写w权限
sudo chmod ug=rw /srv/ftp/upload    # 对目录[/srv/ftp/upload]拥有者u和用户组g[设为]读r和写w权限
                                    # 【扩展说明】: 
                                    # [u] 表文件拥有者  |  [+] 添加某个权限  |  [r] 可读
                                    # [g] 表示同组用户  |  [-] 取消某个权限  |  [w] 可写 
                                    # [o] 表示其它用户  |  [=] 重设 rwx权限  |  [x] 可执行
                                    # [a] 表示全部用户  |                    |           
sudo chown root /var/run/httpd.pid  # 改变 /var/run/httpd.pid 文件的拥有者为 root
sudo chown runoob:runoobgroup f.txt # 改变 f.txt   文件的拥有者为 runoob,用户组为 runoobgroup 
sudo chown xiaomin 123.txt          # 改变 123.txt 文件的拥有者为 xiaomin
sudo chown -R xiaomin /home/abc/    # 改变 /home/abc/ 目录及其下面所有文件(夹)的拥有者为 xiaomin(拥有者owner /'əʊnə(r)/)
sudo chgrp -R xiaomin /home/abc/    # 改变 /home/abc/ 目录及其下面所有文件(夹)的用户组为 xiaomin(用户组group /ɡruːp/)
                                    # 【权限总结】:
                                    # 1.文件(夹)的拥有者(用户/用户组)
                                    # 2.拥有者的操作权限(读/写/执行)

3、根与目录操作

cd ./ ../ pwd ls ll !! tree

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
cd ..                               # 退回上一级目录
cd ../..                            # 退回上两级目录
cd ftp/upload                       # 进入当前子目录
cd ./ftp/upload                     # 进入当前子目录(同上)(平常可以省略[./])
cd /usr/local                       # 进入  绝对目录
                                    # [../] 表示相对路径(上级目录)
                                    # [./]  表示相对路径(当前目录)
                                    # [/]   表示绝对路径
                                    # [~]   表示家目录
cd ~                                # 进入当前用户的家目录
cd -                                # 回到之前所在的目录
pwd                                 # 显示当前工作目录的全路径 (print working directory)
!!                                  # 显示上一条命令及上一条命令的结果
./qt-creator-linux-x86.run          # 运行[qt-creator-linux-x86.run]此文件
ls                                  # 查看当前目录下文件
ls upload                           # 查看当前目录下[upload]目录下文件
ls *.o                              # 查看当前目录下扩展名为[*.o]的相关文件
ls -l > lsoutput.txt                # 以长格式显示文件的详细信息, 直接将打印内容保存到当前目录下lsoutput.txt(创建覆盖内容)
ls -l >> lsoutput.txt               # 以长格式显示文件的详细信息, 直接将打印内容保存到当前目录下lsoutput.txt(尾部插入内容)
ls -R                               # 连同子目录的内容一起列出(递归列出)
ls -a                               # 显示所有文件(包含以点(.)开头的隐藏文件)
ls -l                               # 以长格式显示文件的详细信息,可以查看文件权限,所属用户,日期等
ll                                  # 同 ls -l(其它选项:-t 按修改时间列出,-s 显示出大小)
ls -l libmad.so.0                   # 以长格式显示文件的详细信息查看 libmad.so.0 文件
ls -l | grep rwxrwxr-               # 列出当前目录文件(夹),但只显示经过[grep]筛选含有[rwxrwxr-]的内容(grep是独立命令,|是管道命令)
                                    # 【扩展说明】: 
                                    # 文件属性第一个字符表示是什么? 如: -rwxrwxrwx, drwxrwxrwx, ……
                                    # [-] 常规文档(regular file): 纯文本文档(ASCII),二进制文件(binary),数据格式文件(data)
                                    # [d] 目录(directory)
                                    # [l] 连接文件(link),就是类似 Windows 系统底下的快捷方式
                                    # [b] 区块(block)设备文件
                                    # [c] 字符(character)设备文件
                                    # [s] 资料接口文件(sockets)
                                    # [p] 数据输送文件(FIFO, pipe)
tree                                # 列出指定目录下的所有文件(夹),包括子目录里的文件(夹)
tree -L 1                           # 显示一级目录和文件
tree -L 1 -d                        # 显示一级目录
                                    
                                    # 【目录结构】:
                                    # /bin:  常用命令(二进制执行文件)
                                    # /sbin: 系统命令(二进制执行文件)
                                    # /dev:  设备文件目录(设备以档案形态存于本目录)
                                    # /media:可移动媒体设备挂载目录(与/mnt无本质区别)
                                    # /mnt:  存储设备挂载目录(一般为挂载临时的安装目录)
                                    # /etc:  系统配置文件目录
                                    # /home: 用户主目录
                                    # /root: 管理员主目录
                                    # /opt:  可选的附加应用程序(第三方协力软件)
                                    # /boot: 系统内核文件和引导装载程序文件
                                    # /lib:  存放系统的库文件
                                    # /proc: 虚拟机系统,记录进程,网络信息等
                                    # /sys:  虚拟文件系统,记录内核数据
                                    # /var:  系统运行产生的文件
                                    # /usr:  用户程序目录(Unix Software Resource)
                                    
                                    # /usr/bin       — 众多的应用程序(是对/bin、/sbin的一个补充)
                                    # /usr/sbin      — 超级用户的一些管理程序(是对/bin、/sbin的一个补充)
                                    # /usr/doc       — linux文档
                                    # /usr/include   — linux下开发和编译应用程序所需要的头文件
                                    # /usr/lib       — 常用的动态链接库和软件包的配置文件
                                    # /usr/man       — 帮助文档--linux在线使用手册
                                    # /usr/src       — 源代码,linux内核的源代码就放在/usr/src/linux里
                                    # /usr/local/bin — 本地的程序一般安装在此,这样可以在升级新版本时无须重新安装全部程序
                                    # /usr/local/lib — 本地增加的库
                                    # /usr/local/etc — 本地配置文件和目录

4、文件(夹) 操作

mkdir touch cp mv rm find locate ln zip unzip tar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mkdir linuxeye                      # 在当前目录创建[一层目录]:linuxeye
mkdir -p /opt/smart210/linux        # 在指定目录创建[多层目录](注:如果此目录已存在则不受影响)
touch a.txt                         # 新建[a.txt]文件

cp /home/tslib.tar.gz /usr/local/   # 绝对路径      /home/tslib.tar.gz 复制到 /usr/local
cp upload/tslib.tar.gz /srv/ftp/    # 当前目录下的 upload/tslib.tar.gz 复制到 /srv/ftp
cp -r test /mnt                     # 当前目录下的 【文件夹】     test 复制到 /mnt (-r表示目录拷贝(递归复制))
cp -ra test /mnt                    # 当前目录下的 【文件夹】     test 复制到 /mnt (包括修改时间、权限、链接等所有属性也拷贝)
cp -rp test /mnt                    # 当前目录下的 【文件夹】     test 复制到 /mnt (还把其修改时间和访问权限也复制到新文件中)
cp -s 123.txt 321.txt               # 创建软链接(具体请查看 ln -s)
cp -l 123.txt 321.txt               # 创建硬链接(具体请查看 ln   )
mv linux linuxeye                   # 将linux文件(夹)重命名为linuxeye (相同路径就是改名)
mv vhost.sh upload/                 # 将vhost.sh移动到upload目录下    (不同路径就是剪切)
rm init.sh                          # 删除[init.sh]文件(只能删除文件,不能删除目录)
rm -r upload/                       # 删除[upload ]目录(删除目录及其里面所有文件(夹))
rm -i 123.txt                       # 询问是否删除文件(夹)
rm -rf upload                       # 递归强制删除文件或目录 (慎用!!!!!!!!!!!!)(f:force/fɔːs/强制)
                                    # [-v] 详情。显示操作详情。
                                    # [-i] 互动。提示用户确认操作(删除/覆盖)。覆盖:就是复制或移动时覆盖目标文件(夹)
                                    # [-f] 强制。不提示并强制操作(删除/覆盖)。加[-i]选项也没用,所以要谨慎使用!!!!!!
                                    # [-r] 递归。对文件夹递归操作(删除/复制)。也说是操作对象为文件夹,而非文件!!!!!
                                    # [-u] 差异。有文件差异才操作(覆盖)。复制:目标文件与源文件有差异时才会复制;移动:源文件比目标文件新才会覆盖。
find /home -name readme.txt         # 从 /home 目录开始搜索文件 readme.txt
find /home -user xiaomin            # 从 /home 目录开始搜索属于 xiaomin 用户的文件(夹)
find /usr/bin -type f -atime +100   # 搜索【超过100天】未被使用过的【执行文件】
find /usr/bin -type f -mtime -10    # 搜索【 10天以内】被创建或者修改过的文件
locate readme.txt                  # 快速查找 readme.txt 文件(最新变动文件可能搜索不到,用 updatedb 命令更新数据库(索引))

ln -s /usr/local/lib/libmad.so.0 /usr/lib/libmad.so.0 # 软链接:相当于一个文件增加多个快捷方式(它实际上是一个特殊的文件)
ln /bin/readme.txt /usr/local/bin/readme.txt          # 硬链接:相当于一个文件有多个路径及名称(目录不能建立硬链接)
                                    # 1.软链接是可以跨分区的,但是硬链接只能在同一分区内。
                                    # 2.目录不能建立硬链接,但可以建立软链接。
                                    # 3.硬链接可以很好防止“误删”,因为删除操作只删除索引(类似C语言指针);只有最后一个连接被删除,文件内容才会被释放(删除)。
                                    # [ln    源文件 新文件] 等效于 [cp -l 源文件 新文件] 
                                    # [ln -s 源文件 新文件] 等效于 [cp -s 源文件 新文件] 

zip -r file.zip ./tmp               # 压缩[zip    ]文件(-r 递归处理,即所有子目录一并处理)
unzip -q file.zip                   # 解压[zip    ]文件(-q 执行时不显示任何信息)
tar -czvf file.tar.gz ./tmp/abc     # 压缩[tar.gz ]文件
tar -xzvf /tmp/a.tar.gz -C /home/ab # 解压[tar.gz ]文件,指定目录文件到指定目录
tar -xzvf /tmp/a.tar.gz             # 解压[tar.gz ]文件,指定目录文件到当前目录
tar -xjvf php-5.tar.bz2             # 解压[tar.bz2]文件到当前文件夹
                                    # c 压缩
                                    # x 解缩
                                    # z 使用 gzip  压缩解压缩。后缀为[.tar.gz ]
                                    # j 使用 bzip2 压缩解压缩。后缀为[.tar.bz2]
                                    # v 显示过程信息
                                    # f 基于文件
                                    # 注意:z在前面必须加-,即-zxvf;要加f参数必须在最后。

5、文件内容操作

cat head tail more column grep echo gedit vi

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
cat  -n /home/md.c                  # 查看 md.c 文件内容  (同时显示行号)
cat /home/md.c                      # 查看 md.c 文件内容  (连续方式显示)(cat 为 concatenate /kən'kætɪneɪt/ 连续)
head -n  2 desc.txt                 # 查看desc.txt的头两行(连续方式显示)(/hed/ 头部)
tail -n  2 desc.txt                 # 查看desc.txt的尾两行(连续方式显示)(/teɪl/ 尾巴)
tail -n +2 desc.txt                 # 查看desc.txt的第2行到最尾行内容
cat md.c | head -n 30 | tail -n +10 # 查看 md.c   的第10~30行内容(共21行)(操作原理:先截取前部分内容,再截取后部分内容)
cat md.c | tail -n +30 | head -n 10 # 查看 md.c   的第30~39行内容(共10行)(操作原理:先截取后部分内容,再截取前部分内容)
sed 's/aa/bb/g' md.c                # 查看 md.c 文件内容,并已将字符[aa]替换为[bb](只是查看,并没有修改文件)
more md.c                           # 查看 md.c 文件内容  (分页方式显示)
grep "abc" /home/readme.txt         # 在文件中搜索符合要求的文本内容[abc],并把匹配的行打印出来(grep的g-globally-全局,re-regular-正则,p-print-打印)
grep -i "abc" readme.txt            # 在文件中不区分大小搜索文本内容[abc],并把匹配的行打印出来
ps | column -t                      # 显示当前shell下的进程,并使用[| column -t]格式化多列显示
ls -l | grep rwxrwxr-               # 列出当前目录文件(夹),但只显示经过[grep]筛选含有[rwxrwxr-]的内容(grep是独立命令,|是管道命令)
                                    # 【扩展说明】:
                                    # [-i] 筛选不区分大小写
                                    # [-n] 在每一行首加多显示行号
                                    # [-c] 显示相匹配文本的行总数目(如:20表示有20行内容相匹配)
echo $PATH                          # 输出当前环境变量的内容

sudo gedit /home/root/read.txt      # 使用 gedit 编辑 read.txt 文档
sudo vi /home/root/read.txt         # 使用    vi 编辑 read.txt 文档
                                    # 【扩展说明】:
                                    # 
                                    #【命令模式】--------------------------------------
                                    #『光标』+++++++
                                    # [h  ] 光标左移
                                    # [j  ] 光标下移
                                    # [k  ] 光标上移
                                    # [l  ] 光标右移
                                    # [^  ] 光标移到行首
                                    # [$  ] 光标移到行尾
                                    # [5- ] 光标向上移动5行
                                    # [5+ ] 光标向下移动5行
                                    # [5G ] 光标移动到第5行
                                    #『插入』+++++++
                                    # [i  ] 在光标前面插入【进入插入模式】
                                    # [I  ] 所在行最前插入【进入插入模式】
                                    # [a  ] 在光标后面插入【进入插入模式】
                                    # [A  ] 所在行最后插入【进入插入模式】
                                    #『删除』+++++++
                                    # [x  ] 删除光标后[一个字符]
                                    # [X  ] 删除光标前[一个字符]
                                    # [6x ] 删除光标后[六个字符]
                                    # [8X ] 删除光标前[八个字符]
                                    # [dd ] 删除光标所在的[一行]
                                    # [9dd] 删除光标所在行开始的[九行]
                                    #『复制』+++++++
                                    # [yw ] 复制光标后[一段字段] (以空格或符号分隔开的字段!!)
                                    # [yy ] 复制光标所在的[一行]
                                    # [5yw] 复制光标后[五段字段] (以空格或符号分隔开的字段!!)
                                    # [9yy] 复制光标所在行开始的[九行]
                                    #『粘贴』+++++++
                                    # [p  ] 粘贴
                                    #『撤消』+++++++
                                    # [u  ] 最后一次修改[撤消&重做]
                                    # [Ctrl + r]  可多次[撤消]
                                    # 
                                    #【底行模式】--------------------------------------
                                    #『光标』+++++++
                                    # [:5       ] 光标移动到第5行(要按回车执行,下面操作都一样)
                                    # [:set nu  ] 显示行号
                                    # [:set nonu] 不显示行号
                                    #『查找』+++++++
                                    # [/ab] 向下查找"ab"字符串,[n]继续查找下一个
                                    # [?ab] 向上查找"ab"字符串,[n]继续查找上一个
                                    #『替换』+++++++
                                    # [:      s/str1/str2/g] 所在行中所有 str1 字符串替换为 str2
                                    # [:%     s/str1/str2/g] 从[首行]到[最尾]行中所有"str1"字符串替换为"str2"
                                    # [:1,$   s/str1/str2/g] 第[01]行到[最尾]行中所有"str1"字符串替换为"str2"
                                    # [:6,20  s/str1/str2/g] 第[06]行到第[20]行中所有"str1"字符串替换为"str2"
                                    # [:.,20  s/str1/str2/g] [光标]行到第[20]行中所有"str1"字符串替换为"str2"
                                    # [:.,$-5 s/str1/str2/g] [光标]行到尾[05]行中所有"str1"字符串替换为"str2"
                                    #『退出』+++++++      └→g表示整行内容
                                    # [:q!] 不保存退出
                                    # [:wq] 保存退出
                                    # [:w ] 保存文档(但不退出)
                                    # [:w filename] 另存为叫filename的文件(但不退出)

6、远程文件操作

wget ftpget ftpput tftp ftp nfs telnet ssh sftp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
wget http://www.baidu.com                             # 直接使用wget命令下载,默认是不开启断点续传功能的(超详细网文 https://blog.csdn.net/weixin_42915431/article/details/122339184)
wget -c http://www.baidu.com                          # 直接使用wget命令下载,[-c]表示开启断点续传功能的
wget -O /home/tmp http://www.baidu.com                # 直接使用wget命令下载,[-O]指定存放目录并改文件名,本例/home/tmp(改文件名为tmp)
wget -r -l1 -np http://192.168.3.222/D/img/           # 下载文件夹(但附加有一些参数文件),[-r]递归下载文件夹,[-l1]只递归一层(即不下载其目录子文件夹),[-np]不下载父目录中的文件。其它参数:[-nd]不复制服务器目录路径,[-p]下载网页所需的所有文件,[-k]将绝对链接转为相对链接方便下载整个站点后脱机浏览网页,[-L]递归时不进入其它主机
wget --ftp-user=liao --ftp-password=1234 ftp://10.205.1.18/123.txt
                                                      # 使用wget进行FTP下载, FTP用户:liao, FTP密码:1234, 下载:123.txt文件
curl -O http://www.linux.com/hello.sh                 # 下载HTTP文件,[-O]表示下载文件,Ubuntu系统默认没安装,在线安装命令:sudo apt install curl,网文:https://www.jianshu.com/p/6049f23ee204
													  #                                                                                  curl和wget比较:https://baijiahao.baidu.com/s?id=1684301142094029552&wfr=spider&for=pc
sudo ftpget -u liao -p 1234 192.168.1.20 abcd.txt     # 登录远程FTP服务器"192.168.1.20", 下载"abcd.txt"到当前目录下(可指定目标路径)
sudo ftpput -u liao -p 1234 192.168.1.20 abcd.txt     # 登录远程FTP服务器"192.168.1.20", 上传"abcd.txt"到当前FTP根目录上
                                                      # [-u] FTP用户; [-p] FTP密码

tftp -g -r 123.txt 192.168.1.2                        # 从远程TFTP主机 192.168.1.2 下载 123.txt (●TFTP主机PC软件:Cisco TFTP Server●)
tftp -p -l 123.txt 192.168.1.2                        # 向远程TFTP主机 192.168.1.2 上传 123.txt (●TFTP主机PC软件:Cisco TFTP Server●)
                                                      # [-g] 表示下载文件 (get) 
                                                      # [-p] 表示上传文件 (put) 
                                                      # [-l] 表示本地文件名 (local file) 
                                                      # [-r] 表示远程主机的文件名 (remote file) 

ftp 192.168.1.20                                      # vsftpd服务:登录远程FTP服务器"192.168.1.20", 接着按提示输入用户和密码
                                                      # [ls  ]列出目录
                                                      # [cd  ]进入目录
                                                      # [get ]下载文件
                                                      # [put ]上传单个文件
                                                      # [mput]上传多个文件
                                                      # [exit]退出FTP
                                                      # [quit]退出FTP


mount -t nfs -o nolock 192.168.2.3:/home/abc /mnt/nfs # 将另一台机的/home/abc目录挂载到本机/mnt/nfs目录下(例如:开发板目录挂接到电脑)
umount /mnt/nfs                                       # 挂载到本机/mnt/nfs目录卸载之
                                                      # 如果本机IP就是192.168.2.28,那就是自己挂接自己了
                                                      # [-t nfs   ] UNIX(LINUX) 文件网络共享。
                                                      # [-o nolock] 不使用NFS文件锁(原因:很多嵌入式设备的根文件系统中不带portmap)

telnet 192.168.1.20                                   # 使用telnet远程登录.

ssh root@192.168.1.20                                 # 使用SSH远程登录,[root]为用户名, [@]的后面为远程主机IP,登录后就可以像本地操作shell一样操作
sftp -oPort=22 xiaomin@192.168.1.20                   # sftp客户端登录服务端(端口:22, 账号:xiaomin, IP:192.168.1.20),登录后可用 put、get、ls、lls、cd、lcd 等基本命令操作

7、磁盘硬盘操作

fdisk mount umount cfdisk dd

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
df -h                               # 查看硬盘容量使用情况
sudo fdisk -l                       # 查看硬盘及分区信息(一般显示 /dev/sda  /dev/sdb …)
                                    # 【硬盘】
                                    # /dev/hdb  是指第二个IDE硬盘(如:机械硬盘)
                                    # /dev/sda  是指第一个SCSI硬盘(如:U盘)
                                    # 【分区】
                                    # /dev/hda1 是指第一个IDE硬盘上的第一个分区,IDE硬盘可以最多创建63个分区
                                    # /dev/sdb1 是指第二个SCSI硬盘上的第一个分区,SCSI可以创建15个
                                    # 【扩展说明】:
                                    # /dev/hd[a-h] 指IDE硬盘, /dev/sd[a-p]指SCSI硬盘(如:U盘),
                                    # /dev/ed[a-d] 指ESDI硬盘,/dev/xd[a-b]指XT硬盘。
sudo mkdir -p /mnt/usb              # 先创建目录用作挂接点(mount point),为硬盘挂接过来准备;
sudo mount -t vfat /dev/sda1 /mnt/usb # 再将SCSI硬盘(如:U盘)挂接到刚才建的文件夹;(-t vfat 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型)
sudo umount /mnt/usb                # 最后退盘前的卸载操作。(卸载前我们可以对此盘像平常操作文件(夹)一样操作即可)
                                    # 【扩展说明】:
                                    # [-t iso9660] 光盘或光盘镜像;
                                    # [-t msdos  ] DOS fat16文件系统;
                                    # [-t vfat   ] Windows 9x fat32文件系统;
                                    # [-t ntfs   ] Windows NT ntfs文件系统;
                                    # [-t smbfs  ] Mount Windows文件网络共享;
                                    # [-t nfs    ] UNIX(LINUX) 文件网络共享。
sudo cfdisk                         # 使用cfdisk工具对磁盘硬盘操作(有操作界面,根据其菜单操作即可)

sudo dd if=/dev/hdb of=/dev/hdd                       # 将/dev/hdb整盘备份(恢复)到/dev/hdd
sudo dd if=/dev/zero of=/swapfile bs=1024 count=32768 # 创建一个大小为32M的文件(数据初化值全为0x00)(/dev/zero空设备)
sudo dd if=/dev/hda of=/dev/hda                       # 修复硬盘
sudo dd if=/dev/urandom of=/dev/hda1                  # 销毁磁盘数据(/dev/urandom随机设备)
sudo dd if=/dev/mem of=/root/mem.bin bs=1024          # 拷贝内存内容到硬盘(指定块大小为1k)(/dev/mem内存)
                                    # 【关于cp与dd的区别】:
                                    # [操作对象] dd 是对块进行操作的,cp 是对文件操作的。
                                    # [操作动作] dd 相当于克隆+覆盖,cp 则是复制+合并。
                                    # 【扩展说明】:
                                    # [if=   ] {输入}文件,缺省为标准输入。
                                    # [of=   ] {输出}文件,缺省为标准输出。
                                    # [ibs=  ] 指定{输入}一个块大小为多少字节。
                                    # [obs=  ] 指定{输出}一个块大小为多少字节。
                                    # [bs=   ] 同时指定{输入和输出}一个块大小为多少字节。
                                    # [count=] 要操作多少块。
                                    # [skip= ] 从{输入}文件开头跳过多少个块后再开始复制。
                                    # [seek= ] 从{输出}文件开头跳过多少个块后再开始复制。

8、系统相关操作

ifconfig man cat free top ps kill killall logout reboot shutdown set

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
ifconfig                            # 查看网络
ifconfig eth0 192.168.2.10          # 临时配置IP地址(是临时配置,没保存!)
ifconfig eth0 192.168.2.10 netmask 255.255.255.0
ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
sudo /etc/init.d/networking restart # 重启网络
sudo gedit /etc/network/interfaces  # 编辑网络 (不用 gedit 时也可以用 vi 编辑)
                                    # 网络配置最基本内容:
                                    # # The loopback network interface
                                    # auto lo
                                    # iface lo inet loopback
                                    # 
                                    # # The primary network interface
                                    # auto eth0
                                    # iface eth0 inet static
                                    #         address 192.168.0.42
                                    #         netmask 255.255.255.0
                                    #         gateway 192.168.0.1
                                    #         network 192.168.0.0
                                    #         broadcast 192.168.0.255
                                    #         dns-nameservers 114.114.114.114 8.8.8.8

sudo apt-get install xxxx           # 安装软件包的最新版本
sudo apt-get remove  xxxx           # 从系统中删除指定的软件包
sudo apt-get update                 # 检测已安装软件包是否有更新(如果指定软件名则表示指定软件包是否有更新)
sudo apt-get upgrade xxxx           # 升级指定的软件包(前提:先运行 update 检测)(而使用 dist-upgrade 则以更聪明的方式来解决更新过程中出现的软件依赖问题)
sudo apt-cache  list xxxx           # 从资源库中查询可用的软件包
sudo apt-cache search g++           # 搜索单词为g++的软件包
sudo apt-cache show   g++           # 显示g++软件包详细信息

uname -a                            # 查看内核基本信息(内核+系统的版本信息)
lsb_release -a                      # 查看系统基本信息(主要为系统信息)
cat /etc/lsb-release                # 查看系统基本信息(主要为系统信息)
cat /proc/version                   # 查看内核基本信息(内核+编译+系统的版本信息)
cat /etc/issue                      # 查看系统版本信息(系统的版本)

man ls                              # ls命令帮助(查看ls相关的用法)(manual /'mænjuəl/ 说明书)
du -h /opt/test                     # 查看/opt/test目录的磁盘使用情况
file 123.txt                        # 文件的类型(因为在Linux下文件的类型并不是以后缀为分的)
cat /proc/cpuinfo                   # 显示CPU信息 (cat 为 concatenate /kən'kætɪneɪt/ 连续)
cat /proc/meminfo                   # 显示内存信息
free                                # 显示内存使用状况
top                                 # 显示所有用户进程信息,并实时更新
top -u liao                         # 显示liao用户进程信息,并实时更新
                                    # 【扩展说明】:
                                    # [-u] 指定用户名显示
                                    # [-p] 指定进程号显示
                                    # [-n] 循环显示多少次
                                    # --------------------------------------------------
                                    #『交互命令』(在打印信息界面中,直接按下面按键)
                                    # h 显示帮助画面
                                    # s 改变两次刷新之间的延迟时间(单位:秒),可有小数点,默认值是5秒
                                    # q 退出程序
                                    # k 终止一个进程。
                                    # r 重新安排一个进程的优先级别
                                    # c 切换显示命令名称和完整命令行
                                    # i 忽略闲置和僵死进程。这是一个开关式命令。
                                    # P 根据CPU使用百分比大小进行排序
                                    # S 切换到累计模式
                                    # f或者F 从当前显示中添加或者删除项目
                                    # o或者O 改变显示项目的顺序
                                    # l 切换显示平均负载和启动时间信息
                                    # m 切换显示内存信息
                                    # t 切换显示进程和CPU状态信息
                                    # M 根据驻留内存大小进行排序
                                    # T 根据时间/累计时间进行排序
                                    # W 将当前设置写入~/.toprc文件中 
ps                                  # 显示当前shell下的进程
ps -l -u liao                       # 显示用户liao的进程
ps aux                              # 显示所有进程
ps aux | more                       # 显示所有进程及其用户+分页方式显示
                                    # 【扩展说明】:
                                    # [-l] 详细显示PID
                                    # [-u] 指定用户显示
                                    # [-A] 显示所有进程
                                    # [a ] 显示{有连接终端机}的所有进程
                                    # [x ] 显示{没连接终端机}的所有进程
                                    # [u ] 显示{用户名、启动时间等}列项信息
                                    # --------------------------------------------------
                                    #『信息解释』
                                    # USER    哪个用户启动了这个命令
                                    # PID     进程ID
                                    # CPU     CPU占用率
                                    # MEM     内存使用量
                                    # VSZ     如果一个程序完全驻留在内存的话需要占用多少内存空间
                                    # RSS     当前实际占用了多少内存
                                    # TTY     终端的次要装置号码 (minor device number of tty)
                                    # STAT    进程当前的状态(S:睡眠(sleeping);D:不可被中断的休眠(uninterruptible sleep);R:运行(runnable);T:停止(traced or stopped);Z:僵死(a defunct zombie process)
                                    # START   启动命令的时间点
                                    # TIME    进程执行起到现在总的CPU占用时间
                                    # COMMAND 启动这个进程的命令
                                    
kill PID                            # 杀死PID进程 (PID 为 Process ID)
killall test_app1 test_app2         # 杀死test_app1和test_app2两个进程
                                    
logout                              # 注销
reboot                              # 重启
shutdown -r now                     # 重启(r:reboot)
shutdown -h now                     # 关闭系统(h:halt /hɔːlt/)
shutdown -h 30                      # 将在30分钟后关闭系统
shutdown -h 15:30                   # 按照预定时间关闭系统
shutdown -c                         # 取消按预定时间关闭系统(c:cancel)

set -v on                           # 开启同时打印shell脚本中执行命令本身(平常只打印命令执行结果)
set -e                             # 在shell脚本中如果执行命令传回值不等于0,则立即退出shell。
                                    # 更多参数请参考网文:https://blog.csdn.net/baiduwenku112/article/details/109811755