1. 先聊清楚:指令、控制台和“命令焦虑”是怎么来的
1.1 从图形界面到控制台:为什么绕不开这几行字
我见过不少刚转行过来的同事,一听到“打开控制台”或“按几个指令”就发怵,觉得这是技术专家才需要碰的东西。其实往前倒个二十年,所有电脑操作都长这副样子:开机进的是一个字符界面,想拷贝文件得敲copy,想看目录得敲dir。图形界面把大多数操作藏进了图标和菜单后面,但并没有改变底层逻辑——你点按钮,系统最终还是去执行某条指令。
真正让人绕不开控制台的原因有三类。第一类是图形界面做不到的事,比如批量重命名几百个文件、查找日志里带某个关键词的每一行、递归复制目录结构同时保留权限属性,这些用鼠标点起来又慢又容易漏。第二类是服务器环境只有控制台,很多云主机、内网设备、嵌入式系统压根没有桌面,你唯一的管理入口就是一个终端窗口。第三类是效率差异,熟练之后敲指令比一层一层翻菜单快得多,尤其是重复操作,脚本化之后省下的时间非常明显。
这篇文章要讲的就是 Windows 和 Linux 两套系统里最常用的控制台指令。我会把两边对应功能的命令放在一起对照,而不是各讲各的。这样做的原因很实际:现在很多人一台电脑装 Windows,服务器上却跑着 Linux,两边换着用是常态。如果你的目标只是“把活干完”,那么对照着学,比孤立的背列表高效得多。前 100 字里出现了“控制台”“指令”这些关键词,后面所有的内容基本都围绕它们展开。
1.2 两套终端生态:cmd、PowerShell 与 bash 的真实关系
先厘清一个容易混淆的点。Windows 下的“命令行”并不是只有一种。老牌的cmd.exe是 DOS 时代的继承者,语法规矩、输出简陋,但兼容性极强。后来微软做了 PowerShell,它更强大,能直接操作对象而不是文本流,还自带面向 .NET 的能力。Linux 默认的bash则属于 Unix 长期进化的后果,指令虽多,互相关联性很强,管道、重定向、通配符这些概念贯穿始终。
我通常在 Windows 上做日常简单操作时会直接开 PowerShell,因为它同时兼容大部分cmd旧指令,比如cd、dir、copy,又能用ls这种 Unix 风格别名。听起来很方便,但也埋了个坑:PowerShell 里的ls并不是 bash 的ls,它只是映射到了Get-ChildItem。两者输出的列格式、参数名都不一样。如果你把 Linux 的ls -lh原封不动粘到 PowerShell 里,大概率会报参数错误,或得到跟你预期不同的结果。
终端是另一个维度的概念。Windows 11 自带的“终端”应用其实是一个壳,里面可以打开 cmd、PowerShell、甚至通过 WSL 进入 Linux 环境。真正的技巧不是记住某一个终端工具,而是理解底层命令在各自系统中的差异。下面所有指令,我都会标明是在哪种环境里验证过的,避免你跟着抄却跑不通。
2. 文件与目录操作,两套语言里的高频必备
2.1 目录浏览与切换:ls、dir、cd 的细微差异
目录操作是命令行的第一课,也是我在帮别人排查问题时使用频率最高的一类命令。Windowscmd和 PowerShell 里查看当前目录内容,最通用的是dir,它会列出文件名、修改日期、大小和目录标记。PowerShell 还支持ls,但输出的格式更接近“对象表格”,有Mode、LastWriteTime、Length、Name这样的列。Linuxbash里的ls默认输出极简,只给名字,要显示详细信息得追加参数ls -l,要看人性化大小则ls -lh。
切换目录的命令两边一致,都是cd,但细节有差别。Windows 下切换分区的写法是cd /d D:\myfolder,或者直接输入D:回车再cd;Linux 则靠路径约定,cd /home/user、cd ..、cd -都能用。cd ..这条两边都能跑,表示回到上级目录。注意 Linux 的路径分隔符是正斜杠/,Windows 则习惯用反斜杠\,写脚本时混用会出问题。
显示当前路径的命令也值得对标。Windows 是cd(不带参数)或pwd(PowerShell 支持),Linux 是pwd。如果在脚本里需要把当前路径存到变量,我建议多写pwd而不是依赖目录提示符,因为提示符很可能被改得面目全非。
关于跳转目录,有个小技巧我想特别说下。Windows 的pushd和popd、Linux 的cd -都很有用。pushd可以把当前目录压栈,切到别处办完事再popd弹回来,适合临时去别的目录看一眼。Linux 里想“回上一次的目录”一条cd -就搞定,Windows 的cmd没有这个直接快捷键,但 PowerShell 里可以按Ctrl + P调出历史目录。
2.2 增删改查:mkdir、rm、del 及回收站陷阱
新建目录,两边几乎长得一样:mkdir myfolder,Windows 和 Linux 通用。区别在于一次性建多级目录。Linux 用mkdir -p a/b/c,如果父目录不存在会自动补出来。Windows 的cmd里没有-p,老老实实一层层建,或者用 PowerShell 的New-Item -ItemType Directory -Force。这一点看着小,实际自动化脚本里影响很大,我吃过好几次亏。
删除是命令行里最危险的操作之一。Linux 删除目录常用rm -rf myfolder,r表示递归,f表示不询问直接删。如果你想删空的子目录,可以用rmdir。Windows 的cmd对应rmdir /s /q myfolder,/s递归删除所有子目录和文件,/q是安静模式。PowerShell 则用Remove-Item -Recurse -Force。
最关键的一点:这些删除指令都不进回收站。Windows 图形界面删文件还能翻回收站找回来,命令行直接删除等于物理抹除。尤其是rm -rf,如果在根目录或者环境变量拼错了路径,后果不堪设想。我的习惯是:删除前先用ls或dir看一眼目标是否存在、是不是预期内容;涉及批量删除时,先挑一个文件试试;脚本里再加条件判断,比如确认路径前缀再执行。
复制和移动属于日常高频操作。Linux 复制用cp source target,复制目录加-r,保留属性加-p,常用的组合就是cp -rp。Windowscmd用copy和xcopy,xcopy /E /I可以复制整个目录树。PowerShell 里Copy-Item -Recurse对应相对完整的复制逻辑。移动在 Linux 是mv,Windowscmd是move,PowerShell 是Move-Item。要注意的是,Windows 的move跨磁盘移动时可能有权限问题,某些场景下不如xcopy + del稳妥。
2.3 通配符与批量文件处理:*、? 的规则差异
通配符决定了批量操作的上限。常见的有*(匹配任意数量字符)和?(匹配单个字符)。Linux 下ls *.txt会列出所有以.txt结尾的文件。Windowscmd同样支持*和?,但规则上有个历史遗留的差异:Windows 对*后面的匹配并不是用户直觉上的“必须带 .txt 结尾”,有时*.txt也能匹配到file.txt.bak之类。这个坑很隐蔽,批量删除时尤其危险。
PowerShell 不一样。它用的是正则表达式和-like运算符,通配符的处理由底层库决定,规则更接近现代编程习惯,但跟cmd又不完全一致。我的建议是:关键批量场景先dir或ls通配结果,确认匹配范围没错,再执行删除移动操作。
除了通配符,还可以借助管道做批量操作。比如 Linux 里删除一周前的日志:
find /var/log -name "*.log" -mtime +7 -exec rm {} \;Windows 里对应场景可以写:
Get-ChildItem C:\logs\*.log | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item这句话的意思是:先拿到C:\logs下所有.log文件,筛出修改时间早于七天前的对象,再全部删除。写起来虽然长,但可以读懂每一步在干嘛,后续维护也方便。
3. 文本查看与处理指令:从 cat 到 findstr
3.1 查看文件内容:type、cat、Get-Content 的参数差异
文本既是配置的载体,也是日志的载体,所以“查看文件内容”看起来简单,实际坑很多。Linux 里查看整个文件最常见的是cat,后面直接跟文件名。Windowscmd里对应type,PowerShell 则是Get-Content,别名就是cat或type。如果只是看一个几十行的小文件,这几个没有本质差别。
一旦文件变大,问题就来了。几百 MB 的日志文件如果直接cat或type,大概率会刷屏、卡顿,甚至把终端拖垮。Linux 的常用解法是less分页阅读:less app.log,按空格翻页,按q退出,按/搜索关键词。Windows 上落后一点,cmd自带more指令,PowerShell 里可以Get-Content -First 20只取前 20 行,或者用Select-Object -First 20。
查看文件尾部是排障的刚需。Linux 用tail -n 50 app.log看最后 50 行,加-f可以持续跟踪文件新增内容,排查服务运行时的实时日志非常方便。Windows 没有原生的tail -f,PowerShell 里可以用Get-Content app.log -Tail 50 -Wait,效果近似,不过性能一般,文件太大时会拖慢速度。我的经验是:别在 Windows 里硬撑着追大日志,直接开 WSL 用tail -f,体验完全不同。
3.2 在文件里精准查找:grep、findstr、Select-String
光看全文不够,大多数时候要过滤内容。Linux 的grep是核心工具,基本格式grep "关键词" 文件。常用参数包括-i忽略大小写、-r递归搜索目录、-n显示行号、-c统计匹配行数。组合起来可以这样写:grep -rn "error" /var/log/,就是在日志目录下递归找出所有含 error 的行。
Windowscmd里对应的是findstr,参数不如grep丰富。findstr /i /n "error" app.log能够忽略大小写并输出行号。PowerShell 则用Select-String,比 findstr 更强大,它可以直接从Get-Content管道结果里筛选,还可以配合上下文显示:
Select-String -Path C:\logs\app.log -Pattern "error" -Context 2, 2上面这条命令会把匹配行前后各两行一起打印出来,排错时非常有用。Linux 里同样效果可以用grep -n -B2 -A2 "error" app.log。
还有一点值得单独提醒:日志里的中文内容经常遇到编码问题。Windows 下findstr对 UTF-8 文件支持不稳定,经常搜不到正确结果。PowerShell 5.1 里也容易乱码,可能需要指定-Encoding UTF8。Linux 则相对宽容,但也不排除个别 locale 配置不完善导致中文显示为乱码的情况。遇到编码问题先别怀疑关键字,先确认终端字符集和文件编码是否匹配。
3.3 替换与流式处理:从 sed 到 PowerShell 的对应思路
Linux 圈子里有句玩笑话:不会sed就不好意思说会用命令行。sed是流编辑器,最常用的替换场景是sed -i 's/旧文本/新文本/g' 文件名。比如把配置里所有127.0.0.1换成0.0.0.0,一条命令即可完成,i表示直接改原文件。谨慎起见,我建议先在无-i的情况下跑一遍,确认替换后的输出没有异常,再加-i。
Windows 原生没有直接的sed。PowerShell 可以这样写替换:
(Get-Content app.conf -Raw).Replace("127.0.0.1", "0.0.0.0") | Set-Content app.conf意思是把整个文件读成一个字符串,替换所有匹配,再写回去。跟sed -i的效果类似,但有一些细节要注意:-Raw参数保证按单一字符串读取,避免按行读取时把换行符拆乱;Set-Content默认写文件时会有编码和换行符调整,可能导致文件格式变化。所以我处理 Windows 配置文件时很少直接原地替换,通常先导出副本,再替换,再核对生效情况。
如果要处理更复杂的行内转换,Linux 下还有awk,PowerShell 下则直接写管道。比如提取 CSV 每行的第二列,Linux 可以cut -d',' -f2 data.csv,PowerShell 可以Import-Csv data.csv | Select-Object -ExpandProperty 列名。两者的哲学不同,Linux 偏向“用文本工具吃文本”,PowerShell 偏向“把文本解析成对象再操作”。各有优势,没有绝对好坏。
4. 网络诊断与端口排查,日常排障最刚需
4.1 ping 与连通性基础:别把“能 ping 通”当作全部答案
网络出问题时,绝大多数人的第一反应是ping。这个命令在 Windows 和 Linux 里都有,基本用法一样:ping 目标地址。Windows 默认发送(在多数版本中)4 个请求后自动停止,Linux 则默认一直发,需要按Ctrl + C停止,或者用-c 4指定次数。这个差异最容易被新手绊倒。
更关键的是结果解读。ping通只能说明 ICMP 协议可以正常到达目标,不能说明端口是开的,也不能说明应用服务没问题。很多服务器会禁 ping,但业务运行得非常好。反过来,ping通也可能只是网关或者某一层转发通,应用层完全不可用。所以我在排查网络时,ping只用来初步判断主机可达性,接下来一定用端口探测来确认服务状态。
Windows 下可以用ping -t持续探测,Linux 用ping -c 5更符合习惯。携带数据包大小、TTL 等参数能辅助判断路径不同,但日常排障不需要钻太深。核心就是把ping定义为最小可行性检查,而不是万能药。
4.2 端口与连接状态:netstat、ss 对比及实战案例
确认端口是否在监听、谁占用了端口、有多少连接堆积,这类问题靠netstat。Windows 端netstat -ano基本是必背指令:-a显示所有连接和监听端口,-n用数字显示地址端口,不反查域名,-o显示对应进程 PID。输出里看到0.0.0.0:8080处于LISTENING状态,就能确认服务在监听,再配合任务管理器或tasklist根据 PID 找进程,十有八九能定位端口冲突。
Linux 的netstat虽然也能用,但很多发行版默认不装了,官方推荐用ss,速度更快、信息更全。基本对应命令是ss -tlnp:-t只显示 TCP,-l只显示监听态,-n数字显示,-p显示进程名和 PID。想查完整连接状态改为ss -an,想统计状态分类可以ss -s。如果你的机器上还装了 lsof,lsof -i:8080也能直接看哪个进程占用 8080 端口,非常直观。
举一个我实际遇到过的例子。某服务的端口从 8080 起不来,提示 address already in use。我先在 Windows 上跑netstat -ano | findstr 8080,找到占用进程的 PID,然后tasklist /fi "pid eq 进程号"看到是残留的旧进程,直接taskkill /pid 进程号 /f杀掉重启服务。Linux 下同样流程先ss -tlnp | grep 8080,再kill -9 PID。这套流程无论服务器还是本机开发环境,都非常顺手。
4.3 域名解析与路由追踪:nslookup、tracert、traceroute
域名解析出问题时,现象常常是“浏览器打不开某个网站,但别的网站正常”。这种情况优先查 DNS。Windows 和 Linux 都有nslookup,用法是nslookup 域名,它会返回当前配置的 DNS 服务器和解析结果。如果想指定公共 DNS,可以nslookup 域名 8.8.8.8(当然,具体使用哪个公共解析地址根据你所在网络环境决定)。Linux 也可以用dig,输出更详细,包括 TTL 和响应时间。
ping通但访问慢,或者需要知道数据走了哪些路径时,就用路由追踪。Windows 是tracert 目标域名,Linux 是traceroute 目标域名。两者原理都基于 TTL 递增的 ICMP 或 UDP 包,逐跳显示网关反应时间。要注意的是,很多中间路由器会丢弃探测包,结果里出现* * *不一定是链路故障,可能只是对方不回应探测,不代表数据包丢了。
我自己的排障顺序固定成这样:先ping验证基本连通性;然后nslookup确认域名解析结果;再访问目标 IP 或测试端口确认服务可达性;最后在大规模丢包或访问超时时才上tracert。这条链路走下来,大部分“连不上”问题都能定位到具体层。
5. 进程与资源查看:分清到底是谁在拖慢机器
5.1 Windows 下进程三板斧:tasklist、taskkill、Get-Process
Windows 上查看进程,cmd环境最常用tasklist。无参数会列出所有进程的 PID、内存占用等。配合filter可以按条件查:tasklist /fi "imagename eq chrome.exe"能只看 Chrome 的进程列表。杀掉进程用taskkill,参数/f强制结束,/t连同子进程一起结束。比如taskkill /f /t /im chrome.exe,在广告弹窗或者挂住的程序死活关不掉时很好用。
PowerShell 给进程对象化了,Get-Process能拿到更丰富的信息,配合排序和筛选非常灵活。比如找出内存占用最高的五个进程:
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, Id, WorkingSet64这条命令把进程列表按内存占用倒序排序,再取前五名。实际排查时,我一般先看 CPU 还是内存异常。Get-Process | Sort-Object CPU -Descending | Select-Object -First 5看累计 CPU 时间排序,适合发现长时间异常占用。要注意 CPU 列是累计时间,不是实时百分比,想持续观察不如直接用任务管理器或性能监视器。
5.2 Linux 下进程查看:ps、top、htop、kill 的基础逻辑
Linux 查看进程首选ps。常用组合ps aux能看到所有进程和完整命令行。输出里的PID是进程号,%CPU是 CPU 占用,%MEM是内存占比,TIME是累计 CPU 时间。想精准找某个进程,可以ps aux | grep 进程名,但 grep 匹配到的行本身也有一个 grep 进程,需要留意,习惯上用pgrep更干净。
动态查看资源占用,top是默认工具。按 CPU 使用率排序显示进程列表,按Shift + P按 CPU 排序,按Shift + M按内存排序,按q退出。更现代的htop可以上下移动进程、直接按 F 键排序、按 F9 杀掉进程,视觉上更友好。如果环境没装htop,我一般先apt install htop或者yum install htop装一下。
杀进程在 Linux 是kill PID,默认发送 TERM 信号,相当于请求进程自行结束。进程没有响应时换kill -9 PID,这是强制终结。还有pkill 进程名可以用来按名字批量杀。我强烈建议先ping一下进程是不是正常服务的一部分,别在没确认的情况下直接kill -9。确实遇到过同事误杀了数据库守护进程,结果整台服务直接不可用,恢复成本非常高。
5.3 磁盘、内存与 CPU 综合检查:从命令到判断
排查“电脑卡”不能只看某一个指标。Windows 下可以先看内存和磁盘占用。cmd里wmic os get FreePhysicalMemory,TotalVisibleMemorySize能查看内存剩余,powershell里Get-CimInstance Win32_OperatingSystem也能看到。磁盘方面wmic logicaldisk get size,freespace,caption可以拿到各分区剩余空间。更直观的方式是Get-PSDrive,PowerShell 用户常用它扫 C 盘、D 盘剩余量。
Linux 查看磁盘用df -h,输出人类可读的大小和挂载点,看哪个分区满了基本一目了然。查看目录占用大小用du -sh 目录名,如果发现根目录空间异常,可以用du -xhd1 /排名前几的目录再逐级分析。内存用free -h,注意区分 total、used、available,available才是应用真正可用的量,因为它算上了缓存可回收部分。CPU 整体使用率看top的负载和 idle 值就够了。
我总结过一个粗判断流程:磁盘满先清理日志和临时文件;内存使用率高了多数是某个应用泄漏或需要扩大 swap;CPU 持续满载则优先找具体进程,而不是着急重启机器。如果所有命令都显示正常但机器还是慢,那么大概率要往磁盘 IO、网络 IO,或者硬件层面的散热去排查,这已经超出单纯命令行层面的范围了。
6. 权限与用户管理,命令行的安全底线
6.1 Windows 下用户与权限:whoami、net user 和管理员模式
Windows 命令行里查当前身份最简单的是whoami。它会输出当前用户名,加上/priv参数可以看到当前进程拥有的权限列表,排查“明明点了管理员我怎么还改不了文件”这类玄学问题特别有用。需要用管理员权限执行命令时,可以右键终端选“以管理员身份运行”,或者在 PowerShell 里启动一个提权的会话。
用户管理方面,net user是经典的 cmd 命令。net user列出本机用户,net user 用户名查看某用户详细信息,net user 用户名 新密码可以重置密码。域环境下还有net localgroup来管理本地组。这些命令日常用得不多,但有时别人离职或系统需要交接,批量创建本地账号时,比在设置界面点半天高效得多。
权限最核心的是文件和目录的 ACL。cmd下icacls可以查看和修改文件访问控制。比如icacls D:\project /grant 用户名:(OI)(CI)M表示给用户授予修改权限并继承到子目录和文件。这个命令参数比较干,最好先用icacls D:\project看现有权限,再对照文档决定怎么调整。误改 ACL 会导致程序读写失败,所以操作前我备份一下当前 ACL 列表:icacls D:\project /save acl.txt,万一改错可以恢复。
6.2 Linux 下权限位与 sudo:从 chmod 到 visudo
Linux 权限模型可以简单分成三段九个位:所有者、所属组、其他人;每段有 r、w、x 三个权限位。查看用ls -l,输出形如-rw-r--r--的权限字符串,第一个字符-表示普通文件,d表示目录。修改权限用chmod,常用两种写法:数值法和符号法。数值法中,r=4、w=2、x=1,chmod 755 文件表示所有者可读写执行,其他两者只能读和执行。符号法写chmod u+x 文件更直观,表示给所属用户加执行权限。
修改所在组用chown,chown user:group 文件可以同时改所有者和组。关于权限有个非常常见的坑:目录的x权限意味着“能否进入该目录”,不只是执行文件。所以如果你发现无法cd进某个目录,而权限显示里有rw-,那就是缺少x权限导致的。
提权执行用sudo。sudo 指令表示以管理员身份执行一次命令。日常维护中,我建议不要一直切到 root 用户工作,而是需要时用sudo。修改 sudo 配置要用visudo,而不是直接改/etc/sudoers,visudo会检查配置语法,防止改坏后所有提权都失效。我踩过一次坑:手误把某行 syntax 写错,保存后所有sudo都报错,只能进恢复模式修,非常麻烦。所以那条警告真的不是摆设。
6.3 查看日志与审计方向:从 eventlog 到 journalctl
权限与安全相关的排查最终都要落到日志。Windows 事件日志集中在事件查看器里,命令行可以用wevtutil查询。比如查看最近 50 条系统日志:
Get-WinEvent -LogName System -MaxEvents 50其中Security日志需要管理员权限,用来审计登录成功和失败。排查某用户多次登录失败时,这条命令非常关键。
Linux 日志的现代路线是journalctl。查看系统全部日志用journalctl -xe,查看某服务日志用journalctl -u 服务名,按时间过滤可以用journalctl --since "1 hour ago"。早期系统则看/var/log/messages或/var/log/syslog。安全审计方面,last查看最近登录记录,lastb查看失败登录,辅助分析暴力破解趋势。
我自己处理安全问题时,习惯先确认“谁在什么时间以什么身份做了什么”,而不是盲目封 IP。只用防火墙拦截而不看日志,往往解决不了根本问题。
7. 管道、重定向与组合拳,让命令连成小脚本
7.1 管道符与重定向:不只是“连接两条命令”
管道和重定向是命令行真正的灵魂。重定向是把命令的输出导向文件或设备。Linux 写法是>覆盖写、>>追加写、2>捕获错误输出、&>同时捕获标准输出和错误输出。Windowscmd基本一致:>和>>用于标准输出,2>用于标准错误,不常用但存在。PowerShell 的语法略有不同,但作用相同。
管道符两边也用|。Linux 里命令1 | 命令2会把命令 1 的标准输出交给命令 2 处理。比如ls -lh | grep txt,列出所有文件名中带 txt 的。更复杂的用法是组合find、sort、uniq、wc,比如统计日志里访问次数最多的 IP:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20这条路线的逻辑是:日志里每行第一列是 IP,取出第一列,排序使相同 IP 相邻,uniq -c计数,再按数量倒序,最后取前 20。虽然这里用了cat,严格说多余(可以直接用<),但作为教学示例这样更容易读懂。
Windows PowerShell 里的管道传递的是对象,而不是纯文本。比如Get-Process | Sort-Object CPU -Descending | Select-Object -First 5,每一步都在处理结构化的对象,字段名清晰,几乎不可能出现解析文本错位的问题。这也是 PowerShell 比cmd先进的地方,缺点是部分指令执行速度偏慢,兼容性有时不像 bash 那样“一处编写到处跑”。
7.2 循环与批处理:从 cmd 批处理到 bash 脚本的桥接
命令行用到一定程度,绕不开循环和判断。Linux 的 bash 脚本最典型的是for循环。批量把.tmp文件改名成.log可以这样写:
for f in *.tmp; do mv "$f" "${f%.tmp}.log"; done其中${f%.tmp}表示去掉变量f值末尾的.tmp,这种参数扩展语法看起来怪异,但非常高效。Windows 批处理里写循环更别扭,cmd语法形如for %f in (*.tmp) do rename "%f" "%~nf.log"。%~nf取文件名而不带扩展名,这是cmd批处理里的扩展语法。PowerShell 则现代得多:
Get-ChildItem *.tmp | ForEach-Object { Rename-Item $_ -NewName ($_.BaseName + ".log") }如果你只是临时跑一次,我推荐直接在 PowerShell 里写对象管道,比cmd批处理容易理解得多。如果你是要在服务器上长期跑的部署脚本,bash 仍是主流,因为 Linux 生态默认接受它。
批处理的逻辑还包括条件判断。bash 用if [ -f 文件 ]; then ...; fi,PowerShell 用if (Test-Path 文件) { ... }。初学阶段不需要一下子全掌握,先记住“循环做重复事,条件做分支事”,等手工敲命令已经有肌肉记忆了再往脚本迁移,会自然很多。
8. 我这几年用命令行的几个习惯与踩坑经验
8.1 危险命令的识别:删除、格式化、覆盖前必须停下看一眼
命令行最深的坑不是不会用,而是“敲得太快”。rm -rf、mkfs、> 文件这类命令一旦手滑,几乎没有后悔药。我给自己定了一个规矩:凡是带上递归删除、强制覆盖、格式化字眼的操作,敲完先不按回车,重新读一遍命令,再对一下当前目录和后缀。
另外一个非常容易翻车的场景是脚本里的变量为空。比如 bash 脚本里这么写:
rm -rf /var/tmp/$project/*如果$project没赋值,实际执行就成了rm -rf /var/tmp/*,删掉的不只是目标子目录,而是整个临时目录里的所有东西。更稳妥的写法是加防护判断:
if [ -z "$project" ]; then echo "变量为空,已阻止"; exit 1; fiWindows 的del和 PowerShell 的Remove-Item同样要养成“先打印要删除的文件列表”的习惯。操作前先跑一条不带删除动作的命令,只看匹配结果,确认无误后再执行真正删除。
8.2 编码与换行符:Windows 和 Linux 协同办公的隐形地雷
Windows 默认文本编码和 Linux 不同,这是跨系统处理文件时最常见的坑。Windows 的记事本习惯保存为UTF-8 with BOM或者历史下的GBK,Linux 工具按 UTF-8 解析时,开头可能会多出几个不可见字符,导致 shell 脚本第一行报错。解决的通用办法是:脚本文件和重要配置文件统一用 UTF-8 无 BOM 格式保存,编辑工具选 VS Code 或者 Notepad++,并在右下角检查编码。
换行符是另一个雷。Windows 用\r\n,Linux 用\n。写好的 shell 脚本如果是在 Windows 编辑后传上去的,执行时可能报command not found,原因就是每行尾部多了一个\r。处理用sed -i 's/\r$//' 脚本.sh,或使用dos2unix工具转换。反过来,从 Linux 拉下来的文件在 Windows 记事本里可能显示成一行,也可以用工具转回来。
我建议在项目里放一个约定说明,明确日志、脚本、配置文件统一用 LF 换行和 UTF-8 编码。这个细节看起来小,实际维护跨平台脚本时节省的时间非常可观。
8.3 学会自己查帮助:help、--help、Get-Help 的边界
没有任何人能背完所有命令的参数。我查命令帮助的习惯是分三层。第一层是命令 --help(Linux)或命令 /?(Windows),适合看常用参数概览。第二层是更完整的文档,Linux 用man 命令,Windows 里help 命令只能帮到cmd内建命令,要找外部命令细节不如直接网页搜。PowerShell 用户直接Get-Help 命令 -Detailed,信息量很大。
第三层才是搜索引擎和案例站。很多人一上来就搜“XX命令怎么用”,结果找到一堆过时写法。我通常先跑一遍本机自带的 help,再到官方文档确认版本差异。比如 Windows 的 PowerShell 不同版本之间参数差别不小,老脚本里常见Select-Object换到 PowerShell 7 可能行为就有变化。命令是“够用就好”,但查帮助的习惯要趁早养成,因为它能让你从“抄命令”走向“写命令”。
8.4 终端里最值得留住的几个“肌肉记忆”
最后分享几个我日常使用频率最高、几乎每天都会碰的终端习惯。第一,快速清屏。Linux 按Ctrl + L,Windows 的 cmd 是cls,PowerShell 也支持Clear-Host别名。第二,找回上一条命令。上下方向键翻历史是基础,Linux 可以用Ctrl + R反向搜索历史,PowerShell 同样支持Ctrl + R。第三,终止卡死命令。任何终端里Ctrl + C都能中断当前正在执行的命令,Ctrl + D在空输入时可以退出当前会话。
还有个很实用的技巧是补全。Linux 按Tab补全命令和文件名,Windows PowerShell 同样支持,还支持命令参数补全。不要小看这个功能,长路径、长命令基本靠它输完,手打既慢又容易错。
再就是多开终端和分组管理。Windows Terminal 支持多标签页,Linux 终端模拟器也都支持多标签或分屏。平时习惯把日志监控、编辑、执行命令分成不同窗口,排查问题时不用来回切换,思路会清晰很多。
这些习惯不算什么高深技能,但长期积累下来,效率差距非常明显。命令行工具迭代快,指令也越来越多,真正重要的不是把每条背下来,而是掌握一套“如何快速确认、如何安全执行、出了问题如何定位”的方法。我自己也是从只会dir和ls的状态一路过来的,踩过不少坑,后来发现多对照、多验证、多写脚本,才是掌握控制台指令的正确路子。