何为 Linux

Linux 是一群开源的、基于 Linux 内核的类 Unix 操作系统集合。

https://github.com/torvalds/linux

Linux/UNIX 系统层次概要

如何访问 Linux

  • 安装 Linux 系统

https://zhuanlan.zhihu.com/p/294033435

  • 使用 WSL

https://learn.microsoft.com/zh-cn/windows/wsl/install

  • 使用虚拟机

VMware、Virtual Box 等

打开你的 Shell

Ubuntu: Ctrl + Alt + T

Windows 用户:PowerShell 中键入 wsl 后回车

其中 scc 表示用户名,shichongchen 表示机器名,/mnt/c/Users/scc 表示当前路径。$ 表示普通用户,进入 root 用户之后会变成 #。

常用命令

  • echo - 将参数输出到屏幕

echo arg0 arg1 ...
ehco Hello world
// 输出 Hello world
// 这里 Hello 作为参数1,world 作为参数2
// echo 命令会将多个参数拼接起来,以单个空格分隔
echo Hello    world
// 输出 Hello world
echo Hello\ world
// 输出 Hello world
echo "Hello world"
// 输出 Hello world
echo 'Hello world'
// 输出 Hello world

补充介绍:引号

https://www.gnu.org/software/bash/manual/html_node/Quoting.html

在 shell 中,引号用于移除某些字符或单词的特殊含义。引号可用于禁用特殊字符的处理,防止保留字被识别,防止参数展开。

每个 shell 元字符对 shell 都有特殊的含义,如果要表示字符串本身,就必须加引号。而 ! 即使被双引号包裹也具有特殊含义。单引号才能消除其本身含义。

  • 其他命令

命令

功能

命令

功能

date

显示时间

rm

删除

shutdown -h now

关闭系统

mv

移动、重命名

man

查看帮助文档

cp

复制

cat

显示文件内容

touch

新建文件

cd

切换当前路径

ln

链接

pwd

显示当前路径

find

寻找文件

ls

查看目录中的文件

whereis

寻找命令路径

mkdir

新建目录

passwd

修改密码

neofetch

查看系统

atop

监视系统

less

滚动查看内容

grep

搜索字符串

exa

比 ls 更好用

tldr

命令提示

Shell 是如何工作的?

  • 本质是调用程序,前面的 echo 实际上是系统内置的程序

  • 命令行第一个词是程序名称,随后是参数,词之间用空格分隔

  • 敲下回车之后会开启一个子进程跑相应程序

Shell 如何找到要调用的程序?

  • 环境变量:PATH

  • Shell 会遍历 PATH 中的所有位置来搜索

Linux 中的路径

  • 绝对路径和相对路径

绝对路径以 '/' 开头,相对路径以当前路径出发。

  • 用 cd 指令切换当前路径

  • 特殊路径

'.':当前路径,'..':父路径;

'-':上次到达的路径;

'~':home 所在路径。

补充:Linux 一切皆文件

Linux 将所有资源都视为文件来管理,包括硬件设备、网络套接字等。带来的好处就是不同种类的资源可以用同种方式管理。

例如 /sys/class 目录下的每个文件夹代表一种设备,其中的文件则表示设备的各种参数。

重定向 & 管道

Shell 中的每个指令都有输入、输出流。默认输入流读取键盘输入,输出流显示到屏幕。'<' 改变输入流,'>' 改变输出流。'>>' 在文件末尾追加。

管道 '|',a|b,a 的输出作为 b 的输入。

权限

  • ls -l 查看权限位

文件种类(l: 软链接,d: 目录,-: 一般文件)

用户权限 组权限 其他用户权限 用户名称 组名称

  • chmod 修改权限位

  • sudo - 以 root 身份执行

root 具有最高权限

  • sudo 不好用的情况之一

-rw-rw-r-- 1 root root 8 Sep 16 11:09 blank.txt

如何在不修改权限/拥有者的情况下写入 blank.txt?

sudo echo something > blank.txt 错误

重定向、管道由 Shell 执行,而 Shell 并没有 root 权限!

echo something | sudo tee blank.txt 正确

补充说明:tee

用于显示程序的输出并将其复制到一个文件中。

包管理

  • dpkg - 安装网站上下载的 .deb 软件包

sudo dpkg -i xxx.deb

  • apt - 更强大的包管理

sudo apt-get install xxx

默认从 Ubuntu 源服务器上下载,想加速可以换成 https://mirrors.pku.edu.cn/Help/Ubuntuhttps://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

切换源之后需要 sudo apt-get update

变量

  • 赋值:foo=bar 变量名=字符串

foo = bar 是错误的,因为 foo 被视为程序名,= 和 bar 被视为参数。

  • 访问:$foo,将 foo 的值替换掉 $foo

  • env - 查看环境变量

  • set - 环境变量 + Shell 变量

  • 赋值仅仅添加 Shell 变量

  • 赋值语句前加 export 可以添加环境变量,但是一次性

  • 永久添加:

将 export 赋值语句放入 home 下的 .bashrc 文件中;

source ~/.bashrc

命令替换 & 进程替换

  • 有时希望将指令的输出结果作为参数

  • 命令替换:$( CMD )

将 CMD 执行后的输出替换掉 $( CMD )

  • 进程替换:<( CMD )

将 CMD 的输出重定向到临时文件,并用临时文件名替换 <( CMD )

Shell 脚本

  • 脚本语言 -- 通过解释器运行

Bash 和 python 都是脚本语言。

  • #!- Sharp-bang 符号

放在脚本文件的开头,同行后面跟着解释器的路径;

实际运行时会调用 sharp-bang 后的解释器,并将脚本文件名作为参数;

# 表示注释;

可以直接 ./script-name 执行脚本。

#!/usr/bin/env python3
print("test sharp-bang")

补充说明:为什么不能使用 script-name 运行?

因为 script-name 不在环境变量的路径中,无法找到并执行,因此必须加上 ./ 才能找到。