原标题:命令行
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 等)的核心部分,所见即所写
如果这篇文章对你有帮助,点个赞吧。

