何为 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 都有特殊的含义,如果要表示字符串本身,就必须加引号。而 ! 即使被双引号包裹也具有特殊含义。单引号才能消除其本身含义。
其他命令
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/Ubuntu 或 https://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 不在环境变量的路径中,无法找到并执行,因此必须加上 ./
才能找到。