Debian常见shell命令详解

2024-11-09 38

在Debian系统中,shell命令是用户与操作系统进行交互的重要工具。掌握一些常用的shell命令,可以帮助我们更高效地完成各种任务。接下来,本教程将为大家介绍一些在Debian系统中常见的shell命令的简单用法。

9ab038e27a5f63773344c3ee168ab99e_u=1385815678,3167280408&fm=253&fmt=auto&app=120&f=JPEG_w=820&h=500.webp

一般的命令由有序的组件构成,包括设置变量值(可选)、命令名、参数(可选)、重定向(可选:>, >>, <, <<等等)以及控制操作(可选:&&, ||, 换行符, ;, &, (, ))。

一、命令执行/环境变量

一些环境变量的值可以改变部分Unix命令的行为。这些环境变量的默认值由PAM系统初始化,并且其中一些可能会被某些应用程序重新设定:

1、PAM(可插拔身份验证模块)系统的模块,例如pam_env模块,可以通过”/etc/pam.conf”、”/etc/environment”和”/etc/default/locale”来设置环境变量。

2、显示管理器(如gdm3)可以通过”~/.profile”文件为GUI(图形用户界面)会话重新设置环境变量。

3、当用户特定的程序初始化时,它们可以重新设置在”~/.profile”、”~/.bash_profile”和”~/.bashrc”文件中设置的环境变量。

二、$LANG变量

默认的语言环境是在 “$LANG” 环境变量中定义,它在安装的时候配置为 “LANG=xx_YY.UTF-8″,或者在接下来的 GUI(图形用户界面)中配置,例如在 GNOME 中是,”设置” → “区域 & 语言” → “语言” / “格式”。

注意:

  • 目前建议最好用变量 “$LANG” 来配置系统环境变量,只有在逼不得已的情况下才用 $LC_*” 开头的变量;

  • “$LANG” 变量的完整的语言环境值由3部分组成:“xx_YY.ZZZZ”。

语言环境值的 3 个部分:

语言环境值说明
xxISO 639 语言代码(小写)例如“en”
YYISO 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 $LANGen_US.UTF-8$ date -uWed 19 May 2021 03:18:43 PM UTC$.UTF-8 date -umer. 19 mai 2021 15:19:02 UTC

这里,date(1)程序执行时使用了不同的语言环境值。

  • 第一个命令,“$LANG” 设置为系统的默认语言环境值 “en_US.UTF-8”。

  • 第二个命令,“$LANG”设置为法语的 UTF-8 语言环境值“fr_FR.UTF-8”。

大多数的命令在执行时并没有预先定义环境变量。对于上面的例子,也可以选择如下的方式。

$.UTF-8$ date -umer. 19 mai 2021 15:19:24 UTC

注意:提交一个 BUG 报告的时候,如果使用的是非英语的环境,在 “LANG=en_US.UTF-8” 语言环境环境下对命令进行运行和检查会更好一些。

对于语言环境配置的细节,参见 第 8.1 节 “语言环境”。

三、$PATH变量

当在 Shell 里输入命令的时候,Shell 会在 “$PATH” 变量所包含的目录列表里进行搜索,”$PATH” 变量的值也叫作 Shell 的搜索路径。

在默认的 Debian 安装过程中,所使用的用户账号的 “$PATH” 环境变量可能不包括 “/usr/sbin” 和”/usr/sbin”目录。例如,ifconfig 命令就需要指定完整的路径 “/usr/sbin/ifconfig”。(类似地, ip 命令是在 “/usr/bin” 目录下)可以在 Bash 脚本文件 “~/.bash_profile” 或 “~/.bashrc” 中改变 “$PATH” 环境变量的值。

四、$HOME变量

很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用 “$HOME” 变量来指定。

“$HOME” 变量值列表:

$HOME” 变量的值程序运行环境
/初始进程执行的程序(守护进程)
/rootroot 用户权限 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/”。

五、命令行选项

一些命令附带参数,这些参数以 “-” 或 “–” 开头,通常称之为选项,用来控制命令的执行方式。

$ dateThu 20 May 2021 01:08:08 AM JST$ date -RThu, 20 May 2021 01:08:12 +0900

这里的命令参数 “-R” 改变 date(1) 命令输出为 RFC2822 标准的日期字符格式。

六、Shell通配符

经常有这种情况期望命令成串自动执行而不需要挨个输入,将文件名扩展为 glob,(有时候被称为 通配符),以此来满足这方面的需求。

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 *.txt1.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

注意:

  • 与 shell 通用的文件名匹配方式不同, 使用 ” -name ” 选项的 find (1),其 shell 模式” * ” ,匹配以” . “开始的文件名.(新 POSIX 的特性);

  • BASH 可以使用内置的 shopt 选项如 ” dotglob “,” noglob “,” nocaseglob “,” nullglob “,” extglob “定制全局行为,使用 bash ( 1 )查看详细说明。

七、命令的返回值

每个命令都会返回它的退出状态(变量:“$?”)作为返回值。

命令的退出代码:

命令的退出状态数字返回值逻辑返回值
successzero, 0TRUE
errornon-zero, -1FALSE

尝试下列例子:

$ [ 1 = 1 ] ; echo $?0$ [ 1 = 2 ] ; echo $?1

注意:请注意,success 是逻辑 TRUE ,0(zero)则是它的值。这有些不直观,需要在这里提一下。

八、顺序命令/shell重定向

让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。

Shell 命令常见用法:

命令常见用法说明
command &在子 shell 的后台 中执行 command
command1 | command2通过管道将 command1 的标准输出作为 command2 的标准输入(并行执行)
command1 2>&1 | command2通过管道将 command1 的标准输出和标准错误作为 command2 的标准输入(并行执行)
command1 ; command2依次执行 command1 和 command2
command1 && command2执行 command1;如果成功,按顺序执行 command2(如果 command1  command2 都执行成功了,返回 success )
command1 || command2执行 command1;如果不成功,按顺序执行 command2(如果 command1  command2 执行成功,返回 success )
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,命令行中开头的制表符会被忽略)

Debian 系统是一个多任务的操作系统。后台任务让用户能够在一个 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 3<foo 4>bar # open files$ cat <&3 >&4 # redirect stdin to 3, stdout to 4$ exec 3<&- 4>&- # close files$ cat barHello

预定义的文件描述符0-2。

预定义的文件描述符:

设备说明文件描述符
stdin标准输入0
stdout标准输出1
stderr标准错误2

九、命令别名

可以为经常使用的命令设置一个别名。尝试下列例子:

$ alias la='ls -la'

现在,“la”是“ls -al”的简写形式,并同样会以长列表形式列出所有的文件。可以使用 alias 来列出所有的别名(参见 bash(1) 中的“SHELL BUILTIN COMMANDS”)。

$ alias...alias la='ls -la'

可以使用 type 来确认命令的准确路径或类型,尝试下列例子:

$ type lsls is hashed (/bin/ls)$ type lala is aliased to ls -la$ type echoecho is a shell builtin$ type filefile is /usr/bin/file

ls 在最近被使用过,而 “file” 没有,因此 “ls” 标记为 “hashed”(被录入哈希表),即 shell 有一个内部的记录用来快速访问 “ls” 所处的位置。