完成章节:”学习Shell”
This commit is contained in:
parent
8b6163d7f0
commit
2946efac53
|
@ -1 +1,169 @@
|
||||||
# 学习 Shell
|
# 学习 Shell
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
|
||||||
|
Shell(也称为壳)在计算机中指“为用户提供用户界面”的软件,通常指的是命令行界面的解析器。一般来说,这个词是指操作系统中提供访问内核所提供之服务的程序。Shell也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。因此与之相对的是内核(英语:Kernel),内核不提供和用户的交互功能。[1]
|
||||||
|
|
||||||
|
但是,在Linux中,我们通常所讲的Shell是指命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序来实现自动化的功能。
|
||||||
|
|
||||||
|
Shell 也指代一种命令语言,由这种语言编写的脚本称为Shell Script。
|
||||||
|
|
||||||
|
Shell 命令语言的标准为参考AT&T的ksh和GNU计划的Bourne Again Shell (bash)制定的The Open Group Base Specifications Issue 6 中的 [2.Shell Command Language](https://pubs.opengroup.org/onlinepubs/9690949599/utilities/xcu_chap02.html)。
|
||||||
|
|
||||||
|
本章我们将学习Shell的基本使用。
|
||||||
|
|
||||||
|
## 快捷键
|
||||||
|
|
||||||
|
Shell也有快捷键?是的。大多数Shell都支持以下的快捷键:
|
||||||
|
|
||||||
|
- `C-C`:终止当前进程。
|
||||||
|
- `C-Z`:暂停当前进程。
|
||||||
|
- `C-D`:退出当前Shell。
|
||||||
|
- `C-L`:清屏。
|
||||||
|
|
||||||
|
在Bash中,还有一些特殊的快捷键,它们继承自GNU Emacs编辑器,用于快速移动光标以及编辑文本:
|
||||||
|
|
||||||
|
- `C-A`:移动光标到行首。
|
||||||
|
- `C-E`:移动光标到行尾。
|
||||||
|
- `C-B`:向左移动光标。
|
||||||
|
- `C-F`:向右移动光标。
|
||||||
|
- `C-K`:删除从光标位置到行尾的文本。
|
||||||
|
- `C-U`:删除从光标位置到行首的文本。
|
||||||
|
- `C-W`:删除光标左侧的单词。
|
||||||
|
- `C-Y`:粘贴之前删除的文本。
|
||||||
|
|
||||||
|
## 命令
|
||||||
|
|
||||||
|
命令分为内部命令和外部命令,内部命令是Shell自带的命令,外部命令是Shell外部的可执行程序。
|
||||||
|
|
||||||
|
一条Shell的指令的标准格式为:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
command [options] [arguments]
|
||||||
|
```
|
||||||
|
|
||||||
|
其中,`command`是命令的名称,`options`是命令的选项,`arguments`是命令的参数。
|
||||||
|
|
||||||
|
它的格式不一定必须遵守,但是通常遵守这个格式会带来更好的可读性(用什么工具采用什么方式对什么文件做什么)。
|
||||||
|
|
||||||
|
但是,有一个例外,就是指定输出,这时,我们推荐將指定输出的选项以及参数放在文件明后面。
|
||||||
|
|
||||||
|
例如,`ls`命令用于列出当前目录下的文件和文件夹,它的选项可以是`-l`、`-a`等,参数可以是文件名或目录名。
|
||||||
|
|
||||||
|
## 变量
|
||||||
|
|
||||||
|
Shell中的变量分为环境变量和用户变量,环境变量是Shell启动时自动设置的变量,用户变量是用户自定义的变量。
|
||||||
|
|
||||||
|
用户变量可以通过`export`命令导出为环境变量,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export GREET="Hello, World!"
|
||||||
|
```
|
||||||
|
|
||||||
|
然后我们启动一个新的 Shell,仍然可以在环境中找到这个变量。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bash -c 'echo $GREET'
|
||||||
|
```
|
||||||
|
|
||||||
|
用户变量可以通过`declare`命令声明,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
declare USER_GREET="Hello, Shell"
|
||||||
|
```
|
||||||
|
|
||||||
|
变量可以通过`${}`或`$`符号来引用,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo ${GREET}
|
||||||
|
echo $USER_GREET
|
||||||
|
```
|
||||||
|
|
||||||
|
## 特殊的环境变量
|
||||||
|
|
||||||
|
Shell中有一些特殊的环境变量,它们在Shell启动时自动设置,例如:
|
||||||
|
|
||||||
|
- `$HOME`:当前用户的主目录。
|
||||||
|
- `$PATH`:可执行文件的搜索路径。
|
||||||
|
- `$SHELL`:当前Shell的名称。
|
||||||
|
- `$PWD`:当前工作目录。
|
||||||
|
- `$USER`:当前用户的用户名。
|
||||||
|
|
||||||
|
其中最重要也是最常用的就是PATH,它决定了Shell在执行命令时搜索可执行文件的路径。当我们发现明明安装了某个软件但是找不到可执行文件的时候应该首先检查PATH的设置。
|
||||||
|
|
||||||
|
## 管道
|
||||||
|
|
||||||
|
Shell中的管道是链接两个命令的方式,管道遵守下面的格式。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
command1 | command2
|
||||||
|
```
|
||||||
|
|
||||||
|
`command1`的输出将会作为`command2`的输入提供,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls -a | grep "test"
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会列出当前目录下的所有文件,然后使用`grep`命令过滤出文件名包含"test"的文件。
|
||||||
|
|
||||||
|
## 输出重定向
|
||||||
|
|
||||||
|
Shell中的重定向是改变命令的输出地点的方式,重定向遵守下面的格式。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
command > file
|
||||||
|
```
|
||||||
|
|
||||||
|
`command`的输出将会被重定向到`file`中,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls -a > files.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会列出当前目录下的所有文件,然后使用`>`符号将输出重定向到`files.txt`中。
|
||||||
|
|
||||||
|
## 输入重定向
|
||||||
|
|
||||||
|
Shell中的输入重定向是改变命令的输入地点的方式,输入重定向遵守下面的格式。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
command < file
|
||||||
|
```
|
||||||
|
|
||||||
|
`command`的输入将会被重定向到`file`中,例如:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat < files.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会读取`files.txt`中的内容,然后使用`cat`命令输出到标准输出中。
|
||||||
|
|
||||||
|
## 将命令的输出作为参数
|
||||||
|
|
||||||
|
让我们想像这个场景:有一个文件有一个文件名列表,我们想要获取这些文件的详细信息,这怎么实现呢?
|
||||||
|
|
||||||
|
运算符`$()`可以将命令的输出作为参数,它的标准格式如下:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
command1 $(command2)
|
||||||
|
```
|
||||||
|
|
||||||
|
`command2`的输出将会作为`command1`的参数。
|
||||||
|
|
||||||
|
实现前文的场景所需的命令如下:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls -l $(cat files.txt)
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会读取`files.txt`中的文件名列表,然后使用`ls -l`命令获取这些文件的详细信息。
|
||||||
|
|
||||||
|
## 课后作业
|
||||||
|
|
||||||
|
1. 使用Shell的输出重定向功能,在主目录中创建一个保存了住目录中所有文件的文件,命名为`files.txt`
|
||||||
|
2. 使用`cat`读取所有文件的内容。
|
||||||
|
|
||||||
|
## 参考
|
||||||
|
|
||||||
|
- [Shell - 维基百科,自由的百科全书](https://zh.wikipedia.org/wiki/Shell)
|
Loading…
Reference in New Issue