Skip to content

Files

Latest commit

9566748 · Jan 9, 2022

History

History
259 lines (211 loc) · 9.14 KB

11.md

File metadata and controls

259 lines (211 loc) · 9.14 KB

十一、附加命令行概念

环境变量是一个名称-值对。程序可以使用来自环境变量的数据来确定在某些情况下如何表现。例如,通过设置PAGER环境变量的值,可以改变用于显示手册页的默认命令。

环境变量区分大小写;然而,按照惯例,它们都是大写字母。要查看已知环境值的值,运行echo $VAR_NAMEprintenv VAR_NAME。您可以在没有参数的情况下使用envprintenv命令来显示当前设置的所有环境变量。

    $ 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相关的命令。

!!重复前面的命令行。

!patternpattern开始重复最近的命令。

    $ 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 键。

除了完成命令,您还可以使用选项卡完成来完成文件名和目录名。当一个文件或目录被用作像lscatrm等命令的参数时,这可能很有用。

    $ # 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
    $