步入Linux的现代方法


@Copyright: https://space.bilibili.com/19658621/, https://wangchujiang.com/linux-command/

Course links: https://www.bilibili.com/video/BV18U4y1W7av, full edition: https://www.yuque.com/frank-93a7b/fuck/raruzp

零:Linux的初步认识

1.系统的认识

  • 系统 —— 操作系统

  • 人机交互

2.Linux操作系统认识,以及开源的提出:Linux的千奇百怪的版本

  • 系统:
    • Windows —— Microsoft
    • Linux —— Linus Torvalds 林纳斯-托瓦兹
    • Unix(Linux的baba),纯C写的
    • MacOS —— Apple

3.开源的含义

  • 开放源代码(开源):我写的源代码公诸于世
  • 开源不一定免费
    • eg: RedHat —— 个人免费,企业收费(福特汽车,xx银行)
  • Google Pixel -> XIAOMI OPPO VIVO HUAWEI
  • Linux -> Ubuntu CentOS RedHat Kali

4.Linux的用途,各类发行版本

  • Linux —— 一种自由和开放源码的类 Unix 系统

    https://www.wiki-wiki.top/wiki/Linux

  • Linux 严格来说单指操作系统的内核,没有图形界面。

    如今 Linux 常用来指基于 Linux 的完整操作系统。

  • Linux -> Ubuntu CentOS RedHat Kali

    • Ubuntu 面向个人用户
    • CentOS 公司服务器使用
    • RedHat 金融公司
    • …… 公司定制 Unix 系统
  • 大部分人使用的是 Linux 发行版,Linux 可以运行在个人 PC、服务器、嵌入式系统上。

    Linux 发行版

    • Debian –> Ubuntu 、Linux Mint (相当于 XIAOMI –> Redmi)
    • Fedora –> Red Hat Enterprise Linux、 CentOS
    • openSUSE

一:VMware虚拟机的使用

1.VMware虚拟机

  • 学习指路☛

    https://www.bilibili.com/video/BV1t741167UB

    • 1.虚拟、安全性 —— 与本机独立,虚拟化的一个系统
    • 2.随意性 —— 可以把软件拖来拖去
    • 3.快捷快照 —— 快速恢复到原来状态
  • 3种选择:

    • 实体机 硬件不支持 X
    • 双系统 别折腾 X
    • VM虚拟机
  • 关于软件版本:

    • 追求新? No,just 体验 企业 –> 稳定

2.VMware Workstation 16

https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html

win10官方镜像网站

https://www.microsoft.com/zh-cn/software-download/windows10/

Ctrl + Alt 释放鼠标,回到真实机

3.关于从15更新到16的说法

  • 建议:卸载15,再安装16,防止某些服务不支持。

  • 自己操作:直接覆盖更新至 VMware 16,未出现问题。


二:发行版本安装演示

1.Ubuntu 20.04的安装

  • 下载官方 .iso 镜像

    https://ubuntu.com/#download

  • 在VMware Workstation 中新建虚拟机,选用已下载的 .iso 镜像文件,自定义相关配置如下

    Ubuntu 64位
    8G内存
    2*2处理器
    将虚拟磁盘存储为单个性能(可提升性能)
    移除打印机
    命名:Ubuntu2004x64
  • Ubuntu 安装设置

    English
    Minimal Installtion(无多余软件)
    默认格式化磁盘
    选择位置:Xi'an
    用户名:Lee
    密码:123456
    跳过Install更新过程。后续可以更新阿里镜像源后再update

2.VMware Tools

  • 更新阿里镜像源:

    打开第一个 Software… -> Ubuntu Software -> download from -> other: mirrors.aliyun.com -> 点击 close

  • 更新系统:

    打开第二个 Software -> update -> restart

  • 安装 vmware tools:

    将 vm.tar.gz 复制到 Desktop
    打开 terminal
    命令:ls		查找,发现.tar文件
    命令:tar zxvf VM + Tab键		解压缩
    命令:cd vmare-tools-dirstri		进入解压缩文件夹
    命令:ls		查找,发现vmware-install.pl文件
    命令:sudo ./vmware-install.pl		执行安装命令
    输入密码
    一路回车
    安装成功,删除.tar文件

3.Ubuntu 20.04设置

  • Settings

    自定义

4.其他发行版本的安装指导

  • 某些 Linux 发行版(如 Kali)未在 VMware Workstation 中提供,可以找到其相关版本(Debian)。
  • 多尝试,找异同。

5.下载指导

CentOS:https://www.centos.org/download/

Kali Linux: https://www.kali.org/downloads/

Ubuntu: https://ubuntu.com/#download

…… 自己找官网,download 即可


三:步入Linux的世界

1.Linux究竟需要我们学习什么?—— Linux四大组成部分

  • Linux 入门不是学 “Linux”

    1. 体验:比较与其他系统的异同点

    2. Linux -> Shell

  • Linux 四大组成部分:

    1. Linux Kernel 内核

    2. GNU 工具

      GNU(/ɡəˈnuː/)是一个自由的操作系统,其内容软件完全以 GPL 方式发布。这个操作系统是 GNU计划的主要目标,名称来自GNU’s Not Unix!的递归缩写,因为 GNU 的设计类似 Unix,但它不包含具著作权的 Unix 代码。

      GNU 的创始人,理查德·马修·斯托曼,将 GNU 视为“达成社会目的技术方法”。

    3. GUI Desktop 环境

    4. Application 应用

2.Linux 是命令还是图形界面?—— GUI & GNU

  • Linux 真正的名字 —— GNU / Linux

    Linux 操作系统包涵了 Linux 内核与其他自由软件项目中的GNU组件和软件,可以被称为 GNU/Linux。

  • GUI & GNU <– Linux 内核 <– 硬件(鼠标、键盘)

    • GUI —— 图形界面
    • GNU —— 命令窗口

3.Linux 内核组成部分

  1. 硬件设备 管理和使用
  2. 软件程序(系统) -> 操作进程
  3. 系统内存(可参考阅读《现代操作系统》)
  4. 文件管理 —— 增、删、改、查……

4.文件系统 —— 开车警告

  • 文件系统:读、写的标准

    eg:win10 — NTFS Linux — ext, ext2, ext3, ext4…

5.GNU 核心: coreutils and shell

GNU的来源:Unix上的一些软件,Linux内核本身没有,所以GNU模仿Unix,为Linux写了一些必要的软件。

  1. 供 Linux 使用的开发出来的这套工具:coreutils 软件包

    • 用来处理文件的工具
    • 用来操作文本的工具 eg:vim
    • 用来管理进程的工具 eg:System Monitor
  2. shell

    一般来说,Shell是指操作系统中提供访问内核所提供之服务的程序。Shell也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。

6.Shell:CLI 和 GUI

  • 通常将 shell 分为两类:命令行与图形界面,即CLI 和 GUI

    • 命令行壳层提供一个命令行界面(CLI,Command -Line Interface)
    • 图形壳层提供一个图形用户界面(GUI,Graphical User Interface)
  • 通常 Linux shell 指:CLI shell

    • Bash—— 基础、默认 shell
    • Zsh,Z shell —— 自2019年起,macOS 的默认Shell已从 Bash 改为 Zsh。
    • Ash,A shell

7.GUI Desktop —— XW KDE GNOME Unity :探究 Linux 那些年的桌面

  • GNU 计划 —> 开发 Desktop 版本(满足鼠标等外设的多样使用)
    • X Windows —— 一种以位图方式显示的软件窗口系统,是下面这些的基础
    • KDE —— 可看做一种桌面设计风格(有开始菜单,任务栏,最大最小化…)
    • GNOME —— 面向目标:Linux
    • Unity —— 用于 Ubuntu 的 GNOME

8.结束语:经验介绍

  1. 学了什么?

    • 概念认知,熟悉了解 Linux 及其发展史

    • 学习核心:Linux 内核 和 shell 命令

  2. 绘制思维导图,理清各概念关系(自由笔记,学会为重)


四:★Bash shell命令

1.CLI Terminal

  • F11 —— 全屏 terminal

  • 自己调、看 Preference

  • Text 字体不要随便调,要使用等宽字体

  • 认识

    lee@lee-virtual-machine:~$
    userName@deviceName:
    ~ 用户home目录 
    $ 等待用户输入

2.ls初使用

搞定Linux命令参数,得心应手使用各类命令 —— 授之以渔 先拿ls开张

ls

ls - list directory contents 展示当前目录下的所有目录

ls -a -l … 可以多选项,但需要空格间隔开;或直接 ls -al。

man ls

进入 User Commands, 并为你展示该命令的详细内容

ls -l -a(可用 ll 直接代替)

展示当前目录下的所有文件(包括隐藏文件) PS:隐藏文件以“.”开头

3.Linux 根目录

  • Windows 分盘,盘符:D: E: F: …

    盘符: 路径 eg:E:\DevTools\IDEA\IntelliJ IDEA 2020.3.2\bin

  • Linux 一切皆文件

    /home/lee/Documents/1.txt

    所以 Linux 尽量不显示隐藏文件,防止误操作。

  • / —— Linux 的根目录

4.Linux 根目录解析

  • 目录解析:

    • / —— 根目录

    • /bin —— GNU工具、ls等系统自带命令

    • /cdrom —— 光驱

    • /etc —— 系统配置文件目录

    • /home —— 主目录,显示所有用户目录

    • /lib —— 库目录

    • /lost+found —— 意外情况(如停电)中有文件存在这

    • /mnt —— 挂载目录(挂载:外在设备与主机连接)

    • proc —— 伪文件系统

    • /run —— 运行目录

    • /tmp —— 临时目录

    • /var —— 可变目录(eg:存放log日志文件)

    • /boot —— 启动目录

    • /dev —— 设备目录

    • /media —— 媒体目录

    • /opt —— 可选目录(第三方软件一般在这)

    • /root —— root用户(管理员)的主目录

    • /sbin —— 系统二进制目录,GNU高级管理员使用的命令工具

    • /srv —— 服务目录(本地服务)

    • /usr —— 用户二进制目录

  • FHS —— 文件系统层级标准

    pathname.com/fhs(上面目录解析的升级、专业版)

    ‪F:\07.Linux\资料\fhs-2.3.pdf(本地文件所在地)

5.Linux 上的路径与Windows 上的路径

  • 绝对路径:文件的完整路径

    盘符:\文件夹\…\文件名.文件后缀名(Win) ~/文件夹/…/文件名.文件后缀名(Linux)

    eg:G:\Game\Epic\Epic Games\Launcher\Engine\Binaries\Win64\EpicGamesLauncher.exe

    ​ /home/lee/Documents/doc/1.txt

  • 相对路径:相对于当前目录的路径

    eg:G:\Game (.)\Epic\Epic Games\Launcher\Engine\Binaries\Win64\EpicGamesLauncher.exe

  • 单点符与双点符

    单点符.	当前目录
    双点符..	当前目录的父目录
  • 注意区分

    lee@lee-virtual-machine:~$ gedit (./)Documents/doc/1.txt # 不加/表示相对路径
    lee@lee-virtual-machine:~$ gedit /Documents/doc/1.txt # 加/表示绝对路径
    
    # 等效路径
    lee@lee-virtual-machine:~$ gedit Documents/doc/1.txt
    lee@lee-virtual-machine:~$ gedit ./Documents/doc/1.txt
    lee@lee-virtual-machine:~$ gedit ~/Documents/doc/1.txt

6.cd命令

cd — change directory

切换用户当前工作目录

cd [-L|[-P [-e]]] [dir]

主要用途

  • 切换工作目录至dir。其中dir的表示法可以是绝对路径或相对路径。
  • 若参数dir省略,则默认为使用者的shell变量HOME
  • 如果dir指定为~时表示为使用者的shell变量HOME.表示当前目录,..表示当前目录的上一级目录。
  • 环境变量CDPATH是由冒号分割的一到多个目录,你可以将常去的目录的上一级加入到CDPATH以便方便访问它们;如果dir/开头那么CDPATH不会被使用。
  • shopt选项cdable_vars打开时,如果dirCDPATH及当前目录下均不存在,那么会把它当作变量,读取它的值作为要进入的目录。

选项

-L (默认值)如果要切换到的目标目录是一个符号连接,那么切换到符号连接的目录。
-P 如果要切换到的目标目录是一个符号连接,那么切换到它指向的物理位置目录。
-  当前工作目录将被切换到环境变量OLDPWD所表示的目录,也就是前一个工作目录。

例子

cd    # 进入用户主目录;
cd /  # 进入根目录
cd ~  # 进入用户主目录;
cd ..  # 返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思);
cd ../..  # 返回上两级目录;
cd !$  # 把上个命令的参数作为cd参数使用。
cd -
# 命令会首先显示要切换到的目标目录,然后再进入。
cd ${OLDPWD}
# 命令会直接切换到上一个工作目录。

7.Ctrl + C

  • Ctrl + C —— 强制终止当前命令

    显示状态:^C

  • 如何复制、粘贴?

    Ctrl + Shift + C
    Ctrl + Shift + V

    Linux 终端内无法撤销”Ctrl+Z”

8.ls进阶用法:文件夹下各种匹配过滤符号

  • ls 命令补充

    # ls + 路径
    ls .		# 查找当前目录
    ls ~		# 查找用户目录
    ls /		# 查找根目录
    ls ./Documents/doc		# 查找路径对应的目录
  • 文件夹下各种匹配过滤符号

    直接上例子

    # 文件扩展通配符
    lee@lee-virtual-machine:~$ ls -l fhs-2.3_*.pdf        # '*'用于多个字符
    lee@lee-virtual-machine:~$ ls -l fhs-2.3_copy?.pdf    # '?'用于单个字符
    lee@lee-virtual-machine:~$ ls -l *.pdf				  # 查找指定文件类型的文件
    
    # 元字符通配符
    lee@lee-virtual-machine:~$ ls -l f[a-x]ck.txt		  # '[]'指定该字符范围

    自己找的:https://cloud.tencent.com/developer/article/1114732?from=information.detail.linux

  • ls 命令详解

    From: https://wangchujiang.com/linux-command/c/ls.html

    ls

    显示目录内容列表

    补充说明

    ls命令 就是list的缩写,用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。

    语法

    ls [选项] [文件名...]
       [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--full-time] 
       [--format={long,verbose,commas,across,vertical,single-col‐umn}] 
       [--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}] 
       [--color[={none,auto,always}]] [--help] [--version] [--]

    选项

    -C     # 多列输出,纵向排序。
    -F     # 每个目录名加 "/" 后缀,每个 FIFO 名加 "|" 后缀, 每个可运行名加“ * ”后缀。
    -R     # 递归列出遇到的子目录。
    -a     # 列出所有文件,包括以 "." 开头的隐含文件。
    -d     # 将目录名像其它文件一样列出,而不是列出它们的内容。
    -r     # 逆序排列。
    -t     # 按时间信息排序。
        
    -a, --all # 列出目录中所有文件,包括以“.”开头的文件。
    -b, --escape # 把文件名中不可输出的字符用反斜杠加字符编号(就像在 C 语言里一样)的形式列出。
    -d, --directory
          # 将目录名像其它文件一样列出,而不是列出它们的内容。
          
    -l, --format=long, --format=verbose
          # 输出的信息从左到右依次包括文件名、文件类型、权限、硬链接数、所有者名、组名、大小(byte)
          # 、及时间信息(如未指明是其它时间即指修改时间)。对于6个月以上的文件或超出未来
          # 1小时的文件,时间信息中的时分将被年代取代。
          # 每个目录列出前,有一行“总块数”显示目录下全部文件所占的磁盘空间。块默认是1024字节;
          # 如果设置了 POSIXLY_CORRECT 的环境变量,除非用“-k”选项,则默认块大小是 512 字节。
          # 每一个硬链接都计入总块数(因此可能重复计数),这无 疑是个缺点。

    实例

    $ ls       # 仅列出当前目录可见文件
    $ ls -l    # 列出当前目录可见文件详细信息
    $ ls -hl   # 列出详细信息并以可读大小显示文件大小
    $ ls -al   # 列出所有文件(包括隐藏)的详细信息
    $ ls --human-readable --size -1 -S --classify # 按文件大小排序
    $ du -sh * | sort -h # 按文件大小排序(同上)

    显示当前目录下包括影藏文件在内的所有文件列表

    [root@localhost ~]# ls -a
    .   anaconda-ks.cfg  .bash_logout   .bashrc  install.log         .mysql_history  satools  .tcshrc   .vimrc
    ..  .bash_history    .bash_profile  .cshrc   install.log.syslog  .rnd            .ssh     .viminfo

9.touch命令

组合命令

lee@fuck:~/Documents$ cd ../doc $$ ls -alF

&&: 进行命令的组合

touch 命令

  • 更新文件写入时间
  • 创建一个空文件
lee@fuck:~/Documents$ touch 2.txt

touch 命令详解

touch

创建新的空文件

补充说明

touch命令 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。

选项

-a:或--time=atime或--time=access或--time=use  只更改存取时间;
-c:或--no-create  不建立任何文件;
-d:<时间日期> 使用指定的日期时间,而非现在的时间;
-f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;
-m:或--time=mtime或--time=modify  只更该变动时间;
-r:<参考文件或目录>  把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t:<日期时间>  使用指定的日期时间,而非现在的时间;
--help:在线帮助;
--version:显示版本信息。

10.cp命令

cp 命令

  • cp 源文件 目标文件

  • 使用源文件覆盖目标文件,没有目标文件则创建并覆盖

  • 因此,先询问用户是否overwrite:添加参数-i,即cp -i 源文件 目标文件,此时需要回答y/n

    lee@fuck:~/Documents$ cp 1.txt 2.txt
    lee@fuck:~/Documents$ cp -i 1.txt 2.txt
  • 复制目录及文件

    lee@fuck:~/Documents$ cp ~/Documents/doc/* ~/Downloads    	 # 仅复制指定目录下的所有文件
    lee@fuck:~/Documents$ cp -r ~/Documents/doc ~/Downloads      # 递归处理指定目录下的所有文件与子目录
    lee@fuck:~/Documents$ cp 1.txt ~/Downloads    
    lee@fuck:~/Documents$ cp -i 1.txt ../         # 使用相对路径,复制到上一层目录 
    lee@fuck:~/Documents$ cp ../pdf/* .			  # .代表当前目录

    练习

    注:cd - 可以切换当刚才的目录

cp 命令详解

cp

将源文件或目录复制到目标文件或目录中

补充说明

cp命令 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。

语法

cp(选项)(参数)

选项

-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。

参数

  • 源文件:制定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用-R选项;
  • 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。

11.Linux终端光标移动技巧

  • Tab 键补全路径名

  • Ctrl 键加左右键,便于跳转单词(下划线命名法的用处)

  • Ctrl + L 清屏,实际是将terminal中已有内容全部上移

  • Ctrl + A 跳到命令头部,Ctrl + E 跳到命令尾部

  • Ctrl + H 将当前光标的前一个字母删除,Ctrl + T 将当前光标的前一个字母向后移(有空格不影响,跳过)

  • 没有左右方向键(买了HHKB键盘无刻版),可以用 Ctrl + BCtrl + F 代替(装13)

    上下键 —— Ctrl + P Ctrl + U

  • Ctrl + U 删除当前光标前的内容,Ctrl + K 删除当前光标的后续命令

  • Ctrl + R 搜索已使用过的命令

12.lnk链接文件

其他学习参考:https://blog.csdn.net/stupid56862/article/details/90785420

引入:windows中的快捷方式(.lnk)

Linux?

  1. 符号链接(软链接), symbolic link —— 快捷方式

    源文件(夹)必须存在;软链接实际是一种”指向“作用,是一个独立的新文件

  2. 硬链接, hard link

    源文件(夹)必须存在;以文件副本的形式存在,但不占用实际空间(Linux中)

    与windows区分:win中副本就是一个新的文件,而Linux中副本(硬链接)与源文件关联

ln 命令简介

ln

用来为文件创建链接

语法

ln [选项]... [-T] 目标 链接名    (第一种格式)
 或:ln [选项]... 目标        (第二种格式)
 或:ln [选项]... 目标... 目录    (第三种格式)
 或:ln [选项]... -t 目录 目标...    (第四种格式)

选项

    --backup[=CONTROL]  为每个已存在的目标文件创建备份文件
-b        类似--backup,但不接受任何参数
-d, -F, --directory   创建指向目录的硬链接(只适用于超级用户)
-f, --force     强行删除任何已存在的目标文件
-i, --interactive           覆盖既有文件之前先询问用户;
-L, --logical               取消引用作为符号链接的目标
-n, --no-dereference        把符号链接的目的目录视为一般文件;
-P, --physical              直接将硬链接到符号链接
-r, --relative              创建相对于链接位置的符号链接
-s, --symbolic              对源文件建立符号链接,而非硬链接;
-S, --suffix=SUFFIX         用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它;
-t, --target-directory=DIRECTORY  指定要在其中创建链接的DIRECTORY
-T, --no-target-directory   将“LINK_NAME”视为常规文件
-v, --verbose               打印每个链接文件的名称
    --help    显示此帮助信息并退出
    --version   显示版本信息并退出

实战

思考:cp 一个软链接文件,会如何? —— 相当于把快捷方式发送给别人,没用

13.mv命令

  • mv —— move(rename) files

    mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。

    • mv 文件名 新的文件名
    • mv 文件 目标目录
  • 骚操作:

    注:cd !$ 表示进入上一个命令的最后一个路径

14.rm——最佳年度删库跑路

  • 警告:非常危险,直接进局

    sudo rm -rf /*

    直接删除,无法恢复

  • rm —— remove files

  • 提醒用户,使用 rm -i 文件(目录)

  • rm

    用于删除给定的文件和目录

    语法

    rm (选项)(参数)

    选项

    -d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;
    -f:强制删除文件或目录;
    -i:删除已有文件或目录之前先询问用户;
    -r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;
    --preserve-root:不对根目录进行递归操作;
    -v:显示指令的详细执行过程。

    参数

    文件:指定被删除的文件列表,如果参数中含有目录,则必须加上-r或者-R选项。

15.文件(夹)

创建及删除

  • 创建文件:touch

  • 创建文件夹:mkdir (make directory)

    eg:

  • 创建多级目录:mkdir -p 目录名

    eg:

    lee@fuck:~/Project/java$ mkdir -p js/src/util
  • 删除目录:

    • rmdir 只能删除空目录,不好用
    • rm 注意加 -i

文件类型

  • 查看文件类型:file 1.txt

  • file

    用来探测给定文件的类型

    补充说明

    file命令 用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。

    选项

    -b:列出辨识结果时,不显示文件名称;
    -c:详细显示指令执行过程,便于排错或分析程序执行的情形;
    -f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
    -L:直接显示符号连接所指向的文件类别;
    -m<魔法数字文件>:指定魔法数字文件;
    -v:显示版本信息;
    -z:尝试去解读压缩文件的内容。

    参数

    文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

cat, more, less

这三个命令实际上并不常用,只能查看文件(相当于win中的用记事本查看内容)

  • cat —— 查看文件内容(无滚轮则很难翻页,适用短文件)

    • cat

      连接多个文件并打印到标准输出。

      主要用途

      • 显示文件内容,如果没有文件或文件为-则读取标准输入。
      • 将多个文件的内容进行连接并打印到标准输出。
      • 显示文件内容中的不可见字符(控制字符、换行符、制表符等)。

      选项

      长选项与短选项等价
      
      -A, --show-all           等价于"-vET"组合选项。
      -b, --number-nonblank    只对非空行编号,从1开始编号,覆盖"-n"选项。
      -e                       等价于"-vE"组合选项。
      -E, --show-ends          在每行的结尾显示'$'字符。
      -n, --number             对所有行编号,从1开始编号。
      -s, --squeeze-blank      压缩连续的空行到一行。
      -t                       等价于"-vT"组合选项。
      -T, --show-tabs          使用"^I"表示TAB(制表符)。
      -u                       POSIX兼容性选项,无意义。
      -v, --show-nonprinting   使用"^""M-"符号显示控制字符,除了LFD(line feed,即换行符'\n')和TAB(制表符)。
      
      --help                   显示帮助信息并退出。
      --version                显示版本信息并退出。
  • more —— 显示文件内容,每次一屏(也不常用)

    • more

      显示文件内容,每次显示一屏

      补充说明

      more命令 是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。

      该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:–More–(XX%)可以用下列不同的方法对提示做出回答:

      • Space 键:显示文本的下一屏内容。
      • Enter 键:只显示文本的下一行内容。
      • 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
      • 按H键:显示帮助屏,该屏上有相关的帮助信息。
      • 按B键:显示上一屏内容。
      • 按Q键:退出more命令。
  • less —— (只查看,也不常用23333)

    • less

      分屏上下翻页浏览文件内容

      补充说明

      less命令 的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。

tail 和 head

对于某些人查看log文件可能有用

  • tail —— 在屏幕上显示指定文件的末尾若干行

    默认显示文件末尾10行,-n 可以指定末尾若干行

  • head —— 显示文件的开头部分

    默认显示文件前10行,-n 可以指定前若干行

章节结束语和经验:基础命令,必须掌握,勤加练习


五:Shell +

主要内容:Linux中的任务管理器

GUI位置:menu -> Utilities -> System Monitor

1.ps和top命令

  • ps 命令

    • ps — process status

    • 报告当前系统的进程状态

    • 常用实例:

      ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率
      ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序
      ps aux | sort -nk 3  # 按 CPU 资源的使用量对进程进行排序
      ps -A # 显示所有进程信息
      ps -u root # 显示指定用户信息
      ps -efL # 查看线程数
      ps -e -o "%C : %p :%z : %a"|sort -k5 -nr # 查看进程并按内存使用大小排列
      ps -ef # 显示所有进程信息,连同命令行
      ps -ef | grep ssh # ps 与grep 常用组合用法,查找特定进程
      ps -C nginx # 通过名字或命令搜索进程
      ps aux --sort=-pcpu,+pmem # CPU或者内存进行排序,-降序,+升序
      ps -f --forest -C nginx # 用树的风格显示进程的层次关系
      ps -o pid,uname,comm -C nginx # 显示一个父进程的子进程
      ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm # 重定义标签
      ps -e -o pid,comm,etime # 显示进程运行的时间
      ps -aux | grep named # 查看named进程详细信息
      ps -o command -p 91730 | sed -n 2p # 通过进程id获取服务名称
  • top 命令

    • 显示或管理执行中的程序

2.kill命令

  • 杀死进程:kill PID

  • kill 详解

    kill

    发送信号到进程。

    内建命令

    概要
    kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
    kill -l [sigspec]

    注:pid:进程ID,jobspec:作业标识符

    主要用途
    • 发送信号到作业或进程(可以为多个)。
    • 列出信号。
    选项
    -s sig    信号名称。
    -n sig    信号名称对应的数字。
    -l        列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。
    -L        等价于-l选项。
    实例
    [user2@pc] kill -l 9
    KILL
    
    # 列出所有信号名称:
    [user2@pc] kill -l
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
     5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
     9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
    13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
    17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
    25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
    29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
    39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
    47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
    51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
    55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
    59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
    63) SIGRTMAX-1  64) SIGRTMAX
    
    # 下面是常用的信号。
    # 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。
    
    HUP     1    终端挂断
    INT     2    中断(同 Ctrl + C)
    QUIT    3    退出(同 Ctrl + \)
    KILL    9    强制终止
    TERM   15    终止
    CONT   18    继续(与STOP相反,fg/bg命令)
    STOP   19    暂停(同 Ctrl + Z)
    # 以下发送KILL信号的形式等价。当然还有更多的等价形式,在此不一一列举了。
    [user2@pc] kill -s SIGKILL PID
    [user2@pc] kill -s KILL PID
    [user2@pc] kill -n 9 PID
    [user2@pc] kill -9 PID
    注意
    1. bash的作业控制命令包括bg fg kill wait disown suspend
    2. 该命令是bash内建命令,相关的帮助信息请查看help命令。

    外部命令

    概要
    kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
    kill -l [number] | -L
    选项
    -s, --signal signal    要发送的信号,可能是信号名称或信号对应的数字。
    -l, --list [number]    打印信号名称或转换给定数字到信号名称。信号名称可参考文件(/usr/include/linux/signal.h)。
    -L, --table'-l'选项类似,但是输出信号名称以及信号对应的数字。
    -a, --all              不要限制“命令名到pid”的转换为具有与当前进程相同的UID的进程。
    -p, --pid              打印目标进程的PID而不发送信号。
    实例
    > sleep 20 &
    
    # 列出对应的PID。
    > kill -p sleep
    23021
    注意
    1. 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 killinfo coreutils 'kill invocation'
    2. 启动或关闭内建命令请查看enable命令,关于同名优先级的问题请查看builtin命令的例子部分的相关讨论。
    3. kill命令类似的有xkillpkill,killall等,用于不同的目的和场景。

3.挂载

挂载的含义

  • 挂载 —— U盘等硬件介质连接到主机上,生成一个虚拟硬盘的过程
  • Linux中U盘的挂载目录:/media/lee/USB/

挂载的意义

  • 如果没有自动挂载,需要手动为硬件介质选择挂载点
  • 有的目录没有写入权限(如/mnt),故需要更改挂载点
  • 避免自动播放(u盘自动运行病毒)

选听——安卓设备挂载

通过实验,挂载的实质是:将一个分区挂载到一个目录上

4.mount命令

  • mount:用于挂载Linux系统外的文件

    mount /dev/sdc1 /mnt
  • umount:用于卸载已经加载的文件系统

    umount /mnt
    umount /media/lee/USB

    注:/mnt 是一个通用挂载点,但这里不允许写入

5.df和du

df

  • 用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。

  • 选项

    -a或--all:包含全部的文件系统;
    --block-size=<区块大小>:以指定的区块大小来显示区块数目;
    -h或--human-readable:以可读性较高的方式来显示信息;
    -H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
    -i或--inodes:显示inode的信息;
    -k或--kilobytes:指定区块大小为1024字节;
    -l或--local:仅显示本地端的文件系统;
    -m或--megabytes:指定区块大小为1048576字节;
    -P或--portability:使用POSIX的输出格式;
    -t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
    -T或--print-type:显示文件系统的类型;
    -x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;

du

  • 显示每个文件和目录的磁盘使用空间

  • 选项

    -a, --all                              显示目录中个别文件的大小。
    -B, --block-size=大小                  使用指定字节数的块
    -b, --bytes                            显示目录或文件大小时,以byte为单位。
    -c, --total                            除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
    -D, --dereference-args                 显示指定符号链接的源文件大小。
    -H, --si                               与-h参数相同,但是K,M,G是以1000为换算单位。
    -h, --human-readable                   以K,M,G为单位,提高信息的可读性。
    -k, --kilobytes                        以KB(1024bytes)为单位输出。
    -l, --count-links                      重复计算硬件链接的文件。
    -m, --megabytes                        以MB为单位输出。
    -L<符号链接>, --dereference<符号链接>  显示选项中所指定符号链接的源文件大小。
    -P, --no-dereference                   不跟随任何符号链接(默认)
    -0, --null                             将每个空行视作0 字节而非换行符
    -S, --separate-dirs                    显示个别目录的大小时,并不含其子目录的大小。
    -s, --summarize                        仅显示总计,只列出最后加总的值。
    -x, --one-file-xystem                  以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
    -X<文件>, --exclude-from=<文件><文件>指定目录或文件。

    实例

    文件从大到小排序

    ubuntu@VM-0-14-ubuntu:~/git-work/linux-command$ du -sh * |sort -rh
    2.9M    command
    1.9M    assets
    148K    template
    72K     package-lock.json
    52K     dist
    28K     build
    16K     README.md
    4.0K    renovate.json
    4.0K    package.json
    4.0K    LICENSE

    只显示当前目录下子目录的大小。

    ubuntu@VM-0-14-ubuntu:~/git-work/linux-command$ du -sh ./*/
    1.9M    ./assets/
    28K     ./build/
    2.9M    ./command/
    52K     ./dist/
    148K    ./template/

    查看指定目录下文件所占的空间:

    ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du ./*
    144     ./alfred.png
    452     ./chrome-extensions.gif
    4       ./dash-icon.png
    1312    ./Linux.gif
    16      ./qr.png

    只显示总和的大小:

    ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du -s .
    1932    .

    显示总和的大小且易读:

    ubuntu@VM-0-14-ubuntu:~/git-work/linux-command/assets$ du -sh .
    1.9M    .

6.sort命令

  • 对文本文件中所有行进行排序。

    • 将所有输入文件的内容排序后并输出
    • 当没有文件或文件为-时,读取标准输入
  • 排序选项:

    -b, --ignore-leading-blanks    忽略开头的空白。
    -d, --dictionary-order         仅考虑空白、字母、数字。
    -f, --ignore-case              将小写字母作为大写字母考虑。
    -g, --general-numeric-sort     根据数字排序。
    -i, --ignore-nonprinting       排除不可打印字符。
    -M, --month-sort               按照非月份、一月、十二月的顺序排序。
    -h, --human-numeric-sort       根据存储容量排序(注意使用大写字母,例如:2K 1G)。
    -n, --numeric-sort             根据数字排序。
    -r, --reverse                  将结果倒序排列。
    --sort=WORD                    根据WORD排序,其中: general-numeric 等价于 -g,human-numeric 等价于 -h,month 等价于 -M,numeric 等价于 -n,random 等价于 -R,version 等价于 -V。
    -V, --version-sort             文本中(版本)数字的自然排序。
    
    # 其他
    -k, --key=KEYDEF               通过一个key排序;KEYDEF给出位置和类型。
    -t, --field-separator=SEP      使用SEP作为列的分隔符。
    -T, --temporary-directory=DIR  使用DIR作为临时目录,而不是 $TMPDIR 或 /tmp;多次使用该选项指定多个临时目录。

    注:关于-g-n选项的区别:stackoverflow

    ‘-g’ ‘--general-numeric-sort’ ‘--sort=general-numeric’ Sort numerically, using the standard C function strtod to convert a prefix of each line to a double-precision floating point number. This allows floating point numbers to be specified in scientific notation, like 1.0e-34 and 10e100. The LC_NUMERIC locale determines the decimal-point character. Do not report overflow, underflow, or conversion errors. Use the following collating sequence: Lines that do not start with numbers (all considered to be equal). NaNs (“Not a Number” values, in IEEE floating point arithmetic) in a consistent but machine-dependent order. Minus infinity. Finite numbers in ascending numeric order (with -0 and +0 equal). Plus infinity.
    
    Use this option only if there is no alternative; it is much slower than --numeric-sort (-n) and it can lose information when converting to floating point.
    
    ‘-n’ ‘--numeric-sort’ ‘--sort=numeric’ Sort numerically. The number begins each line and consists of optional blanks, an optional ‘-’ sign, and zero or more digits possibly separated by thousands separators, optionally followed by a decimal-point character and zero or more digits. An empty number is treated as ‘0’. The LC_NUMERIC locale specifies the decimal-point character and thousands separator. By default a blank is a space or a tab, but the LC_CTYPE locale can change this.
    
    Comparison is exact; there is no rounding error.
    
    Neither a leading ‘+’ nor exponential notation is recognized. To compare such strings numerically, use the --general-numeric-sort (-g) option.

    例子参考:https://www.cnblogs.com/z977690557/p/8945261.html

  • 用处:

    • sort -M 命令对time.log文件内容进行排序

    • 组合使用df、du和sort,见上节实例

7.grep初识:搜索文件

  • grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。
  • nb!!!

8.打包、压缩、归档、解压缩

  • Linux中的压缩工具

    • .Z(已过时)
    • gzip — .gz
    • zip — .zip
    • bzip2 — .bz2
  • tar:将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件。

    • 区分打包和压缩:打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
    • why? —— Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
  • 常用命令

    tar -cvf log.tar log2012.log    仅打包,不压缩!
    tar -zcvf log.tar.gz log2012.log   打包后,以 gzip 压缩
    tar -jcvf log.tar.bz2 log2012.log  打包后,以 bzip2 压缩
    
    压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
    查 询:tar -jtv -f filename.tar.bz2
    解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

9.实战:server上安装vmwaretools

章节结束语与经验:掌握基本常用命令,根据需求查阅文档


六:父子shell

父子shell的概念

Unix shell

Bash(Bourne Again Shell),Dash(Debian Almquist shell),ash,zsh

父子shell

  • 在Ubuntu中打开terminal,实际上就是打开了一个bash,而在窗口内还可以切换为其余shell,这样使用ps命令查看可以发现多个shell。
  • 使用ps -f 命令,不难发现各shell之间PID及PPID的对应关系,即父shell的PID是子shell的PPID。
  • 使用ps --forest命令可以更清楚看到各shell的层级关系。
  • 通过各级的exit,也能发现父子shell

过程如下:

分号在命令中有什么作用

分隔命令,依次执行

注:echo —— 输出指定的字符串或者变量

加上()后,会生成一个子shell运行命令,执行完后自动退出子shell。在上图中,我们使用echo $BASH_SUBSHELL查看子shell数量,使用ps -f发现子shell已退出。

sleep和jobs

sleep和jobs

  • sleep —— delay for a specified amount of time(默认单位:s)

    sleep 100
    sleep 100&

    注:’&’表示后台执行

  • jobs —— 显示作业的状态

    -l:在作业的信息中额外列出PID

后台执行符&

后台解压文件并复制到指定目录:

(tar -zxvf ... ; tar -zxvf ...; cp ...)&

注:’&’表示后台执行

其他参考:https://stackoverflow.com/questions/13338870/what-does-at-the-end-of-a-linux-command-mean

If a command is terminated by the control operator &, the shell executes the command in the background in a subshell. The shell does not wait for the command to finish, and the return status is 0.

如果命令由控制运算符 & 终止,shell 将在子 shell 的后台执行该命令。 shell 不等待命令完成,返回状态为 0。

coproc协程

使用coproc name { ; },用于子shell挂后台

注:{}之间使用;结尾,并且注意空格

外部命令和内建命令

引入:windows中任务管理器 也是一个进程,Linux中ps -f命令也是一个进程,why?

外部命令的必要性 —— 上帝视角更清楚,单独创建一个进程

总结参考

From:https://blog.51cto.com/u_13340708/1970306

  • 内建命令,实际上是Shell程序的一部分,其中包含的是一些比较简单的Linux系统命令,这些命令由Shell程序识别并在Shell程序内部完成运行,通常在Linux系统加载运行时Shell就被加载并驻留在系统内存中。内部命令是写Bash源码里面的,其执行速度比外部命令快,因为解析内部命令Shell不需要创建子进程。

    详见:https://www.gnu.org/software/bash/manual/html_node/Builtin-Index.html#Builtin-Index。

  • 外部命令,Linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在Shell中,但是其命令执行过程是由Shell程序控制的。Shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在Bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin……等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。

  • 可以通过type命令来识别内建命令还是外部命令。

  • 内建命令使用help查看帮助文档,外部命令使用man命令。

外部命令

ps -f命令为例,其PPID与bash的PID一致,为了查看整个shell中的进程,衍生出新的进程

如:ps, ls

内建命令

如:cd, exit, echo, history

history与alias

history —— 显示或操作历史列表

使用符号!执行指定序号的历史命令:!n

  • 概要

    history [-c] [-d offset] [n]
    history -anrw [filename]
    history -ps arg [arg...]
  • 选项

    -c           清空历史列表。
    -d offset    根据offset删除记录。如果是正数则表示offset位置的记录,如果为负数则表示从结尾向前offset位置的记录。
    -a           将当前终端的历史记录行添加到历史记录文件。
    -n           将尚未从历史文件中读取的历史行追加到当前历史列表中。
    -r           读取历史文件,并将其内容附加到历史列表中。
    -w           将当前历史记录列表附加到历史记录文件中并且附加它们到历史列表中。
    -p           在每个arg上执行历史记录扩展并在标准输出上显示结果,而不将结果存储在历史记录列表中。
    -s           将每个arg作为单个条目附加到历史记录列表。
  • 参数

    n:可选,只列出最近的n条记录。

    filename:可选,表示历史文件;默认调用顺序为filename、环境变量HISTFILE~/.bash_history

alias —— 定义或显示别名

  • 语法

    alias [-p] [name[=value] ...]

    -p:显示全部已定义的别名。

    name(可选):指定要(定义、修改、显示)的别名。

    value(可选):别名的值。

  • 实例

    # 显示全部已定义的别名
    alias
    alias -p
    
    # 显示已定义的别名(假设当前环境存在以下别名)
    alias ls
    alias ls grep
    
    # 定义或修改别名的值
    alias ls='ls --color=auto'
    alias ls='ls --color=never' grep='grep --color=never'

章节结束语与经验:key — 父子shell及相关命令


七:环境变量

环境变量究竟是什么

引入:windows中win + R或在cmd中可以快速运行calc,notepad,mspaint,cmd,why?

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如临时文件夹位置和系统文件夹位置等。[baike]

  • 举例:windows和DOS操作系统中的PATH环境变量

    作用:当要求系统运行一个程序而没有告诉程序所在完整路径时,系统会在当前目录下和PATH中目录下寻找该程序。

全局变量和局部变量

  • 认识

    • Windows:系统变量与用户变量

    • Linux:全局变量与局部变量

  • 命令

    • 使用printenv查看所有全局变量,printenv USER查看全局变量USER

      注:不同发行版全局变量不一定相同

    • 使用$引用全局变量

      echo $HOME
      cd $HOME
    • 使用set命令查看局部变量

用户和局部变量的设定

  • 定义的局部变量只能在当前shell中使用,子shell或退出都不能继续使用
  • 定义局部变量必须用小写!!!
  • 全局变量大写,下划线命名法

定义全局变量

  • export:为shell变量或函数设置导出属性

  • unset:删除指定的shell变量或函数

  • 自己定义全局变量也推荐用小写(一般系统变量大写

注:这里使用echo已经发现dir无效,但还能执行,不懂…

更新:自己尝试退出子shell,发现父shell中dir并未删除(因为是父shell中定义的全局变量)。unset后无法查看,但仍可执行。退出后仍是无法查看可执行…

为啥要用环境变量

  • 配置java等开发环境需要配置PATH

  • 添加环境变量信息

    PATH=$PATH:/home/lee/Project

    注:如此配置在退出后重新打开会失效

永久配置环境变量

  • Linux打开shell时读取环境变量的机制

    • 启动文件 —— 开机时默认执行环境变量
    • bash shell运行逻辑?
      1. 登录shell
      2. 非登录就打开shell
      3. 运行脚本非交互shell
  • 查看文件

    cat /etc/profile
  • 一个目录 —— 常见的不同发行版中用来配置永久环境变量的目录

    • ~/.bashrc(Ubuntu) ~/.bash_profile ~/.profile ~/.bash_login

    • eg:永久别名

    实际操作:需学习vim再上手


八:安装软件

PMS和软件安装的介绍

  • PMS, Package Management System 包管理系统

    • 解决软件安装、更新、卸载,解决工具依赖问题(eg:QQ空间 QQ)
    • 不同发行版PMS可能不同
  • 软件包管理工具

    • dpkg — Debian:apt-get, apt-cache, aptitude(已淘汰)
    • rpm — Red Hat
  • 软件安装

    sudo apt install vim

安装、更新、卸载

  • apt - h查看apt帮助文档

  • 更新 sudo apt update

  • 升级 sudo apt upgrade

  • 卸载 sudo apt remove

其他发行版本?

  • server版配置镜像源

    参考:https://cloud.tencent.com/developer/article/1726035

    • 备份原软件源文件/etc/apt/sources.list,然后删除(因为要直接添加内容)

    • 打开/etc/apt/sources.list并添加以下内容

      deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
    • 刷新软件源信息

      sudo apt update
    • 更新软件,速度明显变快

      sudo apt upgrade
  • 其他发行版本

    如:Red Hat — yum(常见), urpm, zypper

安装第三方软件


九:用户和权限

用户和权限的含义和作用

  • 用户与权限 -> 安全

  • 用户ID UID

    • 系统账户 UID<500
  • 查看有关文件

    • 1.

      cat /etc/passwd

      lee:x:1000:1000:Lee,,,:/home/lee:/bin/bash

      用户名 密码 UID 组ID 备注 用户目录 默认shell

    • 2.

      sudo cat /etc/shadow

      密码存储地,仍加密,需root权限

      lee:$6$vBYkP36fj7.w2YQB$AVnJhuLMHOPFYspc3FCnoLf0r5S7RXVgQTl.1ZLI8zUovgU2yXF3xH/1Q7s/dLOLQmHev/lROJwvEAydaLbzF1:18709:0:99999:7:::

      以下为参考:https://linuxize.com/post/etc-shadow-file/

      mark:$6$.n.:17736:0:99999:7:::
      [--] [----] [---] - [---] ----
      |      |      |   |   |   |||+-----------> 9. Unused
      |      |      |   |   |   ||+------------> 8. Expiration date
      |      |      |   |   |   |+-------------> 7. Inactivity period
      |      |      |   |   |   +--------------> 6. Warning period
      |      |      |   |   +------------------> 5. Maximum password age
      |      |      |   +----------------------> 4. Minimum password age
      |      |      +--------------------------> 3. Last password change(since 1,1,1970)
      |      +---------------------------------> 2. Encrypted Password
      +----------------------------------------> 1. Username

创建、删除、更改用户

  • 创建 sudo useradd usr1

  • 删除 sudo useradd usr1

  • 更改密码 sudo passwd usr1

  • 自学

    • chpasswd 批量更改密码

      #先创建用户密码对应文件,格式为username:password,并且不能有空行,保存成文本文件user.txt,然后执行chpasswd命令
      chpasswd < user.txt
    • chage 修改帐号和密码的有效期限

group组

  • Linux 组 groups –> 目的:共享资源的权限

  • 查看group文件

    tail /etc/group

    Ubuntu为每一个用户创建一个单独的组

    Groupname Password GID 属于该组的成员列表

  • 创建组 sudo groupadd group_lee

  • 删除组 sudo groupdel group_lee

  • 将用户加入组 —— usermod 命令

文件、文件夹权限

  • 第一个字符 File Type
    • d — 目录;- — 文件;l — link file;b — 装置文件里面的可供储存的接口设备(可随机存取装置);c — 装置文件里面的串行端口设备(如鼠标、键盘)

作业:自学chmod命令

chmod

chmod — change mode

用来变更文件或目录的权限

概要

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

mode:八进制数或符号组合。

file:指定要更改权限的一到多个文件。

选项

-c, --changes:当文件的权限更改时输出操作信息。
-f, --silent, --quiet:抑制多数错误消息的输出。
-v, --verbose:无论文件是否更改了权限,一律输出操作信息。
-R, --recursive:对目录以及目录下的文件递归执行更改权限操作。

例子

参考man chmod文档的DESCRIPTION段落得知:

  • u符号代表当前用户。
  • g符号代表和当前用户在同一个组的用户,以下简称组用户。
  • o符号代表其他用户。
  • a符号代表所有用户。
  • r符号代表读权限以及八进制数4
  • w符号代表写权限以及八进制数2
  • x符号代表执行权限以及八进制数1
  • X符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
  • s符号代表设置权限suid和sgid,使用权限组合u+s设定文件的用户的ID位,g+s设置组用户ID位。
  • t符号代表只有目录或文件的所有者才可以删除目录下的文件。
  • +符号代表添加目标用户相应的权限。
  • -符号代表删除目标用户相应的权限。
  • =符号代表添加目标用户相应的权限,删除未提到的权限。
# 添加组用户的写权限。
chmod g+w ./test.log
# 删除其他用户的所有权限。
chmod o= ./test.log
# 使得所有用户都没有写权限。
chmod a-w ./test.log
# 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。
chmod u=rwx, g=rw, o=r ./test.log
# 等价的八进制数表示:
chmod 754 ./test.log
# 将目录以及目录下的文件都设置为所有用户拥有读写权限。
# 注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!
chmod -R a=rw ./testdir/
# 根据其他文件的权限设置文件权限。
chmod --reference=./1.log  ./test.log

两图熟记

  1. 详见:Linux chmod命令

章节结束语:边用边学,多看多练,自学,学无止境


十:编辑器之神——Vim

My Other学习:TLCL (billie66.github.io) for vi,Learning the vi Editor/Vim - Wikibooks, open books for an open world for vim

附:vi/vim键盘图

  • 官网原图

  • 翻译版本

编辑器简单介绍:vim编辑器之神,emac神之编辑器

  • 命令版编辑器:vi,nano,emacs,vim

  • vim — 编辑器之神,emacs — 神之编辑器

  • Vim (text editor) from Wikipedia

    Vim (/vɪm/; a contraction of Vi IMproved) is a free and open-source, screen-based text editor program for Unix. It is a improved clone of Bill Joy’s vi. Vim’s author, Bram Moolenaar, derived Vim from a port of the Stevie editor for Amiga and released a version to the public in 1991. Vim is designed for use both from a command-line interface and as a standalone application in a graphical user interface. Vim is released under the Vim license that includes some charityware clauses, encouraging users who enjoy the software to consider donating to children in Uganda.

    PS: Vi — Visual Editor

  • vim官网:https://www.vim.org/

vim的简单使用

  • 安装vim

    sudo apt update
    sudo apt upgrade
    # 推荐先执行前两步,进行更新
    sudo apt install vim

    安装时无法fetch阿里镜像源,检查网络,断开代理,重启,更新并安装

  • vim工作模式

    • 国外一般认为是两种模式

      1. 普通模式(命令操作模式):操作文件

      2. 插入模式:编辑内容

      • I键进入INSERT模式,ESC退回普通模式
    • 国内一般认为是三种模式

      1. 一般模式 —— 移动
      2. 编辑模式 —— INSERT
      3. 命令模式 —— :
  • vim退出

    • :q — 不保存退出
    • :wq — 保存并退出
    • :q! — 强制退出,不保存
  • 实例

vim操作

移动光标

my tip:记住HJKL,两端是左右,中间是上下

按键 命令 功能
K k
J j
H h
L l

翻页

按键 命令 功能
Ctrl + F Ctrl + F 上一页
Ctrl + B Ctrl + B 下一页
Ctrl + E Ctrl + E 上滚
Ctrl + Y Ctrl + Y 下滚
Shift + G,即G G 末尾
G + G,即gg gg 首行

不同方式编辑文本、跳跃单词操作技巧

按键 命令 功能
I i 光标位置前插入
A a 光标位置后插入
O o 直接enter到下一行输入
X x 删除光标所在字符
D + D,即dd dd 删除当前行
U u 撤销
D + W,即dw dw 删除光标后的单词
B b 向前跳跃单词首
E e 向后跳跃单词尾
W,即w w 向后跳跃单词
Shift + W,即W W 向后大跳
Shift + B,即B B 向前大跳

跳跃行首行尾及替换

按键 命令 功能
Shift + 6,即^ ^ 跳跃到本行开头
Shift + 4,即$ $ 跳跃到本行末尾
R,即r r 替换当前光标字符
Shift + R,即R R 向后一直替换,直到ESC退出

大括号跳跃函数段落技巧

按键 功能
Shift + [或],即{} 向前/后跳跃大括号

vim复制剪切粘贴

按键 命令 功能
D + D,即dd dd 删除当前行,相当于剪切
P p 粘贴
Y + W,即yw yw 复制一个单词
Y + Shift 4,即y$ y$ 复制文本,从当前到行末

注:y$缺点,行末概念不清

Visual可视化模式

  • 作用:选择文本
  • 普通模式下按V键,进入Visual模式 -> HJKL选择文本
按键 命令 功能
V,即v v 选择文本
Shift + V,即V V 按行选择文本
Ctrl + V Ctrl + v 矩阵选择
V + Shift G,即vG vG 选择当前行到文末
gg + V + Shift G,即gg v G gg v G 全选
O o 切换已选择文本首尾(visual模式下)
0 0 补全角落(visual模式下)
V + A + W,即vaw vaw 快速选中一个单词
V + A + B,即vab vab ~~包括括号()
V + A + Shift B,即vaB vaB ~~包括大括号{}
V + A + <,即va< va< ~~包括尖括号<>

注:visual模式下,仍可用b,w,e等跳跃文本技巧

视图模式其他用法

命令 功能
v< 往左缩进
v> 往右缩进
v~ 大小写转换
vu 转换为大写
vU 转换为大写

查找和替换

  • 查找 — /
    • /int — 查找int
    • n — 下一个
  • 替换 — :
    • :s /int/double/g — 当前行的int都替换为double
    • :%s /int/double/g — 所有的int都替换为double
    • :set number — 临时显示行号
    • :5,10s /int/double/g — 5-10行的int替换为double
    • :%s /int/double/gc — 有提示的替换

vim的基础配置

  • 创建配置文件 —— touch .vimrc

  • 配置 —— vim .vimrc

    写入以下代码(无需注释)

    set syntax=on		# 高亮
    set tabstop=4		# 设置缩进
    set softtabstop=4 
    set number			# 显示行号
    set enc=utf-8
    set showmatch		# 括号匹配
  • 显示行号后,快速进入该行行首 — 命令:number + gg

  • vim . —— 通过vim查看当前目录所有文件


十一:server

Linux Server

安装Ubuntu Server,设置(更换镜像源http://mirrors.aliyun.com/ubuntu,其余基本直接Done),更新

SSH远程登录

安装net-toolssshifconfig查看ip,通过putty连接到server

解决putty连接Ubuntu超时 Network error:Connection timed out

最后解决:ping发现不互通,然后通过 网络设置->更改适配器选项->Vmware Network Adapter->诊断并修复 解决

WSL

  • WSL, Windows Subsystem for Linux

  • 控制面板->启用或关闭Windows功能->使用于Linux的Windows子系统,Msc Store安装Ubuntu18.04,使用Windows Terminal连接

  • 使用Windows Terminal通过SSH连接虚拟机的Ubuntu(类putty)

    配置Windows Terminal的json文件:

    {
       	"guid": "{9db309df-38f6-4ad2-8970-03718f686545}",
     	"hidden": false,
    	"name": "Ubuntu-20.04x64",
    	"commandline": "ssh lee@192.168.136.135"
    }

    注:guid通过guid生成工具产生:www.guidgen.com

    参考:https://blog.csdn.net/qq_46207024/article/details/116572048

Linux最后的结束语

只有你不停地向前,才知道自己要做什么

共享与开源,世界更美好


Author: Frank Lee
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Frank Lee !
评论
  TOC