2023-03-06 16:38:17 +08:00
|
|
|
|
# 简单 shell 命令
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
现在,你对如何使用 deepin 系统已经有一些感觉了。让我们更深入了解 deepin 系统的命令执行机制。在这里,我将为新手做一般的讲解。精确的解释参见`bash`(1)。
|
|
|
|
|
|
|
|
|
|
一般的命令由有序的组件构成。
|
|
|
|
|
|
|
|
|
|
- 设置变量值(可选)
|
|
|
|
|
|
|
|
|
|
- 命令名
|
|
|
|
|
|
|
|
|
|
- 参数(可选)
|
|
|
|
|
|
|
|
|
|
- 重定向(可选:`>`, `>>` , `<`, `<<` 等等)
|
|
|
|
|
|
|
|
|
|
- 控制操作(可选:`&&` , `||` , 换行符 , `;` , `&` , `(` , `)`)
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## 命令执行和环境变量
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
一些[环境变量](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`" 中设置的环境变量。
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## “`$LANG`”变量
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
默认的语言环境是在 "`$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)
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## "`$PATH`" 变量
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
当你在 Shell 里输入命令的时候,Shell 会在 "`$PATH`" 变量所包含的目录列表里进行搜索,"`$PATH`" 变量的值也叫作 Shell 的搜索路径。
|
|
|
|
|
|
|
|
|
|
可以在 Bash 脚本文件 "`~/.bash_profile`" 或 "`~/.bashrc`" 中改变 "`$PATH`" 环境变量的值。
|
|
|
|
|
|
|
|
|
|
在zsh中为`~/.zshrc`
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## "`$HOME`" 变量
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用 "`$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/"。
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## 命令行选项
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
一些命令附带参数。这些参数以 "`-`" 或 "`--`" 开头,通常称之为选项,用来控制命令的执行方式。
|
|
|
|
|
|
|
|
|
|
```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) 标准的日期字符格式。
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## Shell 通配符
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为 **glob**,(有时候被称为 **通配符**),以此来满足这方面的需求。
|
|
|
|
|
|
|
|
|
|
|shell glob 模式|匹配规则描述|
|
|
|
|
|
|-|-|
|
|
|
|
|
|*|不以 "." 开头的文件名(段)|
|
|
|
|
|
|.*|以 "." 开头的文件名(段)|
|
|
|
|
|
|?|精确字符|
|
|
|
|
|
|[…]|包含在括号中的任意字符都可以作为精确字符|
|
|
|
|
|
|[a-z]|"a" 到 "z" 之间的任意一个字符都可以作为精确字符|
|
|
|
|
|
|[^…]|除了包含在括号中的任意字符 ( " 1^ 2"除外 ),其它字符都可以作为精确字符|
|
|
|
|
|
|
|
|
|
|
尝试下列例子
|
|
|
|
|
|
|
|
|
|
```Shell
|
2023-03-06 16:38:17 +08:00
|
|
|
|
$ mkdir junk; cd junk; touch 1.txt 2.txth .5.txt ..6.txt
|
2023-02-15 21:56:55 +08:00
|
|
|
|
$ echo *.txt
|
|
|
|
|
1.txt 2.txt
|
|
|
|
|
$ echo *
|
2023-03-06 16:38:17 +08:00
|
|
|
|
1.txt 2.txth
|
2023-02-15 21:56:55 +08:00
|
|
|
|
$ 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)。
|
|
|
|
|
|
2023-02-16 10:56:23 +08:00
|
|
|
|
与 shell 通用的文件名匹配方式不同, 使用 " `-name` " 选项的 `find` (1),其 shell 模式" `*` " ,匹配以" `.` "开始的文件名.(新[POSIX](https://zh.wikipedia.org/wiki/POSIX)的特性)
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
BASH 可以使用内置的 shopt 选项如 " `dotglob` "," `noglob` "," `nocaseglob` "," `nullglob` "," `extglob` "定制全局行为,使用 `bash` ( 1 )查看详细说明。
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## 命令的返回值
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
每个命令都会返回它的退出状态(变量:“`$?`”)作为返回值。
|
|
|
|
|
|
|
|
|
|
|命令的退出状态|数字返回值|逻辑返回值|
|
|
|
|
|
|-|-|-|
|
|
|
|
|
|success|zero, 0|TRUE|
|
|
|
|
|
|error|non-zero, -1|FALSE|
|
|
|
|
|
|
|
|
|
|
尝试下列例子。
|
|
|
|
|
|
|
|
|
|
```Shell
|
|
|
|
|
$ [ 1 = 1 ] ; echo $?
|
|
|
|
|
0
|
|
|
|
|
$ [ 1 = 2 ] ; echo $?
|
|
|
|
|
1
|
|
|
|
|
```
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## 典型的顺序命令和 shell 重定向
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
让我们试着记住下面 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
|
2023-02-16 10:56:23 +08:00
|
|
|
|
</etc/motd pager
|
2023-02-15 21:56:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```Shell
|
2023-02-16 10:56:23 +08:00
|
|
|
|
pager </etc/motd
|
2023-02-15 21:56:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```Shell
|
2023-02-16 10:56:23 +08:00
|
|
|
|
pager /etc/motd
|
2023-02-15 21:56:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```Shell
|
2023-02-16 10:56:23 +08:00
|
|
|
|
cat /etc/motd | pager
|
2023-02-15 21:56:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
尽管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|
|
|
|
|
|
|
2023-03-06 16:38:17 +08:00
|
|
|
|
## 命令别名
|
2023-02-15 21:56:55 +08:00
|
|
|
|
|
|
|
|
|
你可以为经常使用的命令设置一个别名。
|
|
|
|
|
|
|
|
|
|
尝试下列例子
|
|
|
|
|
|
|
|
|
|
```Shell
|
2023-02-16 10:56:23 +08:00
|
|
|
|
alias la='ls -la'
|
2023-02-15 21:56:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
现在,“`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`” 所处的位置。
|
|
|
|
|
|
2023-02-16 10:16:39 +08:00
|
|
|
|
:::tip
|
|
|
|
|
alia命令定义的别名仅在当前shell有效,如果关闭或重启shell则不会保留别名。如果想长久保留,请将其写入坏境变量中。
|
|
|
|
|
:::
|