Noi Linux的使用
darkflames
2018-02-23 11:56:43
### 一、Linux 的基本操作(命令行)
1. 打开命令行
在Noi Linux中可以使用快捷键**CTRL + ALT + T**打开命令行终端
2. Linux的目录
Linux是没有Windows下硬盘分区的概念的所有设备均会被挂载到一个统一的文件系统,Linux下的目录有两种:
* 绝对目录:
相对于文件系统的根目录(/)来定位文件,如: **/etc/apt/source.list**, **/var/www/**
* 相对目录:
相对于当前工作目录而言,比如工作目录位于**/etc**,**/etc/apt/source.list**也可以表示为**apt/source.list**或**./apt/source.list**
Linux下一个核心的思想就是一切皆文件,是没有扩展名这一个概念的,有时文件名被写作xxx.xxx也只是为了方便标识或分隔,并不被程序或者操作系统分别处理
同时还有一些特殊的路径表示,比如可以用**./**表示当前目录**../**表示父目录
3. 文件操作的相关命令
* ls
显示当前目录的所有文件与目录
```bash
$ ls
```
显示指定目录的所有文件与目录
```bash
$ ls [DIR]
$ ls /etc
$ ls /var/www
```
* cd
进入指定目录
```bash
$ cd [DIR]
$ cd /etc
$ cd app/src
$ cd ..
```
* mkdir
创建子目录(新建文件夹)
可以使用参数 -p 确保目录名称存在,不存在的就建一个
```bash
$ mkdir src
$ mkdir -p /home/darkflames/test
```
* mv & cp
**mv** 是将一个目录或文件移动到另一个目录
**cp** 是将一个目录或文件复制到另一个目录
```bash
$ mv app/src /etc/app/src
$ cp app/src /etc/app/src
```
* rm
删除文件或目录,参数
- **-i** 删除前逐一询问确认。
- **-f** 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- **-r ** 将目录及以下之档案亦逐一删除。
删除文件可以直接无参数执行,删除目录则需要使用-r
通常我们可以直接使用**-rf**参数直接删除指定的目录或文件
```bash
$ rm -rf app/src
$ rm -rf /home/darkflames/app
```
* pwd
显示当前工作目录的绝对路径
### 二、如何写代码
1. 使用Noi Linux自带的**guide**
2. 使用emacs/vim/gedit 命令行编译,同时可以使用gdb
#### 命令行下编辑,编译,运行程序
1. 编辑
```bash
$ vim [FILE]
$ gedit [FILE]
```
2. 编译
```bash
$ g++ code.cpp #输出文件默认为a.out
$ g++ code.cpp -o code #输出文件为code
$ g++ code.cpp -o code -O2 # 开启O2优化
$ g++ code.cpp -o code -Wall #显示所有警告建议开启
```
3. 运行程序
```bash
$ ./code
$ ./a.out
```
4. 其他辅助工具
```bash
$ time ./code #统计运行时间
$ diff -b test.out test.ans # 比较文件差异,-b参数忽略行末空格
```
### 对拍
#### CPP
```cpp
#include<bits/stdc++.h>
using namespace std;
#define _DO_CMDS(cmds) for(int _index = 0; _index < sizeof(cmds) / 4; _index++){ system((cmds[_index])); }
char* build[] = {
"g++ test.cpp -o test",
"g++ gen.cpp -o gen -O2",
"g++ std.cpp -o std -O2"
};
char* genData[] = {
"./gen > data.in",
"./std < data.in > data.ans"
};
int main() {
_DO_CMDS(build);
for(int i = 0; i < 100 ; i++) {
_DO_CMDS(genData);
printf("CASE: %d", i);
if(system("./test < data.in > data.out") != 0) {
printf("RE\n");
break;
}
else if(system("diff -b data.out data.ans")) {
printf("WA\n");
break;
}
else printf("AC\n");
printf("#####################################");
}
return 0;
}
```
#### Shell
```bash
#!/bin/bash
g++ test.cpp -o test
g++ std.cpp -o std -O2
g++ gen.cpp -o gen
i=1
tot=100
while [ $i -le $tot ]; do
./gen > data.in
./std < data.in > data.ans
./test < data.in > data.out
if [ $? -ne 0 ]; then
echo -e "CASE $i: RE"
break
elif diff -b data.ans data.out ; then
echo -e "CASE $i: AC"
else
echo -e "CASE $i: WA"
break
fi
let i++
done
```