玩转Linux命令行:像指挥家一样控制你的电脑
困难20玩转Linux命令行:像指挥家一样控制你的电脑
想象一下,你是一个指挥家,而电脑是你面前的乐队。Linux命令行就是你手里的指挥棒——通过输入文字命令,你可以让电脑做各种事情:创建文件夹、复制文件、编译代码……对C++编程来说,学会命令行就像学会了遥控器,轻松搞定代码的编译和运行。而且,很多竞赛(比如CSP-S)需要在Linux环境下答题,掌握这些基础操作会让你在考场上更自信。
打开“命令舞台”——终端是什么?
终端是一个黑底白字的窗口,专门接收你输入的文字指令。你可以把它想象成乐队的舞台:指挥家站在舞台上,乐队才能听见你的命令。在Linux系统中,打开终端的方法很简单:
- 点击桌面或菜单里的“终端”图标(通常是一个黑色方框,上面有
>_符号) - 或者直接按快捷键
Ctrl + Alt + T
打开后,你会看到类似这样的提示符:
student@mycomputer:~$
这个提示符告诉我们:当前用户是 student,计算机名叫 mycomputer,当前在 ~ 目录(也就是“家目录”),$ 表示可以输入命令了。现在,你的指挥棒已经拿到手了!
几个常用“指挥手势”——让你的手指飞起来
每一条命令就像一种手势,让电脑明白你要做什么。下面我们来学习最常用的几个。
1. 查看当前位置:pwd
pwd 是 “print working directory” 的缩写,意思是“打印当前工作目录”。输入后按回车,电脑会告诉你现在在哪个文件夹里。
生活例子:就像你在学校的教学楼上,想知道自己在几楼几号教室,pwd 就是那个楼层指示牌。
示例:
student@mycomputer:~$ pwd
/home/student
输出显示你在 /home/student 这个文件夹里。
2. 看看文件夹里有什么:ls
ls 是 “list” 的缩写,列出当前文件夹中的所有文件和子文件夹。就像打开你的书包,看看里面装了哪几本书。
生活例子:你有一个零食柜,想知道里面有什么零食,ls 就是打开柜门扫一眼。
常用变体:
ls:列出普通文件和文件夹(隐藏文件不显示)ls -a:列出所有文件,包括以点.开头的隐藏文件(比如.bashrc)ls -l:以长格式显示详细信息(文件大小、修改时间、权限等)ls -lh:和-l类似,但文件大小用人类可读的单位(KB、MB)
小贴士:命令的选项(比如
-a)可以组合使用,比如ls -la同时显示所有文件和详细信息。
3. 换个房间:cd
cd 是 “change directory” 的缩写,用于切换当前所在的文件夹。就像你在教学楼里从一间教室走到另一间。
生活例子:你站在1楼走廊,想去3楼的实验室,你可以说“cd 3楼/实验室”。需要注意,文件夹名区分大小写,并且空格要用反斜杠转义或者加引号,但通常文件夹名不带空格最好。
常用用法:
cd 文件夹名:进入当前目录下的子文件夹,比如cd 我的程序(如果文件夹名是中文也可以)cd ..:返回上一级文件夹(两个点表示父目录)cd ~:直接回到用户的家目录(家目录通常是/home/用户名)cd /:进入根目录(整个文件系统的起点)cd -:切换回之前所在的目录(就像按“后退”按钮)
示例:假设当前在 /home/student,里面有一个叫 code 的文件夹:
student@mycomputer:~$ cd code
student@mycomputer:~/code$ pwd
/home/student/code
4. 新建文件夹:mkdir
mkdir 是 “make directory” 的缩写,用于创建新的文件夹。就像在你的书桌上摆一个新的收纳盒。
生活例子:你想把作业和娱乐文件分开,就可以创建一个“作业”文件夹和一个“游戏”文件夹。
示例:
$ mkdir 力扣练习
创建后可以用 ls 查看,会发现多了一个叫“力扣练习”的文件夹。
5. 删除文件或文件夹:rm 和 rmdir
rm 是 “remove” 的缩写,用于删除文件。rmdir 用于删除空文件夹。但要注意:删除后无法恢复,就像把一张纸扔进碎纸机,再也找不回来了。
生活例子:你写错了一页草稿,撕掉扔进垃圾桶,这就是 rm。
常用用法:
rm 文件名:删除单个文件rm -r 文件夹名:递归删除整个文件夹(包括里面的所有内容),-r表示 recursive(递归)。比如rm -r 不需要的旧项目rm -f 文件名:强制删除,不询问确认(-f表示 force)
安全提醒:新手最容易犯的错误是:rm -rf / 这是删除整个系统,绝对不要尝试!每次用 rm 前最好先用 ls 确认要删的东西。
6. 复制和移动文件:cp 和 mv
cp 是 “copy” 的缩写,复制文件;mv 是 “move” 的缩写,移动或重命名文件。
生活例子:
- 复制:把一份作业复印一份,原版还在(
cp 原文件 新文件) - 移动:把桌上的铅笔放到笔袋里(
mv 文件 目标文件夹) - 重命名:把文件从“草稿.txt”改成“终稿.txt”(
mv 旧名字 新名字)
示例:
$ cp hello.cpp hello_backup.cpp # 备份代码
$ mv hello.cpp src/ # 把 hello.cpp 移动到 src 文件夹
$ mv old_name.cpp new_name.cpp # 重命名文件
编译并运行C++程序——从代码到执行
现在假设你写了一个C++程序,比如打印 “Hello, CSP!” 的 hello.cpp。在终端里,先 cd 进入存放它的文件夹,然后:
第一步:编译
用 g++ 命令(GNU C++ 编译器)将源代码转换成可执行文件。
g++ hello.cpp -o hello
这条命令的意思是:把 hello.cpp 编译(compile)成一个名为 hello 的可执行程序。-o 选项指定输出文件名(output),如果不写 -o hello,默认会生成 a.out。
第二步:运行
输入 ./hello 并回车,./ 表示当前目录,告诉系统在当前文件夹里找 hello 这个程序。
$ ./hello
Hello, CSP!
如果程序需要输入数据,比如你想让它计算两个数的和,那么先写好代码:
// sum.cpp: 计算两个整数的和
#include <iostream>
using namespace std;
int main() {
int a = 0, b = 0; // 定义两个整数变量并初始化为0
cin >> a >> b; // 从键盘输入两个数
int sum = a + b; // 计算它们的和
cout << a << " + " << b << " = " << sum << endl;
return 0;
}
然后编译运行:
$ g++ sum.cpp -o sum
$ ./sum
3 5 ← 手动输入两个数(用空格隔开)
3 + 5 = 8 ← 程序输出结果
常见错误与解决方法
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
command not found | 命令拼写错误,或者程序没有安装 | 检查拼写,比如把 g++ 打成 g++ 少一个加号?多数是空格或字母错误 |
No such file or directory | 文件或文件夹名不对,或者路径错误 | 用 ls 查看当前目录下有什么,确认名字完全一致(包括大小写和扩展名) |
Permission denied | 没有执行权限(编译出的文件默认有执行权限,但有时可能没有) | 用 chmod +x 文件名 添加执行权限,比如 chmod +x hello |
编译报错 error: ‘cout’ was not declared | 忘记写 #include <iostream> 或 using namespace std; | 检查源代码头部是否正确 |
找不到头文件 fatal error: iostream: No such file or directory | 编译器没有安装或环境变量问题 | 确保 g++ 已安装(which g++),或者安装编译环境 sudo apt install g++ |
完整示例:从零开始创建一个C++项目
让我们模拟一个真实的场景:你要写一个程序计算“今天你花了多少零花钱”。假设你今天买了两个零食,一共花了5元+3元,程序要输出总和。
在终端中依次操作:
# 1. 创建一个文件夹,用来存放代码
mkdir 零花钱计算
# 2. 进入这个文件夹
cd 零花钱计算
# 3. 用 nano 或其他编辑器(如 vim)创建代码文件
nano spend.cpp
然后在新打开的编辑器里输入以下代码:
// spend.cpp: 计算零花钱花费总和
#include <iostream>
using namespace std;
int main() {
double candyPrice = 5.0; // 糖果价格,单位元
double drinkPrice = 3.0; // 饮料价格,单位元
double total = candyPrice + drinkPrice; // 总花费
cout << "今天买糖果花了 " << candyPrice << " 元" << endl;
cout << "买饮料花了 " << drinkPrice << " 元" << endl;
cout << "一共花了 " << total << " 元" << endl;
return 0;
}
按 Ctrl+O 保存,按 Ctrl+X 退出编辑器(如果你用的是熟悉的编辑器,比如 code spend.cpp 也可以)。
# 4. 编译
g++ spend.cpp -o spend
# 5. 运行
./spend
输出:
今天买糖果花了 5 元
买饮料花了 3 元
一共花了 8 元
小提示:如果不想每次输入命令,可以写一个简单的 shell脚本(比如
run.sh)把编译和运行打包,但那是后话了。
下一步,你想变成怎样的指挥家?
掌握了这些基础命令,你已经可以在Linux世界自由穿梭。但这只是开始。如果你还想继续深入,可以学习:
- vim或nano编辑器:在终端里直接写代码,比鼠标操作快很多。
- Makefile:当项目文件多起来,用一个命令就能编译所有文件。
- gdb调试器:像医生一样检查程序哪里出了问题。
- 管道与重定向:把多个命令组合起来,比如
grep搜索文件内容,cat查看文件。
最棒的是,竞赛中(CSP-S、NOIP等)很多环境就是Linux命令行,提前熟悉会让你在考场上比别人更从容。现在就打开终端,试试刚才学到的命令吧——你的乐队,正在等你指挥!
例题精讲
在Linux终端中,使用g++编译一个名为hello.cpp的C++源文件,并生成名为hello的可执行文件,正确的命令是?
在Linux命令行中,ls -la命令的作用是?
在Linux终端中,使用g++编译C++程序时,如果源代码中使用了C++11标准特性,则需要在编译命令中添加 -std=c++11 选项,否则可能编译失败。
在Linux终端中,我们使用以下命令将输入文件input.txt的内容重定向到程序program的stdin,并将stdout重定向到output.txt(不覆盖原内容,追加)。请补全空白处的命令:
./program ___ input.txt ___ output.txt在一个C++项目中,开发者编写了Makefile文件,其中包含如下规则: all: main.o utils.o g++ main.o utils.o -o myprog main.o: main.cpp utils.h g++ -c main.cpp utils.o: utils.cpp utils.h g++ -c utils.cpp 在终端中执行make命令后,发现utils.h文件被修改过一次,则make会执行哪些操作?