NOI Ubuntu 20.04.1 系统的一些基本操作

这是 NOI Ubuntu 20.04.1 系统中一些程序的基本使用方法。

Linux 是内核!内核!内核!Ubuntu 才是系统的名字,就像 Windows 一样。

Terminal:终端

Ctrl+Alt+T 打开终端。
Ctrl+C 强行停止当前执行的命令。
Ctrl+D 退出终端

Ubuntu 的目录

Ubuntu 是没有 Windows 下硬盘分区的概念的,所有设备均会被挂载到一个统一的文件系统,Ubuntu 的目录有两种:

  • 绝对目录:
    相对于文件系统的根目录 "/" 来定位文件,如:/etc/apt/source.list/var/www/

  • 相对目录:
    相对于当前工作目录而言,比如工作目录位于 "/etc/apt" ,/etc/apt/source.list 也可以表示为 source.list./source.list

参考:洛谷 darkflames :Noi Linux的使用

输入文件路径可以将文件直接拖入终端中,使用拖放 输入路径、移动复制文件 的操作只能在 nautilus(文件管理器)的窗口中使用。

注意:密码、路径或文件名中有空格时需要加引号!!!

$ l [DIR]

  • l 查看当前目录下的文件和文件夹,显示规则如下:

     普通文件: a.cpp 
     可执行文件: unnamed
     文件夹: abc
     用户有写入权限的文件夹: abc
     压缩文件: 123.tar 
     图像/Socket文件: a.png 
     链接文件: lib
     设备文件: tty 
  • l DIR 查看 "DIR" 目录下的文件和文件夹

  • l -l 查看文件属性

$ ls [DIR](常用)

  • l simplified 的意思,将 l [DIR] 的显示做了简化,用法相同。显示规则如下:
     普通文件: a.cpp 
     可执行文件: unnamed
     文件夹: abc
     用户有写入权限的文件夹: abc
     压缩文件: 123.tar 
     图像/Socket文件: a.png 
     链接文件: lib
     设备文件: tty 

$ cd [DIR](常用)

  • cd DIR 进入 "DIR" 文件夹

  • cd .. 后退一层目录

  • cd ../.. 后退两层目录,以此类推,目录层数不足(超过根目录)时执行失败

$ pwd Print Working Directory ,显示当前所在目录的绝对路径

$ touch a.cpp 在当前目录下新建名为 "a.cpp" 的文件[1]

$ mkdir abc Make Directory ,在当前目录下新建名为 "abc" 的文件夹,也可以使用 右键 > New Folder 新建文件夹。

$ mv [FROM] [TO] Move ,移动文件

$ cp [FROM] [TO] Copy ,复制文件

$ nautilus 打开文件资源管理器

$ rm [FILENAME/DIR] Remove

  • rm a.cpp 删除当前目录下的文件 "a.cpp"

  • rm -r abc 删除当前目录下的文件夹 "abc"

  • rm -f a.cpp 强制删除文件 "a.cpp"

  • rm -rf abc 强制删除文件夹 "abc"

$ g++ [INPUT] -o [OUTPUT] 编译命令(常用)

一般使用:g++ a.cpp -o unnamed -Wall -g 将代码 "a.cpp" 编译为程序 "unnamed" ,如果文件名中有空格要加引号。

  • g++ :C / C++ 编译器

  • -o 编译命令

  • -wall 开启所有错误提示(warn all)

  • -Wall 开启所有错误提示和警告

  • -g 将调试信息写入程序,不常用gdb调试也可以不加。

以下命令的不会在比赛中涉及:

  • -O2 开启O2优化

  • -lpthread 开启多线程

  • -D [TEXT] 定义宏[2]


$ ./unnamed 运行当前目录下名为 "unnamed" 的程序,注意:Ubuntu 中没有后缀名的概念。(常用)

$ time ./unnamed 计时启动程序 "unnamed" ,可以用来卡时间

$ zip [OUTPUT] [DIR/FILENAME] 压缩文件

  • zip a.zip abc 将文件夹 "abc" 压缩为 "a.zip"

  • -rP 123456 设置密码 "123456"

$ unzip [INPUT] 解压文件(常用)

  • unzip a.zip 解压 "a.zip" 至当前目录

  • -P 123456 压缩包有密码,使用密码 "123456" 解压

  • -d abc 将文件解压至 "abc" 文件夹中(Destination Floder)

$ diff [FILENAME1] [FILENAME2] 比较文件

  • diff test.out test.ans 比较两文件的差异

  • -b 忽略行末空格

$ cat a.txt Concatenate(还不如记成“猫”),显示 "a.txt" 的内容

$ echo “123” >a.txtprintf “123” >a.txt 将 "123" 写到 "a.txt" 中

$ man [COMMAND]* --help 显示命令用法(常用)

$ exit 退出终端 (常用)


Nautilus:文件资源管理器

  • F2 重命名(桌面也可用)

  • Ctrl+X 剪切, Ctrl+C 复制, Ctrl+V 粘帖

  • Ctrl+N 新建一个在当前目录的文件资源管理器窗口

  • Ctrl+Shift+N 新建文件夹

  • Back 后退一层目录

  • 在两个窗口间拖放文件以复制和移动


gdb 调试

GNU Debug ,在终端中输入 $ gdb unnamed 使用 gdb 对程序 "unnamed" 进行调试,前提是编译时写入了调试信息。

  • l nlist n:查看代码(第 n 行上下 10 行)。例如:l 9 查看第 4 到 12 行的代码

  • b nbreak n:在第 n 行设置断点

  • b n if i==9 :当变量 i 等于 9 时,在第 n 行设置断点,可以用于 for 循环的调试

  • rrun :运行

  • nnext :单步执行

  • sstep :单步进入(某函数)

  • ccontinue :继续执行

  • p aprint a :查看变量 a 的值

  • disp a :持续显示变量 a

  • qqiut:退出

  • info breakinfo breakpoints :查看断点信息

  • d nd n-m :删除第 n 个断点 或 删除第 n-m 个断点


Code::Blocks

新建源码

  • 点击 File -> New -> Project -> console application(控制台程序)新建 C/C++ 程序。

  • 不要新建 Empty File(空文件),在 Code::Blocks 中空文件不能进行调试。

  • Project Filename 的后缀名就是 .cbp ,不要随意更改。

  • 主程序代码在左侧 Sources 文件夹中,名为 "main.cpp" ,内容默认为 Hello World 例程。

设置选项

  • 在 Settings(设置)-> Editor(编辑器)-> Font(字体)中,点击 Choose 设置字体(就在第一行)。

  • 在 Settings(设置) -> Compiler(编译器)-> Font(字体)-> Global compiler settings(全局编译设置)右面下方的 Debugging 菜单中勾选 " ...... [-g]" 一项。

开始编程

  • F5 设置断点

  • 编译按钮 翻译:
    编译,运行,编译并运行,重新生成。

  • 调试按钮 翻译:
    调试/继续,运行到光标处,下一行,跟进,跟出,下一条指令,转到指令,中断调试,停止调试器。

  • 调试窗口 翻译:
    (从上到下)断点,CPU寄存器,调用栈,反汇编,内存崩溃信息,运行线程,监视变量。


Gedit

简单写一下,具体可以看我写的 如何把Ubuntu的Gedit改成简单的IDE

在终端中输入 $ gedit a.cpp 用 gedit(文本编辑器)打开 "a.cpp" ,如果不存在,gedit 将新建一个名为 "a.cpp" 的空白文件。注意:gedit 中可以识别文件的后缀名。

Preference:

  • Editor:设置 Tab 距离为 4 ,自动缩排

  • Font & Colors:不使用系统字体,选择 Ubuntu Mono Regular 20

  • Plugins:勾选 External Tools 扩展工具

Manage External Tools:

  • Compile:

    #!/bin/sh
    cd $GEDIT_CURRENT_DOCUMENT_DIR
    g++ $GEDIT_CURRENT_DOCUMENT_NAME -o unnamed -Wall -g
    

    快捷键:F2
    保存:当前文档
    输入:无
    输出:展示在下方面板

  • Run:

    #!/bin/sh
    cd $GEDIT_CURRENT_DOCUMENT_DIR
    time ./unnamed
    

    快捷键:F3
    保存:无
    输入:无
    输出:展示在下方面板

  • Open:

    #!/bin/sh
    killall unnamed
    gedit ./*.out
    

    快捷键:F4
    保存:无
    输入:无
    输出:展示在下方面板

  • Open 需要程序有输出,在 C/C++ 中:

    输入:apple.in
    输出:apple.out

    #include <cstdio>
    int main()
    {
    	freopen("apple.in","r",stdin);
    	freopen("apple.out","w",stdout);
    	...
    }
    

Vim

在终端中输入 $ vim a.txt 用 vim(文本编辑器)打开 "a.txt" 。

文件操作

  • r a.txt 读取文件 "a.txt"

  • w a.txt 写入(保存到)"a.txt"

  • q 退出 vim

  • wq 写入并退出

编辑

  • i insert ,进入插入模式,按 ESC 退出

  • [[ 将光标移动到代码块的开头

  • ]] 将光标移动到代码块的结尾

  • G 将光标移动到最后一行

  • xG 将光标移动到第 x 行

详细用法

想深入学习 Vim 编辑器的用法可以看看这些文章:


快捷键

很多和 Windows 是一样的:

Ctrl+A:全选

Ctrl+C:复制

Ctrl+X:剪切

Ctrl+V:粘帖

Ctrl+F:查找

Ctrl+G/H:替换

Ctrl+N:新文档

Ctrl+O:打开文档

Ctrl+S:保存文档

Ctrl+Z:撤销

Ctrl+Y:重做

Ctrl+Tab:切换窗口

Win+D:显示桌面

Win+Space:切换输入法

Ctrl+Alt+Delete:注销

Ctrl+Alt+F1:强行注销

Ctrl+Alt+F2:退出完全终端

Ctrl+Alt+F3F4F5F6:完全终端



注释:


  1. touch 的本意并非创建文件,而是:

    • touch — change file access and modification times (BSD)
    • touch — change file timestamps (GNU)

    即“修改文件的访问和修改时间”、“修改时间戳”,也就是摸一下好看上去最近动过了。

    参考:知乎 - Artoria2e5 的回答

    ↩︎
  2. -D ONLINE_JUDGE 定义名为 "ONLINE_JUDGE" 的宏,洛谷、Vjudge 等OJ平台一般都有此定义。
    在程序中可以这样使用:

    int function()
    {
    	#ifdef ONLINE_JUDG
    		printf("如果定义了ONLINE_JUDG,这句就会被编译到程序里");
    	#endif
    	#ifndef ONLINE_JUDG
    		printf("如果没有定义ONLINE_JUDG,这句就会被编译到程序里");
    	#endif
    }
    
    ↩︎
posted @ 2021-08-29 19:56  听海云烟  阅读(38)  评论(0)    收藏  举报