环境:Ubuntu 22.04 + g++(文中所有输出均来自我的真实终端,非编造) 适合谁:在 IDE 里点惯了鼠标、一进终端就发懵的 C++ 初学者 阅读方式:建议收藏。命令不用背,用到时翻回来抄一遍,抄十次就是自己的了
在 Linux 下做 C++ 开发,脱离不了与文件和目录打交道。很多初学者在 Windows 的 IDE 里点鼠标习惯了,一进黑乎乎的终端就发懵,遇到 mv、cp、rm 总是心惊胆战,怕一不小心就把几天的代码删没了。
这种担心非常合理——Linux 没有"回收站"这个兜底(桌面版有,但服务器上没有),删了就是删了。所以这篇指南的原则是:每条命令都告诉你它动的是什么、最坏会发生什么、以及动手前怎么先看一眼。
内容覆盖目录切换、增删改查、内容查看、编译运行、权限管理的全过程,最后用"把 lesson52 搬家到 lesson53"这个真实案例做一次实战复盘。
一、基础中的基础:你在哪?这里有什么?
操作文件之前,先搞清楚两件事:我在哪,这儿有什么。90% 的"文件操作事故"都源于这两件事没搞清楚就动手了。
1.1 pwd:我这是在几楼?
pwd
# 输出:/home/ubuntu/code/lesson53
pwd 是 Print Working Directory(打印工作目录)的缩写。它告诉你当前"站"在文件系统的哪个位置。Linux 的目录结构是一棵从 /(根目录)长出来的树,pwd 显示的就是你从树根走到现在的完整路径,也叫绝对路径。
一个真实场景:同时开了三个终端,一个在编译,一个在看日志,一个在改代码。改代码前先敲一下 pwd,确认自己没站错楼——这是比任何"撤销键"都可靠的保命习惯。
1.2 ls:这层楼都有什么房间?
ls
# 输出:Dict.hpp InetAddr.hpp Log.hpp Makefile Mutex.hpp
# UdpClient.cc UdpServer.cc UdpServer.hpp dictionary.txt
ls 是 List 的缩写,列出目录内容。但它有几位常驻"搭档",各有各的用处:
ls -l:看详情(long format)
ls -l
total 232
-rw-rw-r– 1 ubuntu ubuntu 1989 Sep 13 17:22 Dict.hpp
-rwxrwxr-x 1 ubuntu ubuntu 130105 Sep 13 17:23 udpserver
以 udpserver 这行为例,拆开看:
|
-rwxrwxr-x |
权限:第一个 – 是普通文件(目录是 d),后面 9 个字符每 3 个一组,分别是所有者 / 同组用户 / 其他人的 r读 w写 x执行 权限 |
|
1 |
硬链接数(指向这个文件的名字数量) |
|
ubuntu ubuntu |
所有者和所属组 |
|
130105 |
字节数 |
|
Sep 13 17:23 |
最后修改时间 |
|
udpserver |
文件名 |
注意 udpserver 是 -rwxrwxr-x——有 x(可执行位),所以它能直接跑;而 Dict.hpp 是 -rw-rw-r–,没有 x,它就是个文本文件,不存在"运行"一说。这个 x 就是大名鼎鼎的"可执行权限",第七节会讲怎么加。
ls -a:连隐藏文件一起看(all)
Linux 里以 . 开头的文件默认不显示,比如 Git 仓库的 .git、bash 的配置 .bashrc。想看全就得加 -a:
ls -a
# . .. .git Dict.hpp Makefile …
这里混进了两个奇怪的"文件":. 和 ..。它们不是文件,是两个特殊的目录入口——. 代表"当前目录",.. 代表"上一级目录"。记住这一对,下面的 cd .. 和 mv ../xx 就都通了。
顺带说一个经典困惑:为什么 ls -a 里 .git 能看到,但 ls 看不到?就是因为"点开头 = 隐藏"这条规矩。以后找不到 .gitignore、.vscode 文件夹时,第一反应应该是"我忘了加 -a"。
ls -lh:人话版文件大小(human-readable)
-l 显示的 130105 字节对人不友好,加上 -h:
ls -lh
-rw-rw-r– 1 ubuntu ubuntu 2.0K Sep 13 17:22 Dict.hpp
-rwxrwxr-x 1 ubuntu ubuntu 127K Sep 13 17:23 udpserver
127K 一眼就懂。排查"日志文件怎么把磁盘吃满了"这种问题时,ls -lh 配合 du -sh *(看每个目录占多大)是标配组合。
ls -lt:按修改时间排序,最新改的排最前。找"我刚才到底改了哪个文件"特别好用。-l 系列的参数可以直接叠:ls -lht、ls -lha 都合法。
二、穿梭于目录之间:cd 与路径
2.1 cd 的四种常用姿势
cd lesson53 # 进入当前目录下的 lesson53(相对路径)
cd .. # 返回上一级
cd ~ # 回到家目录(/home/ubuntu),光敲 cd 不带参数效果一样
cd – # 返回上一次所在的目录
cd – 值得多说一句:它像"上一曲"按钮,在两个目录之间反复横跳时是神器。比如你在 /home/ubuntu/code 编译,突然要去 /var/log 看日志,看完一个 cd – 就回来了,不用把长路径再敲一遍。
2.2 绝对路径 vs 相对路径
这是新手最容易绕晕、但必须彻底搞懂的概念。
-
绝对路径:以 / 开头,从根目录开始写完整。比如 /home/ubuntu/code/lesson53。它像"北京市海淀区xx路xx号",全世界任何地方寄信都能送达,不依赖你现在的位置。
-
相对路径:以当前目录为参照。比如 cd lesson53、cd ../lesson52。它像"隔壁那栋楼",离开了这个街区就没法这么说了。
用符号拆解一下:
/home/ubuntu/code/lesson53
└─┬─┘└──┬──┘└─┬─┘└───┬───┘
/ 家目录 code lesson53
几个组合拳:
cd .. # 上一级
cd ../.. # 上两级
cd ../lesson52 # 上一级里的 lesson52(先出门,再进隔壁)
cd ~/code # 家目录下的 code(~ 是家目录的缩写,等于绝对路径的简写)
Tab 键是 cd 的最佳拍档。输入 cd les 然后按 Tab,bash 会自动补全成 cd lesson53;有多个候选时按两次 Tab 会列出所有可能。路径再长也敲三四个字母加一个 Tab,这既是提速,更是防错——手敲的长路径拼错一个字母就是 No such file or directory。
2.3 一个值得记住的心理模型
把目录想象成楼层,把 cd 想象成走路:
-
pwd 是问"我在几楼";
-
ls 是看"这层有哪些房间";
-
cd 是"走到某个房间"。
所有文件操作(rm、mv、cp)都是在"你当前站立的楼层"发生的。走错楼层再动手,是事故的第一大来源。 所以养成肌肉记忆:pwd → ls 确认 → 再动手。
三、创建与删除:小心驶得万年船
这是最容易出事故的重灾区,每条命令我都会标上危险等级。
3.1 创建
touch 文件名:创建空文件
touch test.cpp # 创建一个 0 字节的空源文件
如果文件已存在,touch 不会清空它,只更新"最后修改时间"。所以 touch 是个安全命令,放心用。
mkdir 目录名:创建目录
mkdir build # 创建一个叫 build 的目录(编译产物常放这里)
mkdir -p a/b/c:递归创建多级目录
父目录不存在也没关系,一路自动建好。初始化项目结构时非常好用:
mkdir -p myproject/{src,include,build} # 一条命令建出三个子目录
花括号展开 {a,b,c} 是 bash 提供的语法糖,一条命令顶三条。
3.2 删除
rm 文件名 # 删除文件,删除后无法找回,Linux 没有回收站
rm -r 目录名 # 递归删除目录及其内部所有内容(r = recursive)
rm -rf 目录名 # 递归 + 强制:不提示、不确认、报错也不停,直接删光
危险等级逐条看:
-
rm test.cpp:删单个文件。新手的困惑通常是"它怎么不问我一声就删了"——对,Linux 的哲学就是"你让它做它就做",沉默地执行就是成功。真想每次都确认,用 rm -i 文件名。
-
rm -r build:删整个目录。-r 是必须的,不带它删目录会报错 cannot remove 'build': Is a directory——这个报错其实是在保护你。
-
rm -rf:Linux 公认最危险的一条命令。-f(force)把最后两道保险都拆了:不提示,甚至你打错字它也不喊停。
血的教训级别警告:千万不要在根目录 / 下执行 rm -rf *,也别手滑把变量没赋值就 rm -rf $dir/ *——$dir 为空时它就变成"删除根下所有东西"。除非百分之百确定,否则不要加 -f。
三条保命建议:
删之前先 ls 看一眼要删的东西,确认目录里没有宝贝;
删之前 pwd 确认自己站在哪,别在 / 或者家目录里干大事;
删目录时,先 rm -ri 目录名 逐个确认太麻烦的话,至少看一眼 ls 目录名 的内容再下刀。
补充一个温和的替代品:rmdir 目录名 只能删空目录,目录里有东西它会拒绝。当你只想清理空目录时,用它比 rm -r 安全得多。
四、移动、重命名与复制:搬运的艺术
这一节对应的正是我最近真实翻车又救回来的场景,先讲命令,第八节复盘完整案例。
4.1 mv:既是"剪切"也是"改名"
mv(move)一身兼两职,取决于目标是什么:
# 用法一:移动文件到别的目录
mv a.cpp ../ # 把 a.cpp 剪切到上一级目录
mv a.cpp build/ # 剪切到 build 目录里(注意结尾的 /)
# 用法二:重命名(目标路径还是原地,只是换名字)
mv old.cpp new.cpp # old.cpp 改名为 new.cpp
mv lesson52 lesson53 # 把目录 lesson52 整体改名为 lesson53
理解 mv 的行为逻辑:"目标"是文件名就是改名,"目标"是已存在的目录就是搬进去。
由此推出一个高频坑:如果第二条里你不小心写成 mv a.cpp 存在的目录,a.cpp 会跑进目录里;但如果目录名拼错了一个字母(目标不存在),mv 不会报错,而是把 a.cpp 改名成那个拼错的名字。文件没丢,但"消失"了——去 ls 找找那个拼错的名字吧。
另一个坑:mv a.cpp dir 和 mv a.cpp dir/ 效果一样吗?当 dir 存在时一样;当 dir 不存在时,前者把 a.cpp 改名为 dir,后者明确报错。所以移动到目录时习惯性带上结尾的 /,能让错误早点暴露。
批量搬运:通配符 *
mv ../lesson52/* . # 把上一级 lesson52 里的所有内容,搬到当前目录
* 是通配符,代表"当前层的所有东西"。两个细节:
-
* 默认不包含点开头的隐藏文件。mv dir/* . 搬完之后,ls dir -a 里往往还躺着 .git、.gitignore 这些隐形住户。想全搬走:mv dir/* dir/.* .,或者干脆 mv dir/* . && mv dir/.[!.]* .(把 .git 这类也搬走)。
-
通配符是 bash 在命令执行前展开的,所以 rm dir/* 会先展开成一大串文件名再删——这也是它危险的原因之一,展开出来什么你事先看不清。
4.2 cp:复制,原件还在
cp a.cpp b.cpp # 复制 a.cpp 一份,命名为 b.cpp
cp a.cpp ../ # 复制到上一级(名字不变)
cp -r lesson52 lesson53 # 递归复制整个目录(r 同样是 recursive)
mv 与 cp 的本质区别:mv 是剪切,原位置消失;cp 是复印,原地和目标各一份。拿不准的时候,用 cp 永远比 mv 安全——大不了多一份再删。
两个进阶参数:
-
cp -i:目标文件已存在时先问你要不要覆盖(防手滑覆盖掉别人的代码);
-
cp -a:复制时连同权限、时间戳、所有者一起保留(archive),备份代码或拷贝配置文件时用它,不然文件时间全变成"现在",以后按时间排查问题会一头雾水。
注意:复制目录必须加 -r,不加会报错 omitting directory 'lesson52'——cp 默认只搬文件,遇到目录直接跳过,加 -r 它才肯进门。
五、查看文件内容:看透代码的秘密
5.1 按场景选工具
cat dictionary.txt # 一次性全部输出——适合小文件
less UdpServer.hpp # 分页查看——适合大文件
head -n 20 dictionary.txt # 只看前 20 行
tail -n 50 server.log # 只看后 50 行
各自的适用场景:
cat(concatenate):适合几 KB 的小文件,比如我们的词典文件。缺点是内容超过一屏就只见结尾,前面的"刷"过去了。cat -n 能带行号输出,定位问题方便。
less:看大文件的正解。它不会一次读进内存,按需加载:
-
↑/↓ 或 j/k:逐行滚动;空格 或 f:下一页;b:上一页;
-
/关键字:向下搜索(按 n 跳下一个),?关键字 向上搜;
-
g 跳到文件头,G 跳到文件尾;
-
q 退出。
看几千行的日志、翻别人的长代码,一律 less,别用 cat 刷屏。
head / tail:只关心头或尾时用。查日志几乎永远是 tail——最新的内容在文件末尾。
tail -f(follow):实时追踪,运维看家本领
tail -f server.log
它不会退出,而是"钉"在文件末尾,新写入的内容实时滚出来。自己写服务器程序时,把日志重定向到文件,再开第二个终端 tail -f,等于白嫖一块实时监控屏。按 Ctrl+C 退出追踪。
5.2 grep:在文件里大海捞针
grep "error" server.log # 找出所有包含 error 的行
grep -n "bind" UdpServer.hpp # -n 顺带显示行号
grep -i "Error" server.log # -i 忽略大小写
grep -v "DEBUG" server.log # -v 反向:排除含 DEBUG 的行
grep -r "TODO" ~/code # -r 递归搜索整个目录下的所有文件
真实工作流:服务器崩了 → tail -n 100 server.log | grep -i error,两秒钟锁定嫌疑行。|(管道)的意思是"把前一个命令的输出,当成后一个命令的输入",它让这些小工具像积木一样自由拼装:
grep "苹果" dictionary.txt | wc -l # 词典里有几条含"苹果"的记录
ps aux | grep udpserver # 进程列表里找 udpserver
history | grep "rm " # 查查自己历史上敲过哪些 rm(后怕检测)
wc -l(word count – lines)数行数,ps aux 列出所有进程——这条 ps aux | grep xxx 是查"我的程序到底跑起来没有"的标准姿势。
5.3 其他高频小工具
file udpserver # 看文件真实类型:"ELF 64-bit LSB executable"(可执行文件)
du -sh lesson53/ # 看这个目录总共占多大(-s 汇总 -h 人类可读)
diff a.cpp b.cpp # 逐行对比两个文件的差异
六、编译与执行:C++ 开发者的日常循环
6.1 g++ 直接编译
g++ UdpServer.cc -o udpserver
./udpserver 8080
-
-o udpserver 指定产出的可执行文件名。不加 -o 的话,g++ 默认把产物命名为 a.out——多个项目同时编译就互相覆盖了,所以 -o 请永远带上。
-
完整开发版参数:g++ -std=c++17 -pthread -g -Wall UdpServer.cc -o udpserver
-
-std=c++17:启用 C++17(用了 std::filesystem 就必须加);
-
-pthread:链接线程库(用了 mutex 就必须加);
-
-g:加入调试信息,gdb 调试必需;
-
-Wall:打开全部常用警告。强烈建议常开,很多"能跑但埋雷"的代码,警告早就提醒过你了。
-
6.2 为什么运行必须带 ./?
新手必踩:明明文件就在眼前,敲 udpserver 却提示 command not found。
原因:shell 收到一个裸命令时,只会去环境变量 PATH 列出的目录(/usr/bin 等)里找。你当前目录不在 PATH 里,这是安全设计——防止有人在公共目录放一个伪装成 ls 的恶意脚本骗你执行。
所以运行当前目录的程序必须显式写出路径:./udpserver,告诉 shell"就是当前目录下这个"。同理,/home/ubuntu/code/lesson53/udpserver 8080 这种绝对路径写法也能跑。
6.3 make:让 Makefile 替你敲命令
make # 按 Makefile 里的规则编译项目
make clean # 执行 clean 规则,删除编译产物
make clean && make # 清理后重新编译:遇到奇怪错误时的"重启大法"
&& 表示前一条成功才执行后一条。
这里有个我真实踩过的坑,值得写进警示录:Makefile 里写在第一行的目标就是敲 make 时默认执行的。有一次我的 Makefile 只写了 clean 规则没写编译规则,结果敲 make 想编译,实际执行的是 rm -f udpclient udpserver——不但没编译,还把仅有的两个二进制删了。当时满脑子问号"程序怎么凭空消失了",对着 ls 愣了半天。
由此得出两条铁律:
all 目标永远放 Makefile 第一行;
改了 .hpp 头文件后,直接 make 经常提示 Nothing to be done——因为 Makefile 的依赖只写了 .cc,make 不知道头文件变了。老实用 make clean && make,等以后学会自动生成头文件依赖再进化。
6.4 运行时的救命三键
|
Ctrl + C |
发 SIGINT 信号,终止前台进程 |
服务器死循环、程序卡死 |
|
Ctrl + D |
表示输入结束(EOF) |
交互程序读到它就知道"没话说了" |
|
Ctrl + Z |
暂停进程(不是结束) |
配合 bg 放后台、fg 调回前台 |
区分 Ctrl+C 和 Ctrl+D 很重要:前者是"杀了它",后者是"话说完了"。我们写 UDP 客户端时踩过一个坑:没检查 Ctrl+D(EOF)时 getline 的返回值,结果输入流结束后程序陷入死循环,几秒钟刷出几十 MB 垃圾输出。键盘上的每一个组合键,程序都是能感知的,别裸奔。
6.5 后台运行与进程管理(运维预备知识)
./udpserver 8080 & # & 让程序到后台跑,终端立刻空出来
jobs # 看当前会话的后台任务
kill %1 # 结束 1 号后台任务
pkill udpserver # 按名字结束所有叫 udpserver 的进程
ss -ulnp | grep 8080 # 查 8080 端口被哪个进程占着
ss -ulnp | grep 端口号 是排查 bind error 的标准动作:输出里 pid=xxx 直接告诉你占用者是谁,kill xxx 释放端口。服务器端口的"占用与反占用",是每个写网络程序的人迟早都要面对的日常。
七、权限与环境:从"能用"到"顺手"
7.1 chmod:把文件变成可执行的
回看第一节 ls -l 里那串 rwxrwxr-x。改它用 chmod:
chmod +x build.sh # 给所有用户加可执行权限(最常用)
chmod 755 udpserver # 数字法:所有者 rwx(7),组 r-x(5),其他 r-x(5)
chmod 644 config.txt # 所有者 rw(6),组和其他 r(4):纯文本文件的常规配置
数字法的换算是二进制思维:r=4, w=2, x=1,三个位相加。7=4+2+1=rwx,6=4+2=rw,5=4+1=r-x。写脚本最常见的一步就是刚写完的 xxx.sh 敲下去提示 Permission denied——chmod +x 一下就好。
7.2 sudo:以管理员身份做事
sudo apt install g++ # 安装软件需要管理员权限
sudo(superuser do)让普通用户临时借 root 的权限干一件事。原则:能不用就不用。日常写代码、编译、跑自己的服务器都在家目录里完成,完全不需要 sudo;需要 sudo 的典型场景是装软件、改系统配置。sudo 接管的操作没有后悔药,权限越大,手滑的代价越大。
7.3 效率三件套
clear # 清屏(快捷键 Ctrl+L,更快)
history # 列出敲过的所有历史命令(带编号)
!编号 # 重新执行 history 里对应编号的命令
alias ll='ls -lha' # 给长命令起短名(写进 ~/.bashrc 就永久生效)
history 除了翻旧账,还有个隐藏价值:新接手一台机器或忘了自己前几天怎么编译的,翻 history 比翻聊天记录靠谱。
7.4 查命令用法:别背,会查就行
man rm # 完整手册(q 退出)
rm –help # 快速版帮助
which ls # 看 ls 这个命令实际是哪个文件(/usr/bin/ls)
命令的参数永远记不全,会查的人才是高手。man 页里 命令名称(数字) 的数字有讲究:1 是普通命令,2 是系统调用,3 是库函数——man 2 bind 查的是 socket 的 bind,man 3 printf 查的是 C 函数,这也是写网络程序查 socket、recvfrom 文档的正确入口。
八、实战复盘:从 lesson52 到 lesson53 的正确姿势
理论讲完,复盘一个刚发生的真实案例:把 lesson52 目录的全部内容迁移,作为新项目 lesson53 的起点。
8.1 错误示范
人站在 lesson53 里,敲:
mv lesson52 lesson53
# mv: cannot stat 'lesson52': No such file or directory
报错原因:lesson52 根本不在当前目录,而在上一级 code/ 里。相对路径是站在你现在的位置算的——"隔壁那栋楼"的说法只在同一个街区有效。ls 一下就会发现当前目录里根本没有 lesson52 这个名字。
8.2 正确做法(三种,按场景选)
做法一:站在 lesson53 里,搬上一级的内容进来(我当时用的)
pwd # /home/ubuntu/code/lesson53
mv ../lesson52/* .
../lesson52/* 是"上一级的 lesson52 里的所有(非隐藏)文件",. 是"当前目录"。搬完 ls 验收,十二个文件全到齐。
做法二:站在上一级,直接改名——如果 lesson53 还不存在,这是最干净的方案
cd ..
mv lesson52 lesson53 # 整个目录改名,一步到位
注意这里的行为细节:mv 改名目录时,如果目标名不存在,就是纯改名;如果目标名已存在(比如 lesson53 已经有了),mv 会把 lesson52 整个塞进 lesson53 里面去(变成 lesson53/lesson52)。所以改名前先 ls 确认目标名不存在。
做法三:只想复制不想搬家
cd ~/code
cp -r lesson52 lesson53 # 原目录原封不动,复制一份出来
lesson52 的代码以后可能还要回看,用 cp -r 最稳妥,代价是多占一份磁盘。
8.3 三种方案怎么选
|
旧目录不再需要,彻底搬家 |
cd .. && mv lesson52 lesson53 |
|
新旧目录都要保留(比如 lesson52 里还有别的课的东西) |
cp -r |
|
新目录已存在,只想把旧项目的文件搬进去 |
站在新目录里 mv ../旧目录/* . |
8.4 事后验收清单
搬家不是敲完命令就完了,四步验收:
ls # 1. 文件都到了吗?数量对吗?
ls ../lesson52 -a # 2. 旧目录还剩什么?隐藏文件(.git 等)搬了吗?
make clean && make # 3. 还能编译通过吗?(能编过 = 源文件没缺)
./udpserver 8080 # 4. 还能跑吗?
第 2 步特别容易忽略:mv dir/* . 不会搬 .git、.gitignore 这类隐藏文件,项目"搬家不搬历史"就是这么发生的。
九、翻车现场急救表
把本文所有命令的"最常见报错 → 原因 → 解法"汇总成一张表:
|
No such file or directory |
路径拼错 / 人站错了目录 |
pwd + ls 重新定位 |
|
Permission denied(运行程序) |
没有 x 权限 |
chmod +x 文件 |
|
Permission denied(系统目录) |
需要管理员权限 |
sudo(想清楚再用) |
|
Is a directory(rm 报错) |
删目录必须递归 |
rm -r 目录 |
|
omitting directory(cp 报错) |
复制目录必须递归 |
cp -r 源目录 目标 |
|
command not found(本地程序) |
少了 ./ 前缀 |
./程序名 |
|
敲 make 反而删了文件 |
Makefile 第一个目标是 clean |
all 放第一行,再 make |
|
改了 hpp 编译没生效 |
make 不追踪头文件依赖 |
make clean && make |
|
bind error |
端口被占 |
ss -ulnp | grep 端口 → kill pid |
|
mv 后文件"消失" |
目标名不存在,mv 变成了改名 |
去 ls 找拼错的新名字 |
|
搬家后 .git 不见了 |
* 不含隐藏文件 |
mv dir/.[!.]* 目标/ |
十、知识图谱:把命令织成网
最后把这份指南收拢成一张网。所有命令其实分成五类,每类记一个"代表人物"就够了:
Linux 文件与目录操作
│
┌──────────┬──────────┬──────┴─────┬──────────┬──────────┐
│ │ │ │ │ │
定位导航 查看内容 创建删除 搬运复制 编译执行 权限管理
│ │ │ │ │ │
pwd 我在哪 cat 整体看 touch 建文件 mv 剪切/改名 g++ 编译 chmod 加权限
ls 有什么 less 分页看 mkdir 建目录 cp 复制 make 工程 sudo 借权限
cd 去哪里 head/tail mkdir -p 递归 cp -r 递归 ./ 运行 数字法 421
. 当前 tail -f 追日志 rm -r/-f 通配符 * Ctrl+C 杀
.. 上级 grep 搜索 (危险!) (不含隐藏) Ctrl+D EOF
│ │
└── 管道 | 把它们串起来:tail -f log | grep error
几条压箱底的原则,比任何命令都值钱:
动手三连:pwd(我在哪)→ ls(这里有什么)→ 再操作。五秒钟,保平安。
mv 与 cp 之间犹豫时,选 cp。多一份文件不碍事,少一份代码会要命。
rm -f 是手雷,拔了保险(-f)就意味着没有回头路;能用 rm -r 就别加 f。
报错信息是朋友。No such file or directory、Is a directory、Permission denied 每一句都在准确告诉你哪里不对,读报错比瞎猜快十倍。
man 和 –help 是终极文档。命令参数背不完,会查的人才是运维。
别怕敲命令。终端这东西,敲错一次记住一次,敲多了就成了肌肉记忆。祝你的 UDP 项目早日跑通,也祝你在 lesson53 一路顺风。
网硕互联帮助中心




评论前必须登录!
注册