算起来快十年前的老题了,但每次跟候选人聊到 Linux 基础,我还是会把 360 公司 2015 年软件测试工程师笔试题里那几道 Linux 题目搬出来。它的考点不偏、不冷门,反而特别能反映测试岗位日常要用到的真实技能:路径切换、文件查找、输出与变量、日志分析。当年很多人栽在"不是不会,而是平时没整理过"的基础题上,挺可惜的。这篇就把这套题逐题拆开,讲讲考点背后的原理、常见坑和我的答题思路,顺带聊聊测试工程师该怎么准备这类笔试。
1. 那道让我印象深刻的路径切换题
1.1 真题长什么样
原题大概是这样:
当前路径为 /usr/local/nginx/conf,现在需要切换到 /usr/local/nginx/html 目录,请写出命令。
第一眼看上去,这题简单得不像笔试压轴题,但它考的是测试工程师最常用的基本功。很多人提笔就写cd html,甚至有人直接写cd /local/nginx/html,把usr丢了。这种错误不是粗心,而是对 Linux 路径体系没有形成本能反应——测试工程师每天都要在 Linux 环境里部署被测服务、查看日志、修改配置,路径都不熟练,后面所有操作都会磕磕绊绊。
1.2 为什么企业偏爱这种"基础题"
笔试题目设计有个规律:越是一线岗位,越爱考基础操作。原因很简单,测试工程师不是专职运维,但必须能在 Linux 环境里独立完成环境搭建、日志采集、服务启停。如果连路径切换都要现查资料,工作效率会有明显影响。
另外多说一句,这道题还有个隐藏考点:测试工程师在面试中往往被要求"动手能力强,定位问题快",而定位问题的第一步就是知道自己在哪个目录、要往哪个目录去。pwd和cd这两个命令看起来不起眼,却是所有服务器操作的前提。360 当年的笔试把这道题放在 Linux 部分,就是在筛选那些真正在命令行里摸爬滚打过的候选人。
1.3 我当时是怎么答的
我在这道题下面写了两行:
cd ../html cd /usr/local/nginx/html旁边还标注了一句话:相对路径切换的前提是当前目录确定且目标目录为兄弟目录;绝对路径在任何位置都可以执行。这是我跟批卷老师(或者面试官)展示思路的方式——不仅写出答案,还写出为什么选这个答案。后来我在面试别人时,碰到能写出两种方式的候选人,好感度会明显提升,因为这说明他不只是背命令,而是理解了路径的本质。
2. 从这道题看透 Linux 路径体系
2.1 绝对路径与相对路径的分工
绝对路径从根目录/开始写,例如/usr/local/nginx/html。它的最大优点是"走到哪里都能用",不受当前目录影响;缺点是长,而且一旦路径层级很深,敲起来费劲。
相对路径不从根目录开始,而是以当前目录为起点。比如当前在/usr/local/nginx/conf,它的父目录是/usr/local/nginx,目标目录/usr/local/nginx/html和当前目录是兄弟关系,所以用../html就能一步到位。这里的..表示上一级目录,.表示当前目录。
2.2 用生活场景理解..的含义
很多初学者对..感到抽象,我常用的一个类比是:把每个目录看成房间,把/usr/local/nginx看成走廊,把conf和html看成走廊两侧的两扇门。你在conf房间里,想去html房间,不可能隔着墙穿过去,必须先走出conf的门来到走廊(也就是..),再进入html那扇门。所以cd ../html的含义是"先退回上一级,再进入目标目录"。
如果要进入html目录下的子目录assets,那命令就变成cd ../html/assets。这是在笔试题目基础上的自然延伸,我建议准备笔试时把这个变体也写在笔记里,因为面试官很容易在原题基础上加一层子目录。
2.3 常见错误与考试陷阱
cd html:只有在当前目录的父目录恰好是目标目录的父目录时才能蒙对,换一个层级就失效。cd /usr/local/nginx/html写成/usr/local/nginx/html但当前环境没有该目录:说明对系统目录结构不熟悉,常见错误是漏掉usr或写成user。- 分不清
./html和html:其实两者含义一样,都表示在当前目录下寻找html,但考试时没必要多写./。
如果笔试时拿不准相对路径怎么写,最稳妥的办法是先写绝对路径。绝对路径只要系统目录结构没记错,就一定能执行成功。写完可以补一句"也可以使用相对路径../html",这样既保险又显得思路完整。
2.4 笔试之外的真实场景
真实测试环境里,cd命令往往配合pwd一起用。登录服务器后先pwd确认当前目录,再用ls查看目录内容,最后才决定切换到哪。我见过不少测试新人直接cd /然后一顿ls,半天找不到目标目录,就是因为没有"先确认当前位置"的习惯。
给你一个我在日常工作中经常用的小技巧:cd -可以快速回到上一次所在的目录。比如你在/usr/local/nginx/conf编辑配置,然后cd ../html查看页面文件,想切回配置目录时,直接输入cd -就能回到/usr/local/nginx/conf。这个命令在笔试里偶尔也会作为加分项出现,因为它说明你熟悉 Bash 的目录栈记忆能力。
3. 文件查找题:find 命令的测试场景用法
3.1 真题的常见变形
路径切换之后,笔试题目通常紧跟一道文件查找题。我印象中当年试卷上有这么一类:
找出 /usr/log 目录下所有大于 100M 的 .log 文件,并删除。
这道题考的是find命令,准确说是find的-name、-size、-delete组合。下面是我的写法:
find /usr/log -name "*.log" -size +100M -delete如果笔试环境不允许直接执行删除操作,我会先列出这些文件,确认无误后再删:
find /usr/log -name "*.log" -size +100M -exec ls -lh {} \;这里的-exec ls -lh {} \;表示对每个查找到的文件执行ls -lh,{}是 find 找到的文件占位符,\;表示命令结束。
3.2 为什么是 find 而不是 ls 或 du
笔试里经常有候选人写ls -lh /usr/log/*.log,这不是完全错误,但只适合当前目录下文件不多、不需要递归的场景。ls没有递归过滤能力,也不支持按多个条件组合查询。du虽然能统计目录磁盘占用,但不能按文件名模式精确匹配。find的核心价值在于"递归查找 + 多条件过滤",例如同时按名字、大小、修改时间、类型过滤,这是测试工程师清理日志、查找残留文件的利器。
3.3 find 的另两个高频组合
第一个是按时间过滤。服务出问题时,我们常常要查"最近 7 天被修改过的日志文件",命令是:
find /usr/local/nginx/logs -name "*.log" -mtime +7-mtime +7表示修改时间在 7 天之前的文件。如果要查 7 天以内修改过的,则用-mtime -7。这个参数在日志归档、磁盘空间排查时非常实用。
第二个是按目录层级过滤。如果只想找第一级子目录下的日志,不想深入递归,可以加-maxdepth:
find /usr/local/nginx/logs -maxdepth 2 -name "*.log"笔试中如果明确要求"只查找当前目录下"或者"递归查找",-maxdepth就是区分度最高的考点,建议重点记忆。
3.4 一个真实排障案例
我之前排查过一台测试服务器的磁盘告警,df -h显示根分区用了 95%,但一时看不出是哪个目录占的。用du -sh /var/log/* | sort -hr | head -10先确认大目录,再用 find 精确清理,整个过程大概就是:
du -sh /var/log/* 2>/dev/null | sort -hr | head -10 find /var/log -name "*.log" -size +500M -delete测试环境里日志增长快是常态,尤其是压测期间,access.log 一天能跑几个 GB。掌握 find 的批量清理能力,可以省去手动删除的巨大工作量,也能避免磁盘写满导致被测服务异常退出。
4. 输出、变量与引号背后的 Shell 逻辑
4.1 真题里的 echo 与变量
Linux 基础题里还经常出现一类和 Shell 变量、输出相关的题目,比如:
在脚本中定义变量 name=nginx,使用 echo 打印变量值;单引号、双引号、反引号输出的结果有何区别?
先说结论,下面的脚本可以一次性验证:
name=nginx echo $name echo "$name" echo '$name' echo `date`执行结果分别是:
nginx nginx $name 2025-... (当前日期)$name是变量引用,直接输出变量值;双引号里的$name会先做变量展开再输出,所以结果也是nginx;单引号是字面量,不做任何展开,所以原样输出$name三个字符;反引号表示命令替换,先执行里面的date命令,再把输出结果作为 echo 的参数。
4.2 为什么测试工程师必须理解引号
因为测试脚本里大量使用变量和命令替换。比如你要在压测脚本里记录开始时间:
start_time=$(date +%Y%m%d%H%M%S) echo "start: $start_time"如果误用单引号,日志里打印出来的就不是时间而是start: $start_time,排查半天发现不了问题,其实是引号破坏了变量展开。笔试中这道题的价值就是考察候选人有没有被引号坑过、有没有形成肌肉记忆。
4.3 反引号与 $() 的选择
老式脚本喜欢用反引号,比如date;新版 Shell 更推荐$(date),因为可读性好,也支持嵌套。笔试时如果只要求写出命令替换,两种写法都能得分;但如果题目强调"推荐写法",优先写$( )。
我见过一个很经典的笔试变形:要求把脚本运行结束时间写入文件。正确写法是:
end_time=$(date +%Y-%m-%d_%H:%M:%S) echo "$end_time" >> /tmp/test_time.log如果写成echo end_time >> /tmp/test_time.log,少了$,写进去的就是纯文本end_time,不是变量值。这种坑在真实脚本里经常出现,笔试时特意检查一遍每个变量前的$很有必要。
4.4 从输出题目延伸到日志分析
很多测试笔试题不会单独考 echo,而是把它放在日志分析场景里。比如给你一个 access.log,要求统计 500 状态码的数量。正确思路是先用 grep 过滤,再用 wc -l 计数:
grep "HTTP/1.1\" 500" access.log | wc -l也可以用 grep 的-c直接计数:
grep -c " 500 " access.log用 awk 统计每个状态码的出现次数,再按次数倒序排列:
awk '{print $9}' access.log | sort | uniq -c | sort -rn这段命令会把每行的第 9 列(通常是状态码)提取出来,用sort排序,uniq -c去重并计数,最后sort -rn按数字倒序排列。测试报告里经常要附上这类数据,它比单纯数 500 的个数更有信息量。
5. 测试思维题与 Linux 能力的结合点
5.1 笔试中的"命令行解决测试问题"类题目
360 当年的笔试题有个特点:不会只问命令怎么用,而是给一个测试场景,让你设计命令去完成数据采集或结果验证。例如:
服务端口 8080 被占用,如何找到占用进程?
这道题考察的不是某个单一命令,而是对"定位问题"的整体思路。标准答案分三步:
# 1. 查看 8080 端口占用情况 lsof -i:8080 # 或 netstat -tlnp | grep 8080 # 2. 拿到 PID 后查看进程详情 ps -ef | grep <PID> # 3. 如果确认是残留进程,再决定是否 kill kill -9 <PID>如果系统没有 lsof,用ss -tlnp | grep 8080也可以。这类题目测试的不是背诵量,而是你是否知道"遇到端口冲突时怎么一步步排查"。写出"先用 netstat 查 PID,再 ps 确认进程,最后再 kill"这个链路,比死记一个命令更能得分。
5.2 日志与计算题:用命令代替 Ctrl+F
我在笔试中遇到的另一类题是"从日志中统计某个接口的失败率"。比如:
total=$(grep -c "GET /api/list" access.log) fail=$(grep "GET /api/list" access.log | grep -c " 500 ") echo "$fail / $total"在笔试卷面上,不需要真的在服务器上执行,但写清楚"用 grep 过滤接口、用 grep 过滤状态码、用 wc -l 计数"就能体现出测试工程师的数据分析能力。比直接写一串复杂命令更重要的是思路,因为命令可以查,思路必须现场想清楚。
5.3 测试用例设计题里的命令行影子
还有一些测试设计题,表面不涉及 Linux,但答题时如果主动用 Linux 命令辅助验证,会显得经验丰富。例如"如何测试一个文件上传功能",候选人可以写:
- 构造不同大小的测试文件:
dd if=/dev/zero of=test_100M.bin bs=1M count=100。 - 构造特殊字符文件名:
touch "测试 文件(1).txt"。 - 用 md5sum 校验上传前后的文件是否一致:
md5sum test_100M.bin。
这些命令出现在测试用例设计题里,会比单纯写"上传 100M 文件"更有说服力,因为阅卷人一眼就知道你真实做过接口或客户端测试。
5.4 我在批改试卷时的评分习惯
我批改候选人试卷时,会特别看"填空题和简答题里是否出现多余命令"。比如题目问"怎么查看当前目录",只写pwd是满分;写pwd && ls -l也可接受,但多写cd /tmp反而会扣分,因为没看清题目要求。测试工程师的笔试,尤其在限时环境里,"精准执行"比"炫技"重要。
6. 测试岗位的 Linux 高频考点清单
6.1 不同类别命令的考核权重
这几类命令在测试笔试和面试里出现频率最高,我整理成了一份自测表,你可以对照检查:
| 命令类别 | 高频命令 | 典型测试场景 |
|---|---|---|
| 路径与目录 | pwd, cd, ls, mkdir, cp, mv, rm | 部署测试环境、切换工作目录 |
| 文件处理 | find, grep, awk, sed, tail, head | 过滤日志、统计状态码、提取关键字段 |
| 磁盘与空间 | df -h, du -sh, sort, uniq | 排查磁盘满、统计日志大小 |
| 进程与端口 | ps, lsof, netstat, ss, kill | 定位端口冲突、结束残留进程 |
| 权限相关 | chmod, chown, ls -l, useradd | 修改脚本执行权限、确认日志可读 |
| 网络相关 | ping, curl, telnet, nc, wget | 验证服务连通性、接口请求测试 |
| 压缩与传输 | tar, gzip, scp, rsync | 收集日志、批量传输测试文件 |
单项列出时你会觉得这些命令都认识,但笔试是限时闭卷,考的是"看到场景后能否第一时间选对命令"。我的建议是别只看不练,至少要在自己的虚拟机里把上表每一类跑一遍。
6.2 一个完整的服务启动排查流程
测试工程师在项目中最常遇到的场景是"被测服务起不来"或"接口突然超时"。笔试如果把这个场景出成综合题,标准排查链路如下:
# 1. 确认进程是否还在 ps -ef | grep nginx | grep -v grep # 2. 查看端口是否监听 ss -tlnp | grep 80 # 3. 查看错误日志 tail -n 200 /usr/local/nginx/logs/error.log # 4. 如果磁盘满了,清理日志 df -h find /usr/local/nginx/logs -name "*.log" -size +100M -delete # 5. 重启服务 systemctl restart nginx这道综合题如果出现在笔试中,不只是考命令,还考察排查顺序是否符合逻辑。先确认进程,再看端口,然后看日志,最后才清理和重启——这个顺序能避免反复重启的问题。
6.3 给测试新人的准备建议
针对 360 公司 2015 年软件测试工程师笔试题这一套题,我的建议是:不要只盯着标准答案背,而是把每道题还原成工作场景。路径切换到 html,你可以在自己电脑的终端里模拟出同样的目录层级,然后反复练习相对路径和绝对路径切换;文件查找题,你可以准备一个装满测试日志的目录,用 find 练习按大小、时间、名字过滤。这些操作在面试时如果被追问细节,你也能说得头头是道。
常见误区是花大量时间背各种冷门命令参数,比如 find 的所有 exec 写法、awk 的所有内置变量,但真实笔试和面试更看重高频命令的熟练度。把本文列出的高频命令练熟,再额外掌握sed的增删改查、awk的字段提取和条件判断,应对绝大多数测试岗位的 Linux 题目足够了。
6.4 从一道老题看测试工程师的学习方式
回头再看 360 公司 2015 软件测试工程师笔试题,Linux 部分其实在传达一个信息:测试岗位不是只会点鼠标、写用例,而是要能真正操控被测环境,用命令行快速获取证据、定位问题、验证结果。那些年在基础题上栽过跟头的人,后来大多养成了没事就敲两下命令、把常用操作固化成脚本的习惯。我自己也是从这一套老题开始,逐渐整理出一份 Linux 测试笔记,一直用到现在。
如果你正在准备测试岗位笔试或面试,建议把本文提到的题目完整手写一遍命令,再结合自己的项目经验去补充一些日志分析、接口调试的真实案例。碰到不懂的参数,直接在服务器上用man find或man grep查帮助,查完立刻造一个测试文件验证。这样练下来,再遇到类似的基础题,你大概率能写出让面试官眼前一亮的答案。