• 练习 5:Bash:环境变量,envsetexport
    • 这样做
    • 你会看到什么
    • 解释
    • 附加题

    练习 5:Bash:环境变量,envsetexport

    原文:Exercise 5. Bash: environment variables, env, set, export

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    请考虑以下内容:你希望程序打印出你的用户名。这个程序怎么知道的?在 Linux 中有一些环境变量。这意味着你的 shell 中有许多变量,其中许多变量自动设置,每次运行程序时,其中一些变量将传递给该程序。

    详细说明:

    • 一些变量只为你当前的 shell 设置。它们被称为本地 shell 变量。你可以通过键入set,一个 bash 内置命令来列出它们 ,这意味着没有启动其它程序,之后你执行了它。此命令由 bash 本身处理。

    • 其他变量被传递到你从当前 shell 启动的每个程序。它们被称为环境变量,可以通过env程序列出,这意味着,通过键入env, 你将看到,你启动的每个程序获得了什么变量。

    你可能想要深入挖掘。要做到这一点,掌握 subshell 的概念,这是一个子进程,当你运行程序时创建,并且成为你的程序。

    现在,你将学习如何创建变量以及如何使用变量。

    这样做

    1. 1: foo='Hello World!'
    2. 2: echo $foo
    3. 3: set | grep foo
    4. 4: env | grep foo
    5. 5: export foo
    6. 6: env | grep foo
    7. 7: foo='ls -al'
    8. 8: $foo

    你会看到什么

    1. uset1@vm1:~$ foo='Hello World!'
    2. user1@vm1:~$ echo $foo
    3. Hello World!
    4. user1@vm1:~$ set | grep foo
    5. foo='Hello World!'
    6. user1@vm1:~$ env | grep foo
    7. user1@vm1:~$ export foo
    8. user1@vm1:~$ env | grep foo
    9. foo=Hello World!
    10. user1@vm1:~$ foo='ls -al'
    11. user1@vm1:~$ $foo
    12. total 36
    13. drwxr-xr-x 2 user1 user1 4096 Jun 14 12:23 .
    14. drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
    15. -rw------- 1 user1 user1 4042 Jun 15 18:52 .bash_history
    16. -rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
    17. -rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrc
    18. -rw------- 1 user1 user1 50 Jun 15 18:41 .lesshst
    19. -rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile
    20. -rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak
    21. -rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1

    解释

    1. 创建变量foo ,并将Hello World!这一行放在其中。
    2. 打印出变量foo
    3. 打印所有环境变量的列表,它传递给grep,打印出只包含变量foo的行。注意变量foo存在。
    4. 打印所有环境变量列表,它们传递给你执行的任何程序。注意变量foo不存在。
    5. 使变量foo可用于从当前 shell 执行的所有程序。
    6. 现在你可以看到,你的变量确实可用于你执行的所有程序。
    7. ls /放入变量foo
    8. 执行包含在变量foo中的命令。

    附加题

    • 输入并执行envset。看看有多少个不同的变量?不用担心,通常你可以通过谷歌搜索,快速了解一个变量的作用。尝试这样做。

    • 尝试输入:

      1. set | egrep '^[[:alpha:]].*$'

      现在,试试set。看见我在这里做了什么嘛?快速的解释是:

      1. egrep '^[[:alpha:]].*$'

      仅仅打印出以字母开头的行,它是每个字母,并忽略其他行。现在不要纠结这个,也不要纠结|符号。以后我会解释它。

    • 在这里阅读envset之间的区别:http://stackoverflow.com/questions/3341372/differnce-between-the-shell-and-environment-variable-in-bash。记住,stackoverflow 是你的朋友!我会重复多次。

    • 尝试输入set FOO=helloworld bash -c 'echo $FOO'。这里是解释:http://stackoverflow.com/questions/10938483/bash-specifying-environment-variables-for-echo-on-command-line。同样,不要太纠结,你会在大量练习之后再次碰到它,我保证。

    • 试试这个:

      1. PS1_BAK=$PS1
      2. PS1='Hello, world! $(pwd) > '
      3. PS1=$PS1_BAK

      注意我使用$(pwd),将命令输出作为变量访问。现在,键入man bash /PS1(是的,只是斜杠),按下<ENTER>。你现在可以按下n查看下一个结果。浏览 PROMPTING,并键入q来退出man。现在,访问 http://stackexchange.com/ 并搜索bash PS1。了解这两个文档来源的区别。