原标题:命令行

Linux 命令行的组成结构

一条完整的命令通常遵循这个格式:

命令名 [选项] [参数] [重定向/管道]

一个完整的命令通常长这样:

grep -r "hello" ./src/*.js > result.txt
grep -i "error" /var/log/syslog | tee output.txt

可以拆成几个部分:

命令      选项      参数           重定向
│         │         │              │
grep     -r     "hello" ./src/*.js > result.txt

各部分作用:

部分 例子 作用
命令(Command) ls cp grep systemctl 要执行哪个程序
选项(Option) -l -a --help 控制程序行为
参数(Argument) /home test.txt 操作对象
运算符(Operator) > &&

1. 命令名(Command)

要执行的程序或内置命令,比如 ls、grep、systemctl。Shell 会依次在 $PATH 环境变量列出的目录里查找这个可执行文件。

2. 选项(Options / Flags)

用来改变命令的行为,通常以 - 或 -- 开头:

  • 短选项:单个字母,如 a、l,可以合并写,如 ls -al 等价于 ls -a -l
  • 长选项:完整单词,如 -all、-recursive,一般不能合并
  • 有些选项需要跟值,如 o output.txt 或 -output=file.txt

3. 参数(Arguments)

命令操作的对象,通常是文件名、路径或字符串,比如 cat file.txt 中的 file.txt。

例如

cp a.txt b.txt

程序收到两个参数:

a.txt
b.txt

cp 自己知道:

第一个是源文件

第二个是目标文件

Shell 不理解这些含义,只负责传给程序。

4. 特殊符号的含义

符号 作用
` `
> 重定向标准输出,覆盖写入文件
>> 重定向标准输出,追加写入文件
< 重定向标准输入,从文件读取
2> 重定向标准错误
&> 或 2>&1 标准输出和标准错误一起重定向
& 让命令在后台运行
; 顺序执行多条命令,不管前面是否成功
&& 前一条命令成功(返回值为 0)才执行后一条
`
$() 或 命令替换,把命令的输出作为字符串嵌入
() 在子 shell 中执行一组命令
{} 花括号展开,如 mkdir {a,b,c}
* ? [] 通配符(glob),匹配文件名
~ 用户主目录
# 注释开始

5. 组合命令的常见方式

管道串联,逐步加工数据:

ps aux | grep nginx | awk '{print $2}' | xargs kill

条件执行:

mkdir build && cd build && cmake .. && make

只要前面失败,后面就不会执行——很适合写部署脚本。

失败兜底:

ping -c1 server1 || ping -c1 server2

顺序执行,不关心成败:

echo "start"; sleep 5; echo "done"

命令替换嵌套:

echo "今天是 $(date +%Y-%m-%d)"

结合重定向做日志:

./myscript.sh > out.log 2>&1 &

后台运行,标准输出和错误都写进日志文件。

特点总结

  • 组合性强:Unix 哲学“一个程序只做一件事”,靠管道和重定向把小工具拼成复杂流程
  • 返回值驱动逻辑:每个命令执行后都有退出码($?),0 表示成功,非 0 表示失败,&&/|| 就是基于这个做分支
  • 文本流是通用接口:大多数命令默认按文本行处理输入输出,这也是管道好用的原因
  • 可脚本化:命令行语法本身就是 shell 脚本语言(bash/zsh 等)的核心部分,所见即所写