• 练习 3:Bash:Shell、.profile.bashrc.bash_history
    • 这样做
    • 你会看到什么
    • 解释
    • 附加题

    练习 3:Bash:Shell、.profile.bashrc.bash_history

    原文:Exercise 3. Bash: The shell, .profile, .bashrc, .bash_history

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    当使用 CLI(命令行界面)来使用 Linux 时,你正在与一个名为 shell 的程序进行交互。所有你输入的都传递给 shell,它解释你输入的内容,执行参数扩展(这有点类似于代数中的花括号扩展),并为你执行程序。我们将使用的 Shell 称为 Bash,它代表 Bourne Again Shell,而 Bourne Again Shell 又是一个双关语。现在我将使用纯中文,向大家介绍一下 bash 的工作方式:

      • 登入 Linux 虚拟机
      • 你的身份由用户名(user1)和密码(123qwe)确定。
      • Bash 执行了。
    • Bash
      • 从你的配置中读取并执行首个命令,它定义了:
        • 命令提示符是什么样子
        • 使用 Linux 时,你会看到什么颜色
        • 你的编辑器是什么
        • 你的浏览器是什么
      • 读取首个命令后,Bash 进入循环
        • 没有通过输入exit或者按下<CTRL+D>,来要求退出的时候:
          • 读取一行
          • 解析这一行,扩展花括号
          • 使用扩展参数执行命令

    我重复一下,你输入的任何命令都不会直接执行,而是首先扩展,然后执行。例如,当你输入ls *时,星号*将扩展为当前目录中所有文件的列表。

    现在你将学习如何修改你的配置,以及如何编写和查看你的历史记录。

    这样做

    1. 1: ls -al
    2. 2: cat .profile
    3. 3: echo Hello, $LOGNAME!
    4. 4: cp -v .profile .profile.bak
    5. 5: echo 'echo Hello, $LOGNAME!' >> .profile
    6. 6: tail -n 5 .profile
    7. 7: history -w
    8. 8: ls -altr
    9. 9: cat .bash_history
    10. 10: exit

    你会看到什么

    1. user1@vm1's password:
    2. Linux vm1 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64
    3. The programs included with the Debian GNU/Linux system are free software;
    4. the exact distribution terms for each program are described in the
    5. individual files in /usr/share/doc/*/copyright.
    6. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    7. permitted by applicable law.
    8. Last login: Thu Jun 7 12:03:29 2012 from sis.site
    9. Hello, user1!
    10. user1@vm1:~$ ls -al
    11. total 20
    12. drwxr-xr-x 2 user1 user1 4096 Jun 7 12:18 .
    13. drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
    14. -rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
    15. -rw-r--r-- 1 user1 user1 3184 Jun 6 21:48 .bashrc
    16. -rw-r--r-- 1 user1 user1 697 Jun 7 12:04 .profile
    17. user1@vm1:~$ cat .profile
    18. # ~/.profile: executed by the command interpreter for login shells.
    19. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    20. # exists.
    21. # see /usr/share/doc/bash/examples/startup-files for examples.
    22. # the files are located in the bash-doc package.
    23. # the default umask is set in /etc/profile; for setting the umask
    24. # for ssh logins, install and configure the libpam-umask package.
    25. #umask 022
    26. # if running bash
    27. if [ -n "$BASH_VERSION" ]; then
    28. # include .bashrc if it exists
    29. if [ -f "$HOME/.bashrc" ]; then
    30. . "$HOME/.bashrc"
    31. fi
    32. fi
    33. # set PATH so it includes user's private bin if it exists
    34. if [ -d "$HOME/bin" ] ; then
    35. PATH="$HOME/bin:$PATH"
    36. fi
    37. echo Hello, $LOGNAME!
    38. user1@vm1:~$ echo Hello, $LOGNAME!
    39. Hello, user1!
    40. user1@vm1:~$ cp -v .profile .profile.bak
    41. `.profile' -> `.profile.bak'
    42. user1@vm1:~$ echo 'echo Hello, $LOGNAME!' >> .profile
    43. user1@vm1:~$ tail -n 5 .profile
    44. # set PATH so it includes user's private bin if it exists
    45. if [ -d "$HOME/bin" ] ; then
    46. PATH="$HOME/bin:$PATH"
    47. fi
    48. echo Hello, $LOGNAME!
    49. user1@vm1:~$ history -w
    50. user1@vm1:~$ ls -altr
    51. total 28
    52. -rw-r--r-- 1 user1 user1 3184 Jun 6 21:48 .bashrc
    53. -rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout
    54. drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..
    55. -rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak
    56. -rw------- 1 user1 user1 308 Jun 7 12:21 .bash_history
    57. -rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile
    58. drwxr-xr-x 2 user1 user1 4096 Jun 7 12:25 .
    59. user1@vm1:~$ cat .bash_history
    60. ls -al
    61. cat .profile
    62. echo Hello, $LOGNAME!
    63. cp -v .profile .profile.bak
    64. echo 'echo Hello, $LOGNAME!' >> .profile
    65. tail -n 5 .profile
    66. history -w
    67. ls -altr
    68. user1@vm1:~$ exit
    69. logout

    不要害怕,所有命令都会解释。行号对应“现在输入它”的部分。

    解释

    1. 打印当前目录中的所有文件,包括隐藏的文件。选项-al告诉lslong格式打印文件列表,并包括所有文件,包括隐藏文件。.profile.bash_rc是隐藏文件,因为它们以点.开头。以点开头的每个文件都是隐藏的,这很简单。这两个特殊文件是 shell 脚本,它们包含登录时执行的指令。

    2. 打印出你的.profile文件。只是这样。

    3. 告诉你的 shell,你这里是 bash,输出一个字符串Hello, $LOGNAME!,用环境变量`$LOGNAME替换$LOGNAME`,它包含你的登录名。

    4. .profile文件复制到.profile.bak。选项-vcp详细输出,这意味着它会打印所有的操作。记住这个选项,它通常用于让命令给你提供比默认更多的信息。

    5. .bash_rc配置文件中添加一行。从现在开始,每次登录到vm1时, 都将执行该命令。注意,>>代表向文件添加了一些东西,但>意味着使用一些东西来替换文件。如果你不小心替换了.profile而不是向它添加,则命令

      1. cp -v .profile.bak .profile

      会向你返回旧的.profile文件。

    6. .profile文件中精确打印出最后 5 行。

    7. 将所有命令历史写入.bash_history文件。通常这是在会话结束时完成的,当你通过键入exit或按<CTRL> + D关闭它。

    8. 打印当前目录中的文件。选项-tr表示文件列表按时间反向排序。这意味着最近创建和修改的文件最后打印。注意你现在有两个新的文件。

    9. 打印出保存命令历史记录的文件。注意你所有的输入都在这里。

    10. 关闭会话

    附加题

    • 在线搜索为什么ls -al告诉你“总共 20”,但是只有 5 个文件存在。 这是什么意思? 请注意,...是特殊文件条目,分别对应于当前目录和父目录的。

    • 登录vm1并键入man -K /etc/profile,现在使用光标键滚动到INVOCATION部分并阅读它。 要退出man,请键入q。 键入man man来找出man -K选项的含义。

    • 在命令之前键入uname与空格。 现在,键入history。 看到了吗?如果你将空格放到命令前面,则不会将其保存在历史记录中!提示:当你需要在命令行上指定密码时,很实用。

    • 找到 bash 的 wiki 页面,并尝试阅读它。不用担心,如果它吓到你,只需要省略可怕的部分。