Post

关于Bash和Linux

出题顺手写的文档, 帮助新生了解一些计算机基础

关于Bash和Linux

Bourne Again SHell

来自GNU Project, 是 Bourne shell (sh) 加强版, 属于Shell大类, 本质上是个程序, 运行在GNU操作系统上, 作为用户与操作系统用户空间程序交互的接口.

说这些可能会让你一头雾水. 所以, 先用再说. 如果你是Windows系统, 需要使用WSL1安装使用Bash的GNU/Linux发行版 (推荐UbuntuDebian等). 过程不难, 可以参照官方文档操作2; 如果你是GNU/Linux系统, 想必你应该熟悉一些Bash的基本命令了. 首先在这里看看bash都有哪些指令. 另外, 在mini赛题中会出现ELF格式的文件, 需要在GNU/Linux环境 (原生, WSL, 容器或虚拟机) 上进行运行和调试.

了解Bash

  • 如果想要系统学习Bash以及相关基础, 推荐: The Missing Semester of Your CS Education

  • 或者说直接下手开干, 大语言模型 是不错的老师

  • 当然Bash只是Shell家族中最广泛使用的一员, 还有一些和它平起平坐的Shell: Zsh, nushell, KornShell, Tcsh, Fish 等等.

一些问题

  1. Terminal / Shell / CLI / Bash 都是一个东西吗?
  2. Linux, GNU/Linux, GNU Project, GNU Operating System 都是一个东西吗?
  3. 编译C的编译器gcc, g++, 全称是什么? 属于什么?
  4. Unix和Unix-like的关系是什么?

Terminal / Shell / CLI / Bash 都是一个东西吗? 当然———不是, 他们相关, 但不属于一个层级, Terminal (终端程序, 是个程序3, 负责显示和输入) 提供一个界面让你访问, Shell (命令解释器) 是一个抽象的集合, 具体包括Bash等等, 他们既可以让你在终端中敲命令与操作系统交互4, 还能写成脚本批量执行 (Bash既是交互式命令解释器, 也是脚本语言5, 暂且把它想成Python6); CLI (命令行界面) 更抽象, 是一种交互方式. Shell及其他的CLI程序 (e.g., git, curl 等等) 是CLI的具体化, 都是使用line-by-line的命令行方式与软件本身交互.

Linux, GNU/Linux, GNU Project, GNU Operating System 都是一个东西吗? 也不是, Linux严格来讲是Linux内核 (组成操作系统的核心); GNU/Linux = Linux 内核7 + GNU 用户空间的工具们 (包括Bash); GNU Project顾名思义是个项目, 由 Richard Stallman 发起, 感兴趣可以看看官方的介绍; GNU Operating System = GNU Hurd内核 + GNU 用户空间的工具们 (包括Bash), 虽然单说Linux并不是完整的操作系统, 但随着人们的误解和这么说的人越来越多, Linux也可以指代 GNU/Linux ,感兴趣可以看看GNU创始人的澄清.

编译C的编译器gcc, g++, 全称是什么? 属于什么? gcc (原本只是GNU C Compiler, 后来是GNU Compiler Collection), 它不仅可以编译C, 还可以编译C++, Objective-C, Fortran, Ada, Go等挺多语言; g++ (GNU C++ Compiler, 是GCC 中的 C++ 前端) g++(GNU C++ Compiler)是 GCC 的 C++ 前端/驱动程序。就命令 g++ 而言,它调用 GCC 的 C++ 前端,默认按 C++ 语法处理源文件(包括 .c,除非用 -x c 指定为 C),并默认链接 C++ 标准库。GCC 属于 GNU Project 的一部分。

省流版丢个表格能清晰点, 当我们使用gcc main.* -o main时:

扩展名默认语言模式
.cC (但用 g++ 编译会当作 C++)
.cc .cpp .cxx .c++C++
.C(大写)C++
.mObjective-C
.mmObjective-C++

所以.cppg++, .cgcc.

Unix和Unix-like的关系是什么? Unix-like系统现在包含正统的Unix系统,, 一个直观的树形图:

1
2
3
4
5
6
7
8
9
10
11
12
Unix-like
 ├── Certified Unix
 │    ├── IBM AIX
 │    ├── HP-UX
 │    ├── Oracle Solaris
 │    └── macOS
 └── Non-certified but Unix-like
      ├── GNU/Linux
      ├── FreeBSD / OpenBSD / NetBSD
      ├── illumos
      └── Minix
      └── ...

展示了二者的关系. 图表中的第二类Unix-like系统 (无认证) 的描述: 具有Unix特性和接口的系统, 目录和文件系统的层级结构类似Unix, 遵循POSIX的操作系统.

最后

  • 零零零基础, 不用担心很多东西不懂, 从 LLMs, Google, Wikipedia, Github, 甚至Youtube, Bilibili 等等网站能学到的东西数不胜数, 关键要有耐心, 推荐先浏览NJU-PA的Introduction部分
  • 玩的开心
  • 本文如有任何问题, 欢迎大佬指正!

  1. 推荐 WSL2, 最接近真实 Linux. 注意换行符 CRLF/LF 与路径差异. 可以在Windows Terminal中设置WSL路径转换 ↩︎

  2. 也可用 Git for Windows 自带的 Git Bash, Cygwin 或 MSYS2 等, 但还不急, 这些你以后可能会遇到 ↩︎

  3. 这里指Terminal Emulator, 并不是真正的Terminal, 感兴趣可以看看这个reddit的讨论 ↩︎

  4. 当然不止终端交互 (ref: wikipedia), 比如 Windows 的 explorer.exe. 右键菜单, 文件关联, 桌面等都属于它的职能, 而他是个Windows Shell (GUI Shell). 简而言之, 如果它主要启动/管理其他程序和环境, 那就是shell, 否则不是. ↩︎

  5. Windows 用 CRLF (\r\n), Unix/WSL/macOS 用 LF (\n). Bash 脚本必须是 LF; CRLF 会报错哦 ↩︎

  6. 实际上不准确, 我们用Bash编排流程 (它擅长使用CLI工具制作流程); 用 Python/Go 写程序; 性能交给 C/C++/Rust. ↩︎

  7. Note: Project 是组织与计划; Operating System 指 Hurd 内核 + 用户空间; 多数人日常用的是 Linux 内核而非 Hurd. ↩︎

This post is licensed under CC BY 4.0 by the author.