Linux Basic
Table of Contents
Section titled “Table of Contents”$ man <command> # man (manual) 帮助手册, 查看命令的帮助手册 $ man -f <command> # 显示命令的简短描述 $ man -f date > date (1) - print or set the system date and time $ whatis <command> # 显示命令的简短描述, 等同于 man -f <command> $ whatis date > date (1) - print or set the system date and time $ <command> -h/--help # 命令使用 -h/--help 参数 $ date -h $ date --help > Usage: date [OPTION]... [+FORMAT] > or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] > Display the current time in the given FORMAT, or set the system date.
$ pwd # 查看当前目录 > /root/Desktop $ ls # 查看当前目录下的文件及文件夹 > source.sh target.tar.gz $ cd <path> # 切换到 path 目录(无返回值), path 不存在则报错 ~/Desktop/Zip$ # 命令行 $ 左边即为当前目录
$ cp <source> <destination> # 文件复制 $ mv <source> <destination> # 文件移动或重命名 $ rm <file> # 删除文件 $ mkdir <path> # 创建文件夹 $ touch <file> # 创建文件 $ cat <file> # 查看文件内容 $ touch learn.log # 创建文件 learn.log $ mkdir seeds # 创建文件夹 seeds $ cp learn.log seeds/ # learn.log 复制到 seeds 文件夹下 $ rm learn.log # 删除当前目录下的 learn.log $ mv seeds/learn.log study.log # 将 seeds 下的 learn.log 移动到当前目录并重命名 $ rm -r seeds # 删除 seeds 文件夹及文件夹下的所有文件 > 'learn.log' -> create > 'seed/' -> create > 'learn.log' -> 'seed/learn.log' > 'learn.log' -> delete > 'seeds/learn.log' -> 'study.log' > 'seed/' -> delete
查看执行过命令
Section titled “查看执行过命令”$ history # 查看执行的命令历史 > 1 ls > 2 date $ !! # 执行上一条命令 $ !<command key> + enter # 通过命令关键字和 enter 执行上一个包含关键字的命令 $ control + r + <command key> # 快捷键进入历史列表, 通过关键字查找, enter 执行命令 > (reverse-i-search)`echo $': echo $PWD # `echo $' 是输入关键字, : 后为匹配的命令, 方向键选择命令但不执行
全局变量是在整个操作系统中都可用的变量,其值可以在任何地方被访问和修改
$ echo $HOME # 当前用户名 > root $ echo $PATH # 执行命令时所搜寻的路径列表, 以 : 分隔(环境变量设置路径) > /usr/local/sbin:/usr/local/bin:/usr/bin $ echo $SHELL # 当前使用的 shell > /bin/zsh $ echo $PWD # 当前绝对路径 > /root/Desktop/ $ echo $RANDOM # 生成随机数字 > 2166
修改 shell 启动文件(每次打开命令行均会执行)以永久设置环境变量, 使用 export 添加环境变量
export <variable name>=<value> # 使用 export 临时修改环境变量, 执行的命令窗口关闭即失效 export PATH=$PATH:/home/john # 将 /home/john 临时加入环境目录 export LEARN=TRUE # 自定义新的环境变量, 脚本间可以通过自定义环境变量通信 export PATH=$PATH:/home/john # 将命令写入 shell 启动文件(每次启动 shell 均会执行文件上命令) source ~/.bashrc # 重新加载 shell 启动文件(~/.bashrc, ~/.zshrc )
bash 执行脚本: 新建子 shell 执行脚本, 脚本中的 export 的变量只在子 shell 生效, 脚本结束变量失效 source 执行脚本: 脚本中的 export 变量加载入当前终端, 脚本结束仍然生效, 当前终端关闭后失效
$ echo 'export linux="bash"' > bash.sh # 生成脚本 bash.sh $ echo 'export linux="source"' > source.sh # 生成脚本 source.sh $ bash bash.sh && echo "linux: $linux" # 使用 bash 添加 linux 变量 > linux: # 脚本结束, 变量失效 $ source source.sh && echo "linux: $linux" # 使用 source 执行脚本 > linux: source shell # 脚本结束, 变量仍然生效
$ shutdown -h now # 关机 $ shutdown -r now # 重启 $ date # 系统时间 > Sat Feb 25 20:34:10 CST 2023 $ unmae -a # 查看系统内核信息 > linux john 5.15.79.1-microsoft-standard-WSL2 #1 SMP Wed Nov 23 01:01:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux $ ps -ef # 查看当前正在运行的所有进程 > UID PID PPID C STIME TTY TIME CMD > root 1399 71 0 19:08 pts/4 00:00:00 /bin/zsh -i > root 9481 490 0 20:24 pts/4 00:00:00 bash -x a.sh $ kill <pid> # 根据 pid 关掉指定进程 $ kill 9481 > [1] + 9481 terminated bash -x a.sh
启用 root 用户
Section titled “启用 root 用户”$ sudo passwd root > Enter new UNIX password: # 设置 root 用户密码(输入时密码不可见) > Retype new UNIX password: # 重复输入 root 密码 > passwd: password updated successfully # 设置成功 john@master:~/Desktop$ su root # 切换 root 用户 (用户名@hostname:当前路径) root@master:~/Desktop# exit # 退出 root, 普通用户 $ 开头, root 用户 # 开头 $ su <user> # 切换用户
$ useradd -m <username> # 创建用户, 并在 /home 生成用户目录 $ useradd -l <oldName> <newName> # 更换用户名称 $ passwd <username> # 用户添加密码 > New password: # 输入密码, 密码不显示 > Retype new password: # 重复输入密码, 密码不显示 $ userdel -r <username> # 删除用户 > no crontab for john
sudo 免密码
$ sudo vi /etc/sudoers # 编辑配置文件 > %sudo ALL=(ALL:ALL) ALL # 找到这一栏, 建议注释掉复制一行修改 > %sudo ALL=(ALL:ALL) NOPASSWD:ALL # 修改后, 强制保存退出 > <username> ALL=(ALL) NOPASSWD:ALL
注: 该文件必须强制写入, 不能修改文件权限, 否则报错
?
任意单个字符
Section titled “? 任意单个字符”$ touch ab a bc abc # 生成 ab a ba abc 4 个文件 $ ls ?b # ? 可以指代任意单个字符 > ab $ ls b? > bc
*
任意多个字符
Section titled “* 任意多个字符”$ touch ab a bc abc # 生成 ab a ba abc 4 个文件 $ ls * # * 可以指代任意多个字符 > a ab abc bc $ ls a* > a ab abc
**
任意多级目录
Section titled “** 任意多级目录”$ cat /etc/**/word # /etc/ 文件夹下所有 word 文件 $ ls learn/**/*.md # 显示 learn 目录下所有 markdown 文件 > a.md b.md c.md
[]
匹配范围
Section titled “[] 匹配范围”$ touch aa ab ac aab # 生成 ab a ba abc 4 个文件 $ ls a[ab] # 匹配 [] 内任意一个字符 > aa ab
输出重定向 | 输出重定向追加写入 | 输入重定向 | 读取标准输入直至分界符号 |
---|---|---|---|
> | >> | < | << |
$ <command> > <file> # 将命令返回值覆盖写入文件(原文件清空后写入) $ date > file.log # 将 date 命令返回值写入 file.log 文件, 命令行不显示结果 > Sat Feb 25 20:39:56 CST 2023 $ <command> >> <file> # 将输出追加写入文件(原文件内容保留) $ date >> file.log # 将 date 命令返回值追加写入 file.log 内容结尾, 命令行不显示结果 > Sat Feb 25 20:39:56 CST 2023 > Sat Feb 25 20:40:51 CST 2023 $ <command> < <file> # 将文件内容重定向为标准输入 $ cat < file.log # 读取 file.log 并打印 > Sat Feb 25 20:39:56 CST 2023 > Sat Feb 25 20:40:51 CST 2023 $ touch $(< fileName.log) # 根据文件内的文件列表生成文件 $ cat << EOF # 实现多行输入, 分界符号 EOF 可自定义 > line > line > EOF
&1
: 标准输出, 命令行输出, 能直接重定向至文件
&2
: 标准错误, 命令执行错误输出, 需要将错误重定向至标准输出再指向文件
/dev/null
: 空, 指代垃圾桶或回收站
$ main # 错误命令,显示错误输出 > Command 'main' not found $ data 2>/dev/null # 错误命令, 错误输出重定向至回收站, 不显示错误 $ date 2>/dev/null # 正确命令, 标准输出重定向至回收站, 不显示返回值 $ data 2 > date.log # 命令行显示错误, 文件不显示, 错误输出无法直接重定向文件 $ data > date.log 2>&1 # 命令行不显示错误, 文件内显示, 错误输出重定向至文件
缩写 | 全称 | 翻译 |
---|---|---|
a | all | 全部 |
b | backup | 备份 |
c | count | 计数 |
d | directory | 文件 |
f | force | 强制 |
h | help | 帮助 |
i | interactive | 交互的 |
l | long | 长格式的 |
r / R | recursive | 递归 |
s / S | sort/size | 排序/大小 |
t | time | 时间 |
u | user | 用户 |
v | version / verbose | 版本/详细的 |
符号 | 含义 |
---|---|
> | 输出重定向, 覆盖 |
>> | 输出重定向, 追加 |
& | 程序放入后台执行 |
# | 注释 |
&& | 且, 左边成功才执行右边 |
符号 | 模式 |
---|---|
^ | 锚定行首 |
$ | 锚定行尾 |
() | 捆绑成一个整体 |
. | 任意一个字符 |
? | 前面字符或模式 0 或 1 次 |
{m} | 前面字符或模式 m 次 |
{m, n} | 前面字符或模式次数在 m n 之间 |
+ | 前面字符或模式 1 次或多次 |
* | 前面字符或模式任意次 |
[] | 括号范围内均可 |
[^] | 括号范围之外均可 |