命令行的艺术

这篇文章的参考来源于刚入学时大佬让看的一篇文章(一直鸽到了现在真是私密马赛)

https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md

因为最近在鼓捣服务器,所以说有必要把之前落下的补一补,这里引个流

首页 - 我的博客 因幡巡 AI 聊天

可惜是没钱买域名,而且服务器再有3个月也过期了,八成也是没钱续了,到时候再看情况吧

首先是我们要了解的一些前置知识

Bash 与 Linux 命令行基础

1. 学习 Bash 的基础知识

  • 推荐在终端中使用 man bash 通读 Bash 手册。
  • 虽然其他 Shell(如 zsh、fish)功能更强,但 Bash 足够强大且在大多数系统默认可用,不依赖特殊环境,适合服务器等通用环境。

2. 熟悉终端文本编辑器

  • 推荐使用 Vim(或 vi),是终端中功能最全、最可靠的编辑器。
  • 相比 Emacs、大型 IDE、图形化编辑器,Vim 在服务器环境和命令行场景下表现更优。

3. 学会查阅文档

  • 使用 man 阅读命令文档,如:man ls
  • 使用 apropos 查找相关命令,如:apropos disk
  • 一些命令是 Bash 内建命令,无对应可执行文件,可用:
    • help / help -d 查看帮助
    • type 判断是内建命令、外部程序还是别名

4. 输入输出与重定向

  • >:输出重定向(覆盖文件)
  • >>:追加输出
  • <:输入重定向
  • |:管道,连接多个命令的数据流
  • 理解 标准输出 stdout(文件描述符 1)标准错误 stderr(文件描述符 2)

5. 通配符与引号

  • 常用通配符:
    • *:匹配任意数量字符
    • ?:匹配单个任意字符
    • [abc]:匹配指定字符
  • 引号区别:
    • 单引号 ':完全保留内容(不解析变量)
    • 双引号 ":允许变量替换与命令替换

6. 任务控制

  • 后台运行:command &
  • 中断与控制:
    • Ctrl-Z:挂起任务
    • Ctrl-C:中断任务
    • jobs:查看后台任务
    • fg / bg:切换前后台
    • kill:终止任务

7. 使用 SSH 进行远程连接

  • 登录远程主机:ssh user@host
  • 设置无密码登录:
    • ssh-keygen 创建密钥
    • ssh-copy-id 安装公钥
    • ssh-agentssh-add 管理私钥

8. 文件管理常用命令

  • ls -l:查看文件权限、大小、时间等详细信息
  • less, head, tail, tail -f:查看文件内容
  • ln / ln -s:硬链接与软链接
  • chown, chmod:修改文件权限与所属者
  • du -hs *:查看当前目录下各文件夹大小
  • df, mount, fdisk, mkfs, lsblk:磁盘管理
  • ls -i, df -i:查看 inode(文件索引节点)

9. 基本网络命令

  • ip aifconfig:查看网络配置
  • dig:DNS 查询工具

10. 版本控制工具

  • 推荐学习并使用 git
    • 本地代码版本管理
    • 配合 GitHub、GitLab 等远程仓库协作开发

11. 正则表达式与文本搜索

  • 推荐学习基本正则表达式语法
  • 使用 grep/egrep 查找内容:
    • -i:忽略大小写
    • -o:只输出匹配部分
    • -v:反向匹配
    • -A-B-C:显示匹配行前/后/上下文

12. 软件包管理器与 Python 工具

  • 根据 Linux 发行版使用对应包管理器:
    • Debian/Ubuntu:apt-get
    • RedHat/CentOS:yumdnf
    • Arch:pacman
  • 使用 pip 安装基于 Python 的命令行工具

首先,我们要先学习一下bash的基础内容,在命令行输入man bash,并通读一遍(说是这么说,但是我没有能读下来的定力,所以下面直接给出ai的总结)

man bash 内容总结


一、简介(NAME & SYNOPSIS)

  • 名称bash 是 GNU 项目的 Bourne Again Shell,是一种命令语言解释器。
  • 调用方式
bash


复制编辑
bash [options] [file]

二、描述(DESCRIPTION)

bash 是与 sh 兼容的 shell,加入了许多扩展功能:

  • 命令行编辑(readline)
  • 命令历史(history)
  • 作业控制(job control)
  • 脚本编程增强(数组、函数等)

三、选项(OPTIONS)

常见的启动参数包括:

  • --help:显示帮助信息
  • --version:显示版本信息
  • -c:执行字符串中的命令
  • -l:以 login shell 模式启动
  • -i:以交互模式启动
  • -s:从标准输入读取命令
  • --posix:强制遵循 POSIX 标准

四、交互使用(INVOCATION & INTERACTIVE SHELLS)

  • Login shell(登录 shell):如通过 ssh 登录、或用 bash -l
  • Interactive shell(交互 shell):用户直接输入命令并执行
  • Non-interactive shell(非交互 shell):如执行脚本时调用的 shell

五、Shell 语法(SHELL GRAMMAR)

保留字(Reserved Words)

例如:if, then, fi, for, while, do, done, case, esac, function 等。

参数展开(Parameter Expansion)

  • ${var}:变量值
  • ${var:-default}:如果变量为空则使用默认值
  • ${#var}:变量长度

命令替换(Command Substitution)

  • 反引号: `command`
  • 推荐使用:$(command)

算术展开(Arithmetic Expansion)

  • (( expression ))
  • $(( expression ))

六、命令类型(COMMANDS)

1. 简单命令(Simple Commands)

例如:

ls -l /etc

2. 复合命令(Compound Commands)

如:

  • if...then...fi
  • while...do...done
  • { ... } 代码块
  • (( )) 算术表达式
  • [[ ... ]] 条件判断

七、重定向(REDIRECTIONS)

  • >:输出重定向
  • <:输入重定向
  • >>:追加输出
  • 2>:标准错误重定向
  • &>:标准输出和错误都重定向

八、函数(FUNCTIONS)

函数定义方式如下:

myfunc() {
  echo "hello"
}

九、内建命令(BUILTINS)

常见内建命令包括:

  • echo
  • read
  • cd
  • declare
  • set
  • export
  • exit
    使用 help 查看内建命令的帮助:
help cd

十、作业控制(JOB CONTROL)

  • &:后台运行
  • jobs:查看任务
  • fg:切换任务到前台
  • bg:将任务放入后台继续执行
  • kill:终止任务

十一、脚本编程功能

  • 变量与作用域控制
  • 控制结构:if, for, case, while
  • 函数定义与调用
  • 信号处理:trap
  • 流程控制语句:break, continue, return

十二、常用环境变量

  • PATH:可执行文件搜索路径
  • HOME:用户主目录
  • USER:当前用户名
  • SHELL:当前使用的 shell
  • PS1:提示符格式
  • IFS:字段分隔符
  • BASH_VERSION:Bash 版本
  • RANDOM:生成随机数
  • SECONDS:Bash 启动到现在经过的秒数

使用 export 设置环境变量,例如:

export VAR=value

十三、其他特性

  • 命令自动补全(Tab 补全)
  • 历史命令调用(history, !!, !n
  • 启动文件:.bashrc, .bash_profile
  • 数组变量支持,支持普通数组和关联数组

常用语法小抄

功能

示例

命令替换

echo $(date)

条件判断

if [[ -f "file" ]]; then ...

定义数组

arr=(a b c)

遍历数组

for i in "${arr[@]}"; do ...

获取退出码

echo $?

日常使用小技巧

  • 在 Bash 中,可以通过按 Tab 键实现自动补全参数,使用 ctrl-r 搜索命令行历史记录(按下按键之后,输入关键字便可以搜索,重复按下 ctrl-r 会向后查找匹配项,按下 Enter 键会执行当前匹配的命令,而按下右方向键会将匹配项放入当前行中,不会直接执行,以便做出修改)。
  • 在 Bash 中,可以按下 ctrl-w 删除你键入的最后一个单词,ctrl-u 可以删除行内光标所在位置之前的内容,alt-b 和 alt-f 可以以单词为单位移动光标,ctrl-a 可以将光标移至行首,ctrl-e 可以将光标移至行尾,ctrl-k 可以删除光标至行尾的所有内容,ctrl-l 可以清屏。键入 man readline 可以查看 Bash 中的默认快捷键。内容有很多,例如 alt-. 循环地移向前一个参数,而 alt-* 可以展开通配符
  • 键入 history 查看命令行历史记录,再用 !n(n 是命令编号)就可以再次执行。其中有许多缩写,最有用的大概就是 !$, 它用于指代上次键入的参数,而 !! 可以指代上次键入的命令了(参考 man 页面中的“HISTORY EXPANSION”)。不过这些功能,你也可以通过快捷键 ctrl-r 和 alt-. 来实现。
  • 为了便于编辑长命令,在设置你的默认编辑器后(例如 export EDITOR=vim),ctrl-x ctrl-e 会打开一个编辑器来编辑当前输入的命令
  • cd 命令可以切换工作路径,输入 cd ~ 可以进入 home 目录。要访问你的 home 目录中的文件,可以使用前缀 ~(例如 ~/.bashrc)。在 sh 脚本里则用环境变量 $HOME 指代 home 目录的路径
  • 如果你输入命令的时候中途改了主意,按下 alt-# 在行首添加 # 把它当做注释再按下回车执行(或者依次按下 ctrl-a, #, enter)。这样做的话,之后借助命令行历史记录,你可以很方便恢复你刚才输入到一半的命令
  • pstree -p 以一种优雅的方式展示进程树
  • 使用 pgrep 和 pkill 根据名字查找进程或发送信号(-f 参数通常有用)。
  • 了解你可以发往进程的信号的种类。比如,使用 kill -STOP [pid] 停止一个进程。使用 man 7 signal 查看详细列表。
  • 使用 nohup 或 disown 使一个后台进程持续运行。
  • 使用 netstat -lntp 或 ss -plat 检查哪些进程在监听端口(默认是检查 TCP 端口; 添加参数 -u 则检查 UDP 端口)或者 lsof -iTCP -sTCP:LISTEN -P -n (这也可以在 OS X 上运行)。
  • 当变量和文件名中包含空格的时候要格外小心。Bash 变量要用引号括起来,比如 "$FOO"。尽量使用 -0 或 -print0 选项以便用 NULL 来分隔文件名,例如 locate -0 pattern | xargs -0 ls -al 或 find / -print0 -type d | xargs -0 ls -al。如果 for 循环中循环访问的文件名含有空字符(空格、tab 等字符),只需用 IFS=$'\n' 把内部字段分隔符设为换行符
  • 在 Bash 脚本中,使用 set -x 去调试输出(或者使用它的变体 set -v,它会记录原始输入,包括多余的参数和注释)。尽可能地使用严格模式:使用 set -e 令脚本在发生错误时退出而不是继续运行;使用 set -u 来检查是否使用了未赋值的变量;试试 set -o pipefail,它可以监测管道中的错误。当牵扯到很多脚本时,使用 trap 来检测 ERR 和 EXIT。一个好的习惯是在脚本文件开头这样写,这会使它能够检测一些错误,并在错误发生时中断程序并输出信息:
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
  • 在 Bash 脚本中,子 shell(使用括号 (...))是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下:
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir

diff /etc/hosts <(ssh somehost cat /etc/hosts)

上面是我从原文中挑选的一些可能有用的条目(并非有用)

至于后面的文件与数据处理,还有系统调试,基本上用的都不是原生的bash了,都要下载拓展包,所以我们这里不再继续深入(其实就是懒,不想码字了)

  • 在 Bash 中,变量有许多的扩展方式。${name:?error message} 用于检查变量是否存在。此外,当 Bash 脚本只需要一个参数时,可以使用这样的代码 input_file=${1:?usage: $0 input_file}。在变量为空时使用默认值:${name:-default}。如果你要在之前的例子中再加一个(可选的)参数,可以使用类似这样的代码 output_file=${2:-logfile},如果省略了 $2,它的值就为空,于是 output_file 就会被设为 logfile。数学表达式:i=$(( (i + 1) % 5 ))。序列:{1..10}。截断字符串:${var%suffix} 和 ${var#prefix}。例如,假设 var=foo.pdf,那么 echo ${var%.pdf}.txt 将输出 foo.txt。
  • 使用括号扩展({...})来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 mv foo.{txt,pdf} some-dir(同时移动两个文件),cp somefile{,.bak}(会被扩展成 cp somefile somefile.bak)或者 mkdir -p test-{a,b,c}/subtest-{1,2,3}(会被扩展成所有可能的组合,并创建一个目录树)。
  • 通过使用 <(some command) 可以将输出视为文件。例如,对比本地文件 /etc/hosts 和一个远程文件:
  • 在 Bash 中,同时重定向标准输出和标准错误:some-command >logfile 2>&1 或者 some-command &>logfile。通常,为了保证命令不会在标准输入里残留一个未关闭的文件句柄捆绑在你当前所在的终端上,在命令后添加 </dev/null 是一个好习惯。
  • 使用 fpp(PathPicker)可以与基于另一个命令(例如 git)输出的文件交互
  • 将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户,使用: python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)或python -m http.server 7777 (使用端口 7777 和 Python 3)
  • 以其他用户的身份执行命令,使用 sudo。默认以 root 用户的身份执行;使用 -u 来指定其他用户。使用 -i 来以该用户登录(需要输入_你自己的_密码)。
  • 将 shell 切换为其他用户,使用 su username 或者 su - username。加入 - 会使得切换后的环境与使用该用户登录后的环境相同。省略用户名则默认为 root。切换到哪个用户,就需要输入_哪个用户的_密码。
posted @ 2025-07-02 16:42  ALe_#3  阅读(7)  评论(0)    收藏  举报  来源