Log:
9.6 KiB
1.5. 简单 shell 命令
现在,你对如何使用 deepin 系统已经有一些感觉了。让我们更深入了解 deepin 系统的命令执行机制。在这里,我将为新手做一般的讲解。精确的解释参见bash
(1)。
一般的命令由有序的组件构成。
-
设置变量值(可选)
-
命令名
-
参数(可选)
-
重定向(可选:
>
,>>
,<
,<<
等等) -
控制操作(可选:
&&
,||
, 换行符 ,;
,&
,(
,)
)
1.5.1. 命令执行和环境变量
一些环境变量的值会改变部分 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 命令行按顺序执行下列典型的命令。
$ 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=fr_FR.UTF-8
$ date -u
mer. 19 mai 2021 15:19:24 UTC
对于语言环境配置的细节,参见 第 8.1 节 “语言环境”
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. 命令行选项
一些命令附带参数。这些参数以 "-
" 或 "--
" 开头,通常称之为选项,用来控制命令的执行方式。
$ date
Thu 20 May 2021 01:08:08 AM JST
$ date -R
Thu, 20 May 2021 01:08:12 +0900
这里的命令参数 "-R
" 改变 date
(1) 命令输出为 RFC2822 标准的日期字符格式。
1.5.6. Shell 通配符
经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为 glob,(有时候被称为 通配符),以此来满足这方面的需求。
shell glob 模式 | 匹配规则描述 |
---|---|
* | 不以 "." 开头的文件名(段) |
.* | 以 "." 开头的文件名(段) |
? | 精确字符 |
[…] | 包含在括号中的任意字符都可以作为精确字符 |
[a-z] | "a" 到 "z" 之间的任意一个字符都可以作为精确字符 |
[^…] | 除了包含在括号中的任意字符 ( " 1^ 2"除外 ),其它字符都可以作为精确字符 |
尝试下列例子
$ 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 的特性)
BASH 可以使用内置的 shopt 选项如 " dotglob
"," noglob
"," nocaseglob
"," nullglob
"," extglob
"定制全局行为,使用 bash
( 1 )查看详细说明。
1.5.7. 命令的返回值
每个命令都会返回它的退出状态(变量:“$?
”)作为返回值。
命令的退出状态 | 数字返回值 | 逻辑返回值 |
---|---|---|
success | zero, 0 | TRUE |
error | non-zero, -1 | FALSE |
尝试下列例子。
$ [ 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)”。
尝试下列例子
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
尽管4个 shell 重定向的例子都会显示相同的结果,但最后一个例子毫无意义地运行了额外的 cat
命令浪费了资源。
shell 允许你使用 exec
通过任意一个文件描述符来打开文件。
$ 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. 命令别名
你可以为经常使用的命令设置一个别名。
尝试下列例子
$ alias la='ls -la'
现在,“la
”是“ls -al
”的简写形式,并同样会以长列表形式列出所有的文件。
你可以使用 alias
来列出所有的别名(参见 bash
(1) 中的“SHELL BUILTIN COMMANDS”)。
$ alias
...
alias la='ls -la'
你可以使用 type
来确认命令的准确路径或类型(参见 bash
(1) 中的“SHELL BUILTIN COMMANDS”)。
尝试下列例子
$ 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则不会保留别名。如果想长久保留,请将其写入坏境变量中。 :::