帖接上回(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就该这么学》

1 个月 后
MingLLuo 更改标题为「linux 中Shell的使用

本部分主要介绍重定向、管道符、通配符,作为上次的补充

重定向> <

参考:Redirection Definition

重定向被分为输入重定向和输出重定向

它的语法如下, < 用于重定向输入,> 用于重定向输出

输入重定向是把文件导入到命令中,输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中

command < file // 将文件作为输入源
command > file // 将命令输出放至file中,不在终端中显示
command << delimiter //Delimiter(分界符),从输入中读入,直到遇到分界符停止
-----
command 2> file // 将错误输出放置到文件中(清除原来数据)
command >> file // 将标准输出附加到文件末尾
command 2>> file // 将错误输出附加到文件末尾
-----
command &>> file  //将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
-----
command < file1 > file2 // 将文件1作为输入,执行命令后将输出至文件2

这里简单介绍一下文件描述符,具体可以参考

文件描述符(File Descriptor)简介

维基百科:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

名称缩写文件描述符状态
标准输入重定向STDIN0默认从键盘输入,也可从其他文件或命令中输入
标准输出重定向STDOUT1默认输出到屏幕
错误输出重定向STDERR2默认输出到屏幕

在执行自动化的脚本时,使用重定向我们可以记录报错信息,以便日后排查错误

管道符|

用于连接标准输入输出,每个进程输出直接作为下个进程输入,与其他命令配合可以提高生产效率

例如,在多文件情况下使用ls -l 时,命令行界面会快速滑过,使用ls -l | more 可以利用翻页功能

通配符

顾名思义,通配符就是通用的匹配信息的符号

? // 单个任意字符
* // 任意字符,可以表示多个字符
[..] | [^..] [!..] //匹配方括号内任意单字符| 不在方括号内的字符(非空)
{...} //匹配大括号内的字符串
{start..end} //匹配范围内字符
root@sh:try# tree -d // 测试目录结构
.
└── test
      └── new
      └── empty
// test包含a1.txt  a2.txt  b1.txt  b2.txt  c1.txt  c2.txt  d1.txt  d2.txt
// new包含1.txt  2.txt  3.txt  4.txt || empty为空
// 通过touch可以快速创建空文本
root@sh:test/new# ls {1..3}.*
1.txt  2.txt  3.txt
// 这里的* 匹配为 txt
root@sh:test# ls [abc]1.txt
a1.txt  b1.txt  c1.txt
// [abc]1 匹配为 a1 b1 c1
root@sh:test# ls [^ab]1.txt
c1.txt  d1.txt
// [^ab]1 匹配为 c1 d1
root@sh:test# ls */*.txt
new/1.txt  new/2.txt  new/3.txt  new/4.txt
// 由上可以观察
root@sh:test# ls *
a1.txt  a2.txt  b1.txt  b2.txt  c1.txt  c2.txt  d1.txt  d2.txt
empty:

new:
1.txt  2.txt  3.txt  4.txt

还有很多形式如:[[:upper:]] [[:lower:]] [[:digit:]]...

本贴shell未涉及部分可以自行查询学习

下一篇打算写一下vim的基本使用和环境配置,寒假再发...

    © 2018-2025 0xFFFF