CC++ & Algorithm

玩转Linux命令行:像指挥家一样控制你的电脑

困难20
语言版本:C++
概述:学习如何用键盘输入命令来操作文件、编译和运行C++程序,就像用遥控器控制电视一样简单。

玩转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. 删除文件或文件夹:rmrmdir

rm 是 “remove” 的缩写,用于删除文件。rmdir 用于删除空文件夹。但要注意:删除后无法恢复,就像把一张纸扔进碎纸机,再也找不回来了。

生活例子:你写错了一页草稿,撕掉扔进垃圾桶,这就是 rm

常用用法

  • rm 文件名:删除单个文件
  • rm -r 文件夹名:递归删除整个文件夹(包括里面的所有内容),-r 表示 recursive(递归)。比如 rm -r 不需要的旧项目
  • rm -f 文件名:强制删除,不询问确认(-f 表示 force)

安全提醒:新手最容易犯的错误是:rm -rf / 这是删除整个系统,绝对不要尝试!每次用 rm 前最好先用 ls 确认要删的东西。

6. 复制和移动文件:cpmv

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命令行,提前熟悉会让你在考场上比别人更从容。现在就打开终端,试试刚才学到的命令吧——你的乐队,正在等你指挥!

例题精讲

1单选题

在Linux终端中,使用g++编译一个名为hello.cpp的C++源文件,并生成名为hello的可执行文件,正确的命令是?

Ag++ hello.cpp -o hello
Bg++ -o hello.cpp hello
Cg++ hello.cpp --output hello
Dg++ hello.cpp > hello
2单选题

在Linux命令行中,ls -la命令的作用是?

A列出当前目录下所有文件,包括隐藏文件,并以长格式显示详细信息
B仅列出当前目录下非隐藏文件,并以短格式显示
C以字母顺序排序显示文件列表
D显示文件大小和修改时间,但不显示隐藏文件
3判断题

在Linux终端中,使用g++编译C++程序时,如果源代码中使用了C++11标准特性,则需要在编译命令中添加 -std=c++11 选项,否则可能编译失败。

4填空题
在Linux终端中,我们使用以下命令将输入文件input.txt的内容重定向到程序program的stdin,并将stdout重定向到output.txt(不覆盖原内容,追加)。请补全空白处的命令:
./program ___ input.txt ___ output.txt
5单选题

在一个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会执行哪些操作?

A重新编译main.o和utils.o,并重新链接生成myprog
B只重新编译utils.o,然后重新链接生成myprog
C只重新编译main.o,然后重新链接生成myprog
D不会重新编译任何文件,因为make会检查时间戳并自动更新