guide.deepin.org/docs/deepin进阶教程/1.GNU-linux教程/1.5.简单shell命令.md
xiangzelong 82ed19889b docs: update docs
Log:
2023-02-16 10:56:23 +08:00

283 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 1.5. 简单 shell 命令
现在,你对如何使用 deepin 系统已经有一些感觉了。让我们更深入了解 deepin 系统的命令执行机制。在这里,我将为新手做一般的讲解。精确的解释参见`bash`(1)。
一般的命令由有序的组件构成。
- 设置变量值(可选)
- 命令名
- 参数(可选)
- 重定向(可选:`>`, `>>` , `<`, `<<` 等等)
- 控制操作(可选:`&&` `||` 换行符 , `;` , `&` , `(` , `)`
## 1.5.1. 命令执行和环境变量
一些[环境变量](https://zh.wikipedia.org/wiki/Environment_variable)的值会改变部分 Unix 命令的行为。
环境变量的默认值由 PAM 系统初始化,其中一些会被某些应用程序重新设定。
- PAM可插拔身份验证模块系统的模块比如 `pam_env` 模块,可以通过 `/etc/pam.conf`"、 "`/etc/environment`"和"`/etc/default/locale`"设置环境变量。
- 显示管理器(例如`gdm3`)可以通过"`~/.profile`"给 GUI图形用户界面会话重新设定环境变量。
- 用户特有的程序初始化时,可以重新设置在 "`~/.profile`"、"`~/.bash_profile`" 和 "`~/.bashrc`" 中设置的环境变量。
## 1.5.2. “`$LANG`”变量
默认的语言环境是在 "`$LANG`" 环境变量中定义,它在安装的时候配置为 "`LANG=xx_YY.UTF-8`",或者在接下来的 GUI图形用户界面中配置例如在 GNOME 中是,"设置" → "区域 & 语言" → "语言" / "格式"。
目前建议最好用变量 "`$LANG`" 来配置系统环境变量,只有在逼不得已的情况下才用 `$LC_*`" 开头的变量
`$LANG`” 变量的完整的语言环境值由3部分组成“`xx_YY.ZZZZ`”。
|语言环境值|说明|
|-|-|
|xx|ISO 639 语言代码小写例如“en”|
|YY|ISO 3166 国家代码大写例如“US”|
|ZZZZ|编码总是设置为“UTF-8”|
|语言环境推荐|语言(地区)|
|-|-|
|en_US.UTF-8|英语(美国)|
|en_GB.UTF-8|英语(大不列颠)|
|fr_FR.UTF-8|法语(法国)|
|de_DE.UTF-8|德语(德国)|
|it_IT.UTF-8|意大利语(意大利)|
|es_ES.UTF-8|西班牙语(西班牙)|
|ca_ES.UTF-8|加泰隆语(西班牙)|
|sv_SE.UTF-8|瑞典语(瑞典)|
|pt_BR.UTF-8|葡萄牙语(巴西)|
|ru_RU.UTF-8|俄语(俄国)|
|zh_CN.UTF-8|汉语(中华人民共和国)|
|zh_TW.UTF-8|汉语(中国台湾省)|
|ja_JP.UTF-8|日语(日本)|
|ko_KR.UTF-8|韩语(韩国)|
|vi_VN.UTF-8|越南语(越南)|
使用 shell 命令行按顺序执行下列典型的命令。
```Shell
$ echo $LANG
en_US.UTF-8
$ date -u
Wed 19 May 2021 03:18:43 PM UTC
$ LANG=fr_FR.UTF-8 date -u
mer. 19 mai 2021 15:19:02 UTC
```
这里,`date`(1)程序执行时使用了不同的语言环境值
- 第一个命令,“`$LANG`” 设置为系统的默认[语言环境](https://zh.wikipedia.org/wiki/Locale)值 “`en_US.UTF-8`”。
- 第二个命令,“`$LANG`”设置为法语的 UTF-8 [语言环境](https://zh.wikipedia.org/wiki/Locale)值“`fr_FR.UTF-8`”。
大多数的命令在执行时并没有预先定义环境变量。对于上面的例子,你也可以选择如下的方式。
```Shell
$ LANG=fr_FR.UTF-8
$ date -u
mer. 19 mai 2021 15:19:24 UTC
```
对于语言环境配置的细节,参见 [第 8.1 节 “语言环境”](https://www.debian.org/doc/manuals/debian-reference/ch08.zh-cn.html#_the_locale)
## 1.5.3. "`$PATH`" 变量
当你在 Shell 里输入命令的时候Shell 会在 "`$PATH`" 变量所包含的目录列表里进行搜索,"`$PATH`" 变量的值也叫作 Shell 的搜索路径。
可以在 Bash 脚本文件 "`~/.bash_profile`" 或 "`~/.bashrc`" 中改变 "`$PATH`" 环境变量的值。
在zsh中为`~/.zshrc`
## 1.5.4. "`$HOME`" 变量
很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用 "`$HOME`" 变量来指定。
|"$HOME" 变量的值|程序运行环境|
|-|-|
|/|初始进程执行的程序(守护进程)|
|/root|root 用户权限 Shell 执行的程序|
|/home/normal_user|普通用户权限Shell执行的程序|
|/home/normal_user|普通用户 GUI 桌面菜单执行的程序|
|/home/normal_user|用 root 用户权限来执行程序 "sudo program"|
|/root|用 root 用户权限执行程序 "sudo -H program"|
Shell 扩展 "~/" 为转入当前用户的主目录,也就是"$HOME/"。Shell 扩展 "~foo/" 为foo 的目录,也就是 "/home/foo/"。
## 1.5.5. 命令行选项
一些命令附带参数。这些参数以 "`-`" 或 "`--`" 开头,通常称之为选项,用来控制命令的执行方式。
```Shell
$ date
Thu 20 May 2021 01:08:08 AM JST
$ date -R
Thu, 20 May 2021 01:08:12 +0900
```
这里的命令参数 "`-R`" 改变 `date`(1) 命令输出为 [RFC2822](http://tools.ietf.org/html/rfc2822) 标准的日期字符格式。
## 1.5.6. Shell 通配符
经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为 **glob**(有时候被称为 **通配符**),以此来满足这方面的需求。
|shell glob 模式|匹配规则描述|
|-|-|
|*|不以 "." 开头的文件名(段)|
|.*|以 "." 开头的文件名(段)|
|?|精确字符|
|[…]|包含在括号中的任意字符都可以作为精确字符|
|[a-z]|"a" 到 "z" 之间的任意一个字符都可以作为精确字符|
|[^…]|除了包含在括号中的任意字符 ( " 1^ 2"除外 ),其它字符都可以作为精确字符|
尝试下列例子
```Shell
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
$ echo *.txt
1.txt 2.txt
$ echo *
1.txt 2.txt 3.c 4.h
$ echo *.[hc]
3.c 4.h
$ echo .*
. .. .5.txt ..6.txt
$ echo .*[^.]*
.5.txt ..6.txt
$ echo [^1-3]*
4.h
$ cd ..; rm -rf junk
```
参见 `glob`(7)。
与 shell 通用的文件名匹配方式不同, 使用 " `-name` " 选项的 `find` (1),其 shell 模式" `*` " ,匹配以" `.` "开始的文件名.(新[POSIX](https://zh.wikipedia.org/wiki/POSIX)的特性)
BASH 可以使用内置的 shopt 选项如 " `dotglob` "" `noglob` "," `nocaseglob` "," `nullglob` "," `extglob` "定制全局行为,使用 `bash` ( 1 )查看详细说明。
## 1.5.7. 命令的返回值
每个命令都会返回它的退出状态(变量:“`$?`”)作为返回值。
|命令的退出状态|数字返回值|逻辑返回值|
|-|-|-|
|success|zero, 0|TRUE|
|error|non-zero, -1|FALSE|
尝试下列例子。
```Shell
$ [ 1 = 1 ] ; echo $?
0
$ [ 1 = 2 ] ; echo $?
1
```
## 1.5.8. 典型的顺序命令和 shell 重定向
让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。
|命令常见用法|说明|
|-|-|
|command &|在子 shell 的后台 中执行 command|
|command1|command2|
|command1 2>&1|command2|
|command1 ; command2|依次执行 command1 和 command2|
|command1 && command2|执行 command1如果成功按顺序执行 command2如果 command1 和 command2 都执行成功了,返回 success |
|command1||
|command > foo|将 command 的标准输出重定向到文件 foo覆盖|
|command 2> foo|将 command 的标准错误重定向到文件 foo覆盖|
|command >> foo|将 command 的标准输出重定向到文件 foo附加|
|command 2>> foo|将 command 的标准错误重定向到文件 foo附加|
|command > foo 2>&1|将 command 的标准输出和标准错误重定向到文件 foo|
|command < foo| command 的标准输入重定向到文件 foo|
|command << delimiter| command 的标准输入重定向到下面的命令行直到遇到delimiter”(here document|
|command <<- delimiter| command 的标准输入重定向到下面的命令行直到遇到delimiter”(here document命令行中开头的制表符会被忽略|
deepin 系统是一个多任务的操作系统后台任务让用户能够在一个 shell 中执行多个程序后台进程的管理涉及 shell 的内建命令`jobs`、`fg`、`bg` `kill`请阅读 bash(1) 中的章节:“SIGNALS”、“JOB CONTROL “`builtins`(1)”。
尝试下列例子
```Shell
</etc/motd pager
```
```Shell
pager </etc/motd
```
```Shell
pager /etc/motd
```
```Shell
cat /etc/motd | pager
```
尽管4个 shell 重定向的例子都会显示相同的结果但最后一个例子毫无意义地运行了额外的 `cat` 命令浪费了资源
shell 允许你使用 `exec` 通过任意一个文件描述符来打开文件
```Shell
$ echo Hello >foo
$ exec 3foo 4bar # open files
$ cat <&3 >&4 # redirect stdin to 3, stdout to 4
$ exec 3<&- 4>&- # close files
$ cat bar
Hello
```
预定义的文件描述符0-2
|设备|说明|文件描述符|
|-|-|-|
|stdin|标准输入|0|
|stdout|标准输出|1|
|stderr|标准错误|2|
## 1.5.9. 命令别名
你可以为经常使用的命令设置一个别名
尝试下列例子
```Shell
alias la='ls -la'
```
现在,“`la`”“`ls -al`”的简写形式并同样会以长列表形式列出所有的文件
你可以使用 `alias` 来列出所有的别名参见 `bash`(1) 中的SHELL BUILTIN COMMANDS”)。
```Shell
$ alias
...
alias la='ls -la'
```
你可以使用 `type` 来确认命令的准确路径或类型参见 `bash`(1) 中的SHELL BUILTIN COMMANDS”)。
尝试下列例子
```Shell
$ type ls
ls is hashed (/bin/ls)
$ type la
la is aliased to ls -la
$ type echo
echo is a shell builtin
$ type file
file is /usr/bin/file
```
`ls` 在最近被使用过 “`file`” 没有因此 “`ls`” 标记为 hashed”(被录入哈希表 shell 有一个内部的记录用来快速访问 “`ls`” 所处的位置
:::tip
alia命令定义的别名仅在当前shell有效如果关闭或重启shell则不会保留别名如果想长久保留请将其写入坏境变量中
:::