帖接上回(linux 入门编程C++指引),本篇主要讲述linux终端的部分基本指令,提到一些快捷键与工具(tldr,tree...),举出相关命令的使用方式
MingLLuo 重定向、管道符
Shell是终端程序的统称,Linux中系统默认使用Bash(Bourne Again SHell)解释器
Shell是人与硬件之间的中介,翻译员,它允许我们执行程序,输入并获得相应的输出
我们可以通过编写shell脚本来实现复合操作,在本贴主要介绍bash的基础使用(脚本下次学完再水 )
在几乎所有的终端系统中,我们都可以通过方向键来调取之前所执行过的命令(貌似一些刚接触的小白不知道)
在linux中还有什么特别的地方吗?
- 在输入部分指令、参数时可以通过按下一次Tab键补全代码(按下两次可以列出所有适合指令)
- 拥有强大的批处理脚本执行能力
- ....
图形化界面的出现简化了操作的步骤,降低了人们出错的概率,但是终端的灵活性、可控性依然不能被大家忽视,图形化的界面往往占用了更多的系统资源,所以一些应用场景中很少使用图形化界面,反倒常喜欢通过远程连接(ssh...)进行控制
如何使用
这一部分细讲有好多,我只挑部分比较重要的来讲(有的还不会 😅 )
首先要找到对应环境下的终端并打开
root@debian:~#
如上,我们可以提取关键信息,我目前的身份是root用户,@后一串表示系统的部分信息,表明我们处在(home),进入bash时,可能不会直接登录root用户,此时会出现$符号
sh:~$
此时我们仅仅是用钥匙打开了大门,真正的探索现在开始
常用的linux命令格式往往如下:
命令名 [命令参数] 命令对象
快捷键:
Tab:实现命令、参数等内容的补全
root@debian:~# apt<Tab><Tab>
apt apt-config apt-key
apt-add-repository apt-extracttemplates apt-listchanges
apt-cache apt-ftparchive apt-mark
apt-cdrom apt-get apt-sortpkgs
Ctrl+C:强制中断程序执行
Ctrl+Z:中止任务(暂停,此时任务未结束,被挂起)
Ctrl+D:发出exit指令,推出当前用户、客户端
Ctrl+I:清屏操作
命令查询
man [命令名称]
[命令名称] -h
...
对于不同命令使用以上操作几乎都是直接调用帮助手册
我们可以通过安装插件来辅助使用,这里我推荐tldr
安装方式:apt install tldr
使用方式:
root:~# tldr history
history
- Display the commands history list with line numbers:
history
- Display the last 20 commands (in zsh it displays all commands starting from the 20th):
history {{20}}
- Clear the commands history list (only for current bash shell):
history -c
- Overwrite history file with history of current bash shell (often combined with history -c to purge history):
history -w
- Delete the history entry at the specified offset:
history -d {{offset}}
备注:安装tldr后由于环境原因可能会报错,需要根据问题自行搜索解决方案重新定位tldr索引库
常用的系统命令
date
echo - reboot/poweroff
(pwd/cd/ls/tree/find)
history
(cat/more/head/tail)
(touch/mkdir/cp/mv/rm/file)
1.date
在终端输入date并回车,我们发现它打印出了日期和时间
root:~# date
Thu 09 Dec 2021 09:25:58 AM HKT
root:~#
通过man date指令我们能探索到更多功能
如何输出特定格式的日期呢,exp:
root:~# date "+%Y-%m-%d"
2021-12-09
还可以查看今天是当年的第几天,本月的第几天
root:~# date "+%Y %j%n%B %d"
2021 343
December 09
2.echo
输出字符串或者变量中的内容
格式 :echo 字符串 或者 echo $变量名
root:~# echo hello
hello
----------------------
root:~/code# name=user
root:~/code# echo $name
user
3.reboot/poweroff
看词就知道会发生什么
4.定位文件指令
pwd
用来显示当前的工作目录(print working directory)
root:~# pwd
/root
root:~/code/src# pwd
/root/code/src
cd
用于切换工作路径(change directory)
cd /
cd ~ //回到用户主目录 PS:直接使用cd也可以
cd - //回到上一次所在目录
cd .. //切换到当前目录的上级目录
ls
用于显示目录文件信息(list)
ls //
ls -a //显示所有文件及目录 (. 开头的隐藏文件也会列出)
ls -l //写出详细信息
--------------------
root:~/code# ls
a.out src test '#test.cpp#' test.cpp
root:~/code# ls -a
. a.out test test.cpp .test.cpp.swp
.. src '#test.cpp#' .test.cpp.swo
root:~/code# ls -l
total 72
-rwxr-xr-x 1 root root 17600 Nov 25 16:57 a.out
drwxr-xr-x 2 root root 4096 Dec 9 09:54 src
-rwxr-xr-x 1 root root 39384 Nov 25 16:58 test
-rw-r--r-- 1 root root 82 Nov 25 00:10 '#test.cpp#'
-rw-r--r-- 1 root root 287 Nov 25 16:57 test.cpp
root:~/code# ls -al
total 104
drwxr-xr-x 3 root root 4096 Dec 9 09:54 .
drwxr-x--- 11 root root 4096 Dec 9 08:52 ..
-rwxr-xr-x 1 root root 17600 Nov 25 16:57 a.out
drwxr-xr-x 2 root root 4096 Dec 9 09:54 src
-rwxr-xr-x 1 root root 39384 Nov 25 16:58 test
-rw-r--r-- 1 root root 82 Nov 25 00:10 '#test.cpp#'
-rw-r--r-- 1 root root 287 Nov 25 16:57 test.cpp
-rw-r--r-- 1 root root 12288 Nov 25 16:37 .test.cpp.swo
-rw-r--r-- 1 root root 12288 Nov 25 16:37 .test.cpp.swp
tree
树状图形式输出目录内容、结构
root:~/code# tree
.
├── a.out
├── src
├── test
├── #test.cpp#
└── test.cpp
1 directory, 4 files
//需要安装tree工具 apt install tree
find
按照条件查找文件对应位置(递归地搜索符合条件的文件)
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的cpp文件(f->file)
find . -path '*/test/*.cpp' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
它还可以执行部分任务
# 删除全部扩展名为.tmp 的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并将其转换为 JPG
find . -name '*.png' -exec convert {} {}.jpg \;
还有许多社区开发的功能更多文件管理器,也非常实用,这里不过多介绍了
5.history
显示执行过的命令
执行history后我们可以使用Ctrl+R来查询关键词
6.文件查看
cat
查看内容较少的文本文件(concatenate)
cat test.cpp
cat -n test.cpp
------------------
root:~/code# cat test.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"hello,world";
}
root:~/code# cat -n test.cpp
1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 cout<<"hello,world";
6 }
想必你可以看出有什么不同,-n使得对应行号被输出
more
查看内容较多的文本文件,还会有贴心的百分比提示你看到了哪里
head/tail
head 查看文本文件前N行
tail 查看文本文件后N行
head -n 1 test.cpp
tail -n 1 test.cpp
7.文件管理
touch
创建空白文件或者修改文件时间(貌似很多hack经常用)
touch path/to/file //创建空文件或者指定文件时间为当前
touch -t {{YYYYMMDDHHMM.SS}} path/to/file //设置时间
touch -d "{{-1 hour}}" path/to/file //设置文件时间为前1h
touch path/to/file{1,2,3}.txt //多文件创建
----------------------------------------------
root~/code/src# ls
root:~/code/src# touch test{1,2,3}.txt
root:~/code/src# ls
test1.txt test2.txt test3.txt
mkdir
创建空白目录(make directory)
mkdir code
mkdir -p a/b/c/d/e //还可创建有嵌套关系的目录
----------------------
root:~/code/src# mkdir -p a/c/d
root:~/code/src# tree
.
├── a
│ └── c
│ └── d
├── test1.txt
├── test2.txt
└── test3.txt
cp
用于复制文件和目录
cp [参数] 源文件 目标文件
cp [参数] 源文件 目标文件夹
-p //保留文件属性
-r //递归复制(用于目录)
...
mv
用于剪切或者重命名文件(move)
mv [参数] 源文件 目标文件
root:~/code/src# ls
a test1.txt test2.txt test3.txt
root:~/code/src# mv a .. //a被移至上级目录
root:~/code/src# ls
test1.txt test2.txt test3.txt
rm
删除文件或目录
rm [参数] [文件路径]
-f //强制删除
-i //删除前询问
-r //删除目录
-v //显示过程
------------
root:~/code# rm -i -r -v a
rm: descend into directory 'a'? y
rm: descend into directory 'a/b'? y
rm: remove directory 'a/b/c'? y
removed directory 'a/b/c'
rm: remove directory 'a/b'? y
removed directory 'a/b'
rm: remove directory 'a'? y
removed directory 'a'
file
查看文件类型
root:~/code# file test.cpp
test.cpp: C++ source, ASCII text
学习资料推荐:
MIT的The Missing Semester of Your CS EducationPS:这个有公开的录课,可以搭配食用 :)
刘遄《Linux就该这么学》