1. 为什么我劝你尽早把命令行用起来
很多人第一次看到那个黑底白字的窗口,第一反应是“这玩意儿跟我没关系”。尤其是用 Windows 的朋友,觉得鼠标点得好好的,干嘛要去敲那些看不懂的字母。但我在实际工作和带人的过程中发现一个规律:一个人对命令行的接受程度,几乎决定了他处理重复性任务的效率上限。这不是夸张,你只要经历过一次“手动改两百个文件名”或者“批量把一堆图片转格式”的折磨,就会明白图形界面在某些场景下有多无力。
命令行(Command Line)本质上是一种用文字指令直接和系统对话的方式。它不依赖按钮、菜单和弹窗,你输入一行指令,系统执行一个动作,然后把结果用纯文本返回给你。Linux、macOS、Windows 三大平台都有自己的命令行环境,虽然细节有差异,但核心逻辑是相通的。这篇文章要解决的,就是让一个完全没碰过命令行的人,能在三个平台上都跑起来,并且真正把它用进日常。
我写这篇东西的出发点很明确:不堆术语,不搞炫技,只讲你明天就能用上的东西。适合谁看?如果你是刚接触编程的学生、需要处理大量文件的运营或设计人员、想提升工作效率的普通办公用户,或者你只是单纯对那个黑窗口好奇但一直没敢点开,那这篇内容就是给你准备的。我会从最基础的概念讲起,一路带到实际操作、常见坑和排查思路,保证你看完能自己动手,而不是看完还是一头雾水。
先说一个我踩过的坑。我最早接触命令行是在 Linux 服务器上,当时照着教程敲了一堆命令,结果因为不理解“当前目录”这个概念,把文件删到了不该删的地方。后来我才意识到,命令行最大的门槛不是命令本身,而是你对“自己在哪、要操作什么、结果会怎样”这三个问题的清晰程度。所以下面的内容,我会反复围绕这三个问题展开,帮你建立正确的操作直觉。
2. 三大平台命令行环境全解析
2.1 Linux:命令行的原生主场
Linux 是命令行的“老家”,绝大多数服务器跑的都是 Linux,所以命令行在 Linux 上的地位是核心级的。你打开终端(Terminal),默认进入的就是一个 Shell 环境,最常见的是 Bash,现在很多发行版默认用 Zsh。Shell 是什么?你可以把它理解成一个“翻译官”,你输入的命令先交给 Shell,Shell 再翻译给系统内核去执行。
在 Linux 上,几乎所有操作都可以用命令行完成,而且很多操作只能用命令行完成。比如批量修改文件权限、查看系统日志、管理后台服务,这些在图形界面里要么没有入口,要么藏得很深。我个人的习惯是,只要涉及批量操作或者需要精确控制,一律走命令行。
Linux 终端里有一个概念必须搞清楚:一切皆文件。你的硬盘、键盘、网络连接,在系统眼里都是文件。这听起来很抽象,但实际用起来非常统一。比如你想看某个硬件的信息,可能就是cat一下某个路径下的文件。这种设计让命令行的操作逻辑高度一致,学会几个核心命令就能举一反三。
2.2 macOS:披着图形外衣的 Unix
macOS 的底层是 Unix 系统,所以它的命令行环境和 Linux 非常接近。你打开“终端”应用,用的默认 Shell 从 Catalina 版本开始变成了 Zsh,之前是 Bash。这意味着你在 Linux 上学到的命令,绝大部分在 macOS 上直接能用,不需要改。
但 macOS 和 Linux 也有一些差异,最典型的是包管理工具。Linux 上常用 apt 或 yum,macOS 上则是 Homebrew。Homebrew 这个工具我强烈建议每个 macOS 用户都装上,它让你能用一行命令安装各种开发工具和实用软件,省去了去官网下载 dmg 再拖拽的麻烦。安装方法很简单,一行命令搞定,后面我会具体说。
另一个差异是文件系统路径。macOS 的用户目录在/Users/你的用户名,而 Linux 通常在/home/你的用户名。这个差异在你写脚本或者复制路径的时候要注意,别直接照搬。
2.3 Windows:从 cmd 到 PowerShell 再到 WSL
Windows 的命令行历史比较复杂,经历过几次迭代。最早是 cmd(命令提示符),功能比较弱,命令语法也和其他平台差异很大。后来微软推出了 PowerShell,功能强大了很多,语法也更现代化。再后来,微软直接推出了 WSL(Windows Subsystem for Linux),让你能在 Windows 里跑一个完整的 Linux 环境。
对于新手,我的建议是:如果你只是想在 Windows 上体验命令行,先从 PowerShell 开始。它自带在系统里,不需要额外安装,而且很多基础命令和 Linux 是相通的。比如ls、cd、pwd这些在 PowerShell 里也能用(ls和cd是别名,实际对应的是 PowerShell 自己的命令)。
如果你需要用到 Linux 特有的工具链,或者你的工作涉及服务器运维,那就直接上 WSL。WSL 的安装现在非常简单,一行命令就能搞定,后面实操部分我会详细讲。装好之后,你相当于在 Windows 里开了一个 Linux 终端,两边的文件还能互相访问,非常方便。
| 平台 | 默认终端 | 默认 Shell | 包管理工具 | 适合人群 |
|---|---|---|---|---|
| Linux | Terminal | Bash/Zsh | apt/yum/dnf | 服务器运维、开发 |
| macOS | Terminal | Zsh | Homebrew | 开发、设计、办公 |
| Windows | PowerShell | PowerShell | winget/choco | 办公、开发、运维 |
这张表你先有个印象,后面操作的时候可以对照着看。核心结论是:三个平台的命令行逻辑相通,学会一个,另外两个上手很快。
3. 新手必学的10个核心命令
3.1 导航类命令:先搞清楚自己在哪
命令行操作的第一步永远是“定位”。你在图形界面里能看到文件夹路径,但在命令行里,你得主动问系统“我现在在哪”。pwd就是干这个的,Print Working Directory,打印当前工作目录。我每次打开终端的第一件事就是敲pwd,确认自己的位置,这个习惯帮我避免了很多“在错误目录下执行命令”的事故。
cd是切换目录,Change Directory。用法很简单:cd 目标路径。这里有几个快捷写法你要记住:cd ~回到用户主目录,cd ..回到上一级,cd -回到上一次所在的目录。最后这个cd -特别实用,相当于图形界面里的“后退”按钮,在两个目录之间来回切换非常方便。
ls是列出当前目录下的内容,List。直接敲ls只显示文件名,加上-l参数显示详细信息(权限、大小、修改时间),加上-a显示隐藏文件。我一般用ls -la,一次性看全。这里有个细节:Linux 和 macOS 上以.开头的文件默认是隐藏的,比如.gitconfig、.bashrc,这些配置文件平时看不到,但很重要。
提示:路径里有空格的时候,必须用引号包起来,比如
cd "My Documents"。不加引号的话,系统会把空格当成参数分隔符,直接报错。这个坑我见过太多人踩了。
3.2 文件操作类命令:增删改查的基本功
mkdir创建目录,Make Directory。mkdir 新文件夹就创建了一个新目录。加上-p参数可以一次性创建多层目录,比如mkdir -p a/b/c,即使 a 和 b 不存在也会自动创建。这个参数在写脚本的时候特别有用,不用一层一层判断。
touch创建空文件,或者更新已有文件的时间戳。touch test.txt就创建了一个空的 test.txt。这个命令看起来简单,但在实际工作中经常用来快速生成占位文件,或者批量更新文件时间。
cp复制文件或目录,Copy。cp 源文件 目标位置。复制目录的时候要加-r参数,表示递归复制,比如cp -r 文件夹1 文件夹2。不加-r会报错,因为系统不知道你要不要连目录里的内容一起复制。
mv移动文件或目录,Move。它还有一个隐藏功能:重命名。mv 旧名字 新名字就是重命名操作。这个设计很巧妙,因为移动和重命名在文件系统层面本质上是同一个操作。
rm删除文件或目录,Remove。这是最危险的命令,没有之一。rm 文件名删除文件,rm -r 目录名删除目录及其内容。没有回收站,删了就没了。我强烈建议新手在使用rm -r之前,先用ls确认一下目录内容,确认无误再删。有个技巧是在rm后面加-i参数,删除前会逐个询问确认,虽然麻烦一点,但安全。
注意:绝对不要执行
rm -rf /或者rm -rf /*,这会尝试删除系统根目录下的所有文件。虽然现代系统有一些保护机制,但这个操作依然极度危险。我在实际工作中见过有人手滑敲了这个命令,后果是系统直接报废,只能重装。
3.3 查看与搜索类命令:快速定位信息
cat查看文件内容,Concatenate。cat 文件名直接把文件内容打印到终端。适合看小文件,大文件用cat会刷屏,这时候用less更好。less 文件名分页查看,用空格键翻页,按q退出。less的好处是不会一次性加载整个文件,打开大文件也很快。
grep是文本搜索神器,Global Regular Expression Print。grep "关键词" 文件名在文件里搜索包含关键词的行。加上-r参数可以递归搜索整个目录,比如grep -r "关键词" ./文件夹。加上-i忽略大小写,加上-n显示行号。我日常工作中用得最多的组合是grep -rn "关键词" .,在当前目录下递归搜索并显示行号。
find按条件查找文件。find . -name "*.txt"在当前目录下查找所有 txt 文件。find的功能非常强大,可以按名称、大小、修改时间、权限等条件组合查找。比如find . -name "*.log" -mtime +7查找 7 天前的日志文件。这个命令在清理旧文件的时候特别有用。
| 命令 | 作用 | 常用参数 | 典型场景 |
|---|---|---|---|
| pwd | 显示当前路径 | 无 | 确认位置 |
| cd | 切换目录 | ~ .. - | 导航 |
| ls | 列出内容 | -l -a -h | 查看文件 |
| mkdir | 创建目录 | -p | 建多层目录 |
| touch | 创建空文件 | 无 | 生成占位文件 |
| cp | 复制 | -r | 备份文件 |
| mv | 移动/重命名 | 无 | 整理文件 |
| rm | 删除 | -r -i | 清理文件 |
| cat/less | 查看内容 | 无 | 读文件 |
| grep | 搜索文本 | -r -n -i | 找关键词 |
这 10 个命令是你命令行生涯的地基,先把它们练熟,后面学更复杂的操作会轻松很多。我的建议是,每天强制自己用命令行完成至少一个文件操作,比如用mv重命名一个文件,用grep搜一段文字。用着用着就成肌肉记忆了。
4. 实操环境搭建与配置
4.1 Windows 平台:PowerShell 与 WSL 的安装配置
Windows 用户先从 PowerShell 开始。按Win + X,选择“Windows PowerShell”或者“终端”,就能打开。如果你用的是 Windows 11,默认打开的可能就是 Windows Terminal,这是一个更现代的终端应用,支持多标签和分屏,体验比老版的 cmd 好很多。
PowerShell 的基础命令和 Linux 有很多别名对应关系。比如ls对应Get-ChildItem,cd对应Set-Location,pwd对应Get-Location。你直接敲ls、cd、pwd也能用,因为 PowerShell 内置了这些别名。但要注意,PowerShell 的参数风格和 Linux 不同,Linux 用-l这种单横线短参数,PowerShell 更习惯用-Path这种完整参数名。
如果你需要完整的 Linux 环境,WSL 是最佳选择。安装步骤:
- 以管理员身份打开 PowerShell
- 执行
wsl --install - 重启电脑
- 重启后系统会自动完成剩余安装,并提示你设置 Linux 用户名和密码
装好之后,你可以在 PowerShell 里直接输入wsl进入 Linux 环境,或者从开始菜单打开 Ubuntu 应用。WSL 里的文件系统可以通过/mnt/c/访问 Windows 的 C 盘,反过来 Windows 也能通过\\wsl$\访问 Linux 文件。这个互通性让两边协作非常顺畅。
提示:WSL 默认安装的是 Ubuntu 发行版。如果你想换其他发行版,可以用
wsl --list --online查看可用列表,然后用wsl --install -d 发行版名称安装指定版本。
4.2 macOS 平台:终端与 Homebrew 配置
macOS 自带终端应用,在“应用程序 > 实用工具”里能找到,或者用 Spotlight 搜索“Terminal”。打开就能用,不需要额外配置。但默认的 Bash 版本比较老(macOS 自带的是 3.2 版本),建议切换到 Zsh,功能更全,体验更好。macOS Catalina 之后默认就是 Zsh 了,如果你的是老版本,可以手动切换:chsh -s /bin/zsh。
Homebrew 是 macOS 上必装的包管理工具。安装命令是一行 Ruby 脚本,直接从官方渠道获取。装好之后,你可以用brew install 软件名安装各种工具。比如brew install wget安装下载工具,brew install tree安装目录树查看工具。Homebrew 会自动处理依赖关系,比手动下载安装省心太多。
macOS 终端还有一个实用功能:按住 Option 键点击终端窗口内的路径,可以快速打开对应文件夹。这个技巧在调试的时候特别方便,比如grep搜到一个文件路径,直接 Option + 点击就能在 Finder 里定位到。
4.3 Linux 平台:终端选择与基础配置
Linux 的终端选择很多,常见的有 GNOME Terminal、Konsole、Terminator、Alacritty 等。如果你用的是桌面版 Linux,系统自带的终端就够用了。如果你经常需要多窗口操作,可以试试 Terminator,支持分屏,一个窗口里开多个终端面板,效率提升明显。
Linux 上有一个配置文件你需要知道:~/.bashrc(如果用 Bash)或者~/.zshrc(如果用 Zsh)。这个文件在你每次打开终端时自动执行,用来设置环境变量、别名、提示符样式等。我习惯在里面加一些常用别名,比如alias ll='ls -la',这样敲ll就等于敲ls -la,省事很多。
环境变量是 Linux 命令行的核心概念之一。PATH变量决定了系统去哪些目录里找可执行程序。当你输入一个命令,系统会按PATH里定义的目录顺序依次查找,找到就执行,找不到就报“command not found”。如果你自己装了一个工具但敲命令提示找不到,大概率是没把它的目录加到PATH里。解决方法是在~/.bashrc里加一行export PATH=$PATH:/你的工具目录,然后执行source ~/.bashrc让配置生效。
5. 文件权限与用户管理详解
5.1 权限模型:读、写、执行的三层结构
Linux 和 macOS 的文件权限模型是命令行里最容易让人困惑的部分之一,但理解了之后你会发现它设计得很清晰。每个文件有三组权限,分别对应文件所有者、所属组、其他用户。每组权限有三个位:读(r)、写(w)、执行(x)。
你用ls -l看到的输出长这样:
-rwxr-xr-- 1 user group 1024 Jan 1 12:00 script.sh第一个字符-表示这是普通文件,如果是d则表示目录。后面九个字符分成三组:rwx、r-x、r--。第一组是所有者权限,可读可写可执行;第二组是所属组权限,可读可执行但不可写;第三组是其他用户权限,只可读。
权限也可以用数字表示:r=4,w=2,x=1。所以rwx= 7,r-x= 5,r--= 4。上面那个文件的权限就是 754。这种数字表示法在chmod命令里经常用。
chmod修改权限。比如chmod 755 script.sh把权限设为 rwxr-xr-x。chmod +x script.sh给所有用户加上执行权限。chmod -R 755 目录递归修改目录下所有文件的权限。
chown修改文件所有者。chown 新用户 文件名。这个命令通常需要管理员权限,所以前面要加sudo。sudo是“以管理员身份执行”的意思,输入密码后命令会以 root 权限运行。
注意:不要随便用
chmod 777。777 意味着所有用户都可以读、写、执行这个文件,安全风险很高。我见过有人为了省事,把整个项目目录设成 777,结果被系统安全扫描标记为高危。正确的做法是按需分配权限,该给多少给多少。
5.2 用户与组管理:多用户环境的基础
Linux 是多用户系统,每个用户有自己的家目录和权限范围。whoami查看当前用户名,id查看当前用户的 UID、GID 和所属组。useradd添加用户,passwd设置密码,usermod修改用户属性。这些命令在个人电脑上用得不多,但在服务器管理里是家常便饭。
组的概念用来批量管理权限。比如你有一个项目目录,需要让三个用户都能读写,可以创建一个组,把这三个用户加进去,然后把目录的所属组设为这个组,权限设为 775。这样组内成员都有读写执行权限,组外用户只有读和执行权限。
groups查看当前用户所属的所有组。groupadd创建新组,gpasswd -a 用户名 组名把用户加入组。这些操作在团队协作环境里很常见,尤其是多人共用一台服务器的时候。
6. 管道、重定向与文本处理三剑客
6.1 管道与重定向:命令行的连接器
管道(Pipe)是命令行最强大的设计之一。用|符号把前一个命令的输出,直接作为后一个命令的输入。比如ls -la | grep ".txt",先列出所有文件,然后从中筛选出包含.txt的行。这个组合的威力在于,你可以把多个简单命令串起来,完成复杂的任务。
重定向是改变命令的输入输出方向。>把输出写入文件(覆盖),>>追加到文件末尾,<从文件读取输入。比如echo "hello" > test.txt把 hello 写入 test.txt,如果文件已存在会覆盖。echo "world" >> test.txt则追加到末尾。2>重定向错误输出,&>同时重定向标准输出和错误输出。
我日常用得最多的组合是命令 > 输出文件 2>&1,把正常输出和错误输出都写入同一个文件。这在跑脚本或者定时任务的时候特别有用,方便事后排查问题。
6.2 grep、sed、awk:文本处理的三把利器
grep前面提过,主要负责搜索。sed是流编辑器,Stream Editor,主要负责替换和删除。awk是文本分析工具,擅长按列处理数据。这三个命令组合起来,几乎能搞定所有文本处理需求。
sed最常用的场景是替换:sed 's/旧内容/新内容/g' 文件名。s表示替换,g表示全局替换(不加 g 只替换每行第一个匹配)。加上-i参数直接修改原文件,不加则只输出到终端。比如sed -i 's/foo/bar/g' test.txt把 test.txt 里所有的 foo 替换成 bar。
awk按列处理文本。默认以空格或制表符分隔,$1表示第一列,$2表示第二列,$0表示整行。比如awk '{print $1}' 文件名打印每行的第一列。加上-F参数指定分隔符,比如awk -F: '{print $1}' /etc/passwd以冒号分隔,打印第一列(用户名)。
这三个命令的组合示例:cat access.log | grep "ERROR" | awk '{print $1}' | sort | uniq -c | sort -rn。这一串命令的意思是:读取日志文件,筛选包含 ERROR 的行,提取第一列(假设是 IP 地址),排序,去重并计数,最后按出现次数从高到低排序。一条命令完成了日志分析的核心工作,这在图形界面里很难做到。
| 命令 | 核心功能 | 典型用法 | 适用场景 |
|---|---|---|---|
| grep | 搜索文本 | grep -rn "关键词" . | 查找代码、日志 |
| sed | 替换/删除 | sed -i 's/旧/新/g' 文件 | 批量修改配置 |
| awk | 按列处理 | awk '{print $1}' 文件 | 数据提取统计 |
| sort | 排序 | sort -rn | 结果排序 |
| uniq | 去重 | uniq -c | 统计出现次数 |
提示:管道和重定向是命令行的精髓,但也是新手最容易出错的地方。我的建议是,先用简单命令测试每一步的输出,确认无误后再用管道串联。不要一上来就写一长串,出了问题很难定位是哪一步的错。
7. 常见问题与排查技巧实录
7.1 命令找不到:PATH 配置排查
“command not found”是新手遇到最多的错误。原因通常有三个:命令拼写错误、软件没安装、安装了但没加到 PATH 里。排查步骤很简单:先用which 命令名看看系统能不能找到这个命令。如果找不到,用echo $PATH查看当前 PATH 配置,确认你的工具目录在不在里面。
如果确认是 PATH 问题,在~/.bashrc或~/.zshrc里加一行export PATH=$PATH:/你的工具目录,然后source ~/.bashrc生效。注意路径要写绝对路径,不要用相对路径。改完之后新开一个终端窗口测试,确保配置持久生效。
7.2 权限拒绝:Permission denied 的解决思路
“Permission denied”通常出现在执行脚本或者访问文件的时候。先ls -l看文件权限,确认当前用户有没有执行权限。如果没有,chmod +x 文件名加上执行权限。如果是访问目录被拒,检查目录权限和所属用户。
还有一种情况是文件系统挂载时带了noexec选项,导致整个分区下的文件都无法执行。这种情况比较少见,排查方法是mount | grep 分区名查看挂载参数。如果是这个问题,需要重新挂载或者修改/etc/fstab。
注意:不要一遇到权限问题就
sudo。sudo是以管理员身份执行,能解决权限问题,但也可能带来安全风险。正确的做法是先搞清楚为什么权限不够,是文件权限设置不对,还是当前用户不在正确的组里。找到根因再解决,而不是无脑提权。
7.3 中文乱码:编码问题的排查与修复
命令行里中文显示乱码,通常是编码不一致导致的。Linux 和 macOS 默认用 UTF-8,Windows 的 cmd 默认用 GBK,两边不一致就会乱码。排查方法是locale查看当前编码设置,确认LANG和LC_ALL变量是不是 UTF-8。
修复方法:在~/.bashrc里加export LANG=en_US.UTF-8和export LC_ALL=en_US.UTF-8,然后source生效。Windows 的 PowerShell 可以通过chcp 65001切换到 UTF-8 编码,但这个设置只对当前会话有效,要持久生效需要改注册表或者用 Windows Terminal 的配置文件。
| 问题现象 | 可能原因 | 排查命令 | 解决方法 |
|---|---|---|---|
| command not found | PATH 未配置 | which、echo $PATH | 添加 PATH 配置 |
| Permission denied | 权限不足 | ls -l、id | chmod、chown |
| 中文乱码 | 编码不一致 | locale | 设置 UTF-8 |
| 命令执行无输出 | 输出被重定向 | 检查 > 和 >> | 去掉重定向测试 |
| 脚本报语法错误 | 换行符差异 | file 文件名 | dos2unix 转换 |
最后说一个跨平台的坑:Windows 和 Linux 的换行符不一样。Windows 用\r\n,Linux 用\n。如果你在 Windows 上编辑的脚本拿到 Linux 上跑,可能会报\r: command not found这种奇怪的错误。解决方法是dos2unix 文件名转换一下,或者用sed -i 's/\r$//' 文件名去掉回车符。这个坑我在跨平台协作的时候踩过好几次,现在养成了习惯:脚本一律在 Linux 环境下编辑,或者用支持换行符转换的编辑器。
8. 效率提升:别名、脚本与自动化
8.1 别名配置:让常用命令更顺手
别名(Alias)是提升命令行效率最直接的方式。在~/.bashrc或~/.zshrc里加一行alias 短名称='完整命令',就能用短名称代替长命令。比如alias gs='git status',以后敲gs就等于敲git status。
我自己的配置里有一组常用别名:alias ll='ls -la'、alias ..='cd ..'、alias ...='cd ../..'、alias grep='grep --color=auto'。最后这个让 grep 的匹配结果高亮显示,一眼就能看到关键词位置。别名配置好之后,记得source一下让配置生效。
别名虽然方便,但要注意不要覆盖系统原有命令。比如你把ls别名成ls -la,那以后敲ls就永远带-la参数了。如果你确实需要不带参数的ls,可以用\ls来绕过别名。这个技巧在调试的时候有用。
8.2 Shell 脚本入门:把重复操作自动化
Shell 脚本就是把一系列命令写在一个文件里,然后一次性执行。脚本文件通常以.sh结尾,第一行写#!/bin/bash指定用哪个 Shell 来解释。写完之后chmod +x 脚本.sh加上执行权限,然后./脚本.sh运行。
一个实用的脚本示例:批量重命名图片文件。假设你有一堆IMG_001.jpg、IMG_002.jpg这样的文件,想改成photo_001.jpg、photo_002.jpg。脚本可以这样写:
#!/bin/bash for file in IMG_*.jpg; do newname=$(echo "$file" | sed 's/IMG_/photo_/') mv "$file" "$newname" done这个脚本用for循环遍历所有匹配IMG_*.jpg的文件,用sed生成新文件名,然后用mv重命名。看起来简单,但如果你有几百个文件,手动改得改到崩溃,脚本一秒钟搞定。
脚本里还可以加条件判断、循环、函数,功能非常灵活。我建议新手从简单的脚本开始,比如批量创建目录、批量复制文件、定时清理日志。写多了之后,你会发现自己对命令行的理解上了一个台阶。
提示:脚本里用变量的时候,建议加上双引号,比如
"$file"。不加引号的话,如果文件名里有空格,会被拆成多个参数,导致脚本出错。这个细节很多人忽略,但在实际使用中经常出问题。
8.3 定时任务:让系统自动干活
crontab是 Linux 和 macOS 上的定时任务工具,可以让你设定某个命令在指定时间自动执行。crontab -e编辑当前用户的定时任务,crontab -l查看已有任务。
crontab 的时间格式是五个字段:分、时、日、月、周。比如0 3 * * *表示每天凌晨 3 点执行。*/5 * * * *表示每 5 分钟执行一次。0 9 * * 1表示每周一上午 9 点执行。
一个典型用法:每天凌晨 3 点清理 7 天前的日志文件。配置如下:
0 3 * * * find /var/log/myapp -name "*.log" -mtime +7 -delete这行配置的意思是,每天凌晨 3 点,在/var/log/myapp目录下查找 7 天前的.log文件并删除。配置好之后,系统会自动执行,不需要你手动干预。这个功能在服务器运维里非常实用,能省下大量重复劳动。
Windows 上对应的工具是“任务计划程序”,图形界面操作,但也可以用schtasks命令来创建。PowerShell 里还可以用Register-ScheduledTask这个 cmdlet 来注册定时任务,功能更灵活。
9. 跨平台协作的注意事项
三个平台虽然命令相通,但在实际协作中还是有一些差异需要注意。首先是路径分隔符:Linux 和 macOS 用/,Windows 用\。但在 PowerShell 里,/也能识别,所以写脚本的时候统一用/兼容性更好。如果脚本要在多个平台跑,可以用变量或者判断语句来处理路径。
其次是换行符,前面提过,Windows 是\r\n,Linux 和 macOS 是\n。跨平台编辑文件的时候,建议用支持换行符转换的编辑器,比如 VS Code 右下角可以切换换行符格式。或者用dos2unix和unix2dos命令转换。
第三是命令参数风格。Linux 命令通常用单横线短参数(-l)和双横线长参数(--help),PowerShell 用单横线完整参数名(-Path)。写跨平台脚本的时候,尽量用各平台通用的参数,或者用条件判断分别处理。
最后是环境变量。Linux 和 macOS 用$VAR引用变量,Windows PowerShell 用$env:VAR。设置方式也不同,Linux 用export VAR=value,PowerShell 用$env:VAR="value"。这些差异在写跨平台脚本的时候都要考虑到。
我个人的经验是,如果脚本只在本地跑,用当前平台的语法就行;如果要跨平台,尽量用 POSIX 兼容的写法,或者用 Python 这类跨平台语言来写。Shell 脚本虽然方便,但跨平台兼容性确实是个问题,复杂任务还是交给更通用的工具更稳妥。
10. 我这些年积累的实操心得
命令行这个东西,看再多教程不如自己动手敲一遍。我刚开始学的时候,也是对着教程一步步操作,但关掉教程就忘。后来我强迫自己用命令行完成日常任务,比如用grep搜代码、用find找文件、用sed批量替换,用着用着就离不开了。
有一个习惯我强烈建议你养成:每次执行破坏性命令之前,先用ls或者echo确认一下目标。比如你要执行rm -r 某个目录,先ls 某个目录看看里面有什么,确认无误再删。这个习惯帮我避免了好几次误删事故。
另一个心得是,不要怕报错。命令行报错信息通常很具体,告诉你哪一行、哪个文件、什么原因。仔细读报错信息,大部分问题都能自己解决。我见过很多人一看到红色报错就慌,其实静下心读一遍,问题往往很明显。
最后,善用man和--help。man 命令名查看命令的完整手册,命令名 --help查看简要帮助。这两个是你最好的老师,比任何教程都权威。我到现在遇到不熟悉的命令参数,第一反应还是man一下。
命令行不是一天就能练成的,但每天花十分钟敲几个命令,一个月后你会发现自己处理文件的效率完全不一样了。这个东西的回报周期很短,投入产出比极高,值得你花时间。