环境变量是一个名称-值对。程序可以使用来自环境变量的数据来确定在某些情况下如何表现。例如,通过设置PAGER
环境变量的值,可以改变用于显示手册页的默认命令。
环境变量区分大小写;然而,按照惯例,它们都是大写字母。要查看已知环境值的值,运行echo $VAR_NAME
或printenv VAR_NAME
。您可以在没有参数的情况下使用env
或printenv
命令来显示当前设置的所有环境变量。
$ echo $HOME
/home/jason
$ printenv HOME
/home/jason
$ printenv
SHELL=/bin/bash
TERM=xterm
USER=jason
MAIL=/var/mail/jason
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/jason
LANG=en_US.UTF-8
PS1=$
SHLVL=1
HOME=/home/jason
LOGNAME=jason
OLDPWD=/home/jason
$ env
SHELL=/bin/bash
TERM=xterm
USER=jason
MAIL=/var/mail/jason
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/jason
LANG=en_US.UTF-8
PS1=$
SHLVL=1
HOME=/home/jason
LOGNAME=jason
OLDPWD=/home/jason
$
当一个进程启动时,它会继承其父进程的导出环境变量。设置的环境变量只影响当前运行的进程,除非它被显式导出。在下面的例子中,当前外壳的PAGER
环境变量被设置为less
。如果一个子进程在没有导出该变量的情况下启动,例如 Bash shell 的另一个实例,则该环境变量不会被继承。当PAGER
被导出并且一个新的 Bash shell 被启动时,它对该进程可用。要删除环境变量,请使用unset
命令。
$ echo $PAGER
$ PAGER=less
$ echo $PAGER
less
$ bash
$ echo $PAGER
$ exit
exit
$ export PAGER=less
$ bash
$ echo $PAGER
less
$ exit
exit
$ echo $PAGER
less
$ unset PAGER
$ echo $PAGER
$
表 36:常见环境变量
可变的 | 使用 |
---|---|
EDITOR |
用来编辑文件的程序。 |
HOME |
用户的主目录。 |
LOGNAME |
当前用户的用户标识或登录标识。 |
MAIL |
用户邮箱在本地系统上的位置。 |
OLDPWD |
旧的或以前的工作目录。 |
PATH |
命令的搜索路径。 |
PAGER |
用于分页文件的程序。 |
PS1 |
主要提示字符串。 |
PWD |
当前工作目录。 |
USER |
当前用户的用户标识或登录标识。 |
您可以在命令行中使用称为别名的键盘快捷键。您可以为经常重复的、长的、难以键入的或难以记住的命令创建别名,从而节省一些时间和键入内容。您甚至可以使用别名来修复常见的打字错误。有些人甚至使用别名来使 Linux 表现得像他们熟悉的另一个操作系统。
alias [alias_name[=value]]
在没有任何参数的情况下,alias 命令会列出您环境中的当前别名。使用alias alias_name=value
创建新的别名。
unalias alias_name
移除alias_name
。使用unalias -a
删除所有别名。
$ alias ll='ls -l'
$ alias
alias ll='ls -l'
$ ls -l
total 32
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Desktop
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Documents
drwxrwxr-x 2 jason jason 4096 May 17 13:37 Downloads
-rw-rw-r-- 1 jason jason 274 Jun 28 14:52 goals.txt
drwxrwxr-x 3 jason jason 4096 Jun 21 22:05 Music
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Pictures
-rw-rw-r-- 1 jason jason 73 Jun 29 02:30 to-do.txt
$ ll
total 32
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Desktop
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Documents
drwxrwxr-x 2 jason jason 4096 May 17 13:37 Downloads
-rw-rw-r-- 1 jason jason 274 Jun 28 14:52 goals.txt
drwxrwxr-x 3 jason jason 4096 Jun 21 22:05 Music
drwxrwxr-x 2 jason jason 4096 Jun 21 22:01 Pictures
-rw-rw-r-- 1 jason jason 73 Jun 29 02:30 to-do.txt
$ alias bu='/usr/local/bin/backup-database.sh'
$ bu
Starting database backup.
...
Database backup complete.
$ alias
alias bu='/usr/local/bin/backup-database.sh'
alias ll='ls -l'
$
别名只存在于当前会话中。因此,如果您要创建一个别名,注销并再次登录,该别名将不可用。要使它们在会话之间保持不变,您必须将它们添加到您的个人初始化文件中。
要将自定义保存到 shell 环境中,请将它们放在个人初始化文件中。如果您使用的是 Bash,您可以在~/.bashrc
或~/.bash_profile
中进行自定义。为登录会话读取并执行~/.bash_profile
文件。当 bash 没有作为登录 shell 启动时,例如当您在终端仿真器应用中打开一个新选项卡时,会读取并执行~/.bashrc
。如果您不想或不需要这种区分,您可以制作~/.bash_profile
源~/.bashrc
并将您的所有定制放入~/.bashrc
中。使用这种方法将提供相同的环境,无论它是否是登录外壳。个人初始化文件通常被称为“点文件”
$ cat ~/.bash_profile
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
$
source
命令从当前 shell 的给定文件中读取并执行命令。也可以用句点来源文件,所以source file1
和. file1
是一回事。前面例子中的if
语句只是在试图获取文件源之前检查一下~/.bashrc
文件是否存在。
$ echo "alias ll='ls -l'" >> ~/.bashrc
$ cat ~/.bashrc
# A line that begins with a pound sign is a comment.
# Place customizations in this file.
alias ll='ls -l'
$ . ~/.bashrc
$ alias ll
alias ll='ls -l'
$
您在命令行执行的命令会保留在 shell 历史记录中。Bash 会将您的历史记录保留在内存中,直到当前会话结束。届时,您的历史记录将保存到~/.bash_history
文件中。不同的 shells 将历史保存在不同的文件中,但它们通常包含单词 history,并作为点文件存储在您的主目录中。此外,您可以设置HISTSIZE
环境变量来控制保存在 shell 历史中的命令数量。默认值为 500。
history
当历史命令在没有参数的情况下执行时,它会在您的 shell 历史中显示一个命令列表。
!N
重复与行号N
相关的命令。
!!
重复前面的命令行。
!pattern
从pattern
开始重复最近的命令。
$ history
1 ls
2 diff random-states random-states.bak
3 history
$ !1
ls
Desktop Documents Downloads link-to-to-do Music program tmp to-do.txt
$ echo $SHELL
/bin/bash
$ !!
echo $SHELL
/bin/bash
$ !d
diff random-states random-states.bak
3c3
< Georgia Atlanta
---
> Georgia Savannah
$
您可以通过键入Ctrl-r
来搜索您的 shell 历史记录。这将启动由(reverse-i-search)
':指示的反向搜索,并允许您在历史记录中键入命令的一部分进行检索。要继续在您的历史中搜索与您的搜索模式相匹配的其他命令,请继续按
Ctrl-r。找到要执行的命令后,按回车键。如果您想在执行之前更改命令行,请按 Esc。要完全放弃反向搜索,请键入
Ctrl-c`。
$ diff random-states random-states.bak
3c3
< Georgia Atlanta
---
> Georgia Savannah
(reverse-i-search)`di': diff random-states random-states.bak
3c3
< Georgia Atlanta
---
> Georgia Savannah
$
要调用制表符补全,只需开始键入一个命令并按 tab 键。如果可能,制表符补全会尝试补全部分键入的命令。如果有很多可能性,可以通过按两次 Tab 键来显示这些选项。您可以继续键入,并随时再次按 Tab 键。
除了完成命令,您还可以使用选项卡完成来完成文件名和目录名。当一个文件或目录被用作像ls
、cat
、rm
等命令的参数时,这可能很有用。
$ # Typing jo[Tab][Tab] results in:
$ jo
jobs join
$ # Typing job[Tab][Enter] results in:
$ jobs
[1]+ Running ./db-backup.sh &
$ ls r*
random-states random-states.bak
$ # Typing cat[Space]r[Tab][Enter] results in:
$ cat random-states
Tennessee Nashville
Wyoming Cheyenne
Indiana Indianapolis
Indiana Indianapolis
Arizona Phoenix
Colorado Denver
Indiana Indianapolis
Georgia Atlanta
$
如果您想创建一个命令行,该命令行在视觉上跨越多行,但作为一个单独的命令,请在您想继续的每一行的末尾使用一个反斜杠。当反斜杠出现在命令行末尾时,它充当行延续字符。如果在命令提示符下使用此选项,连续的行将以大于符号作为前缀。在阅读文档或检查 shell 脚本时,您可能会遇到这种情况。
$ diff \
> random-states \
> random-states.bak
3c3
< Georgia Atlanta
---
> Georgia Savannah
$ diff random-states random-states.bak
3c3
< Georgia Atlanta
---
> Georgia Savannah
$