笨办法学 Linux Bash:Shell、`.profile`、`.bashrc`、`.bash_history`

Bash:Shell、.profile、.bashrc、.bash_history。

当使用 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: ls -al
 2: cat .profile
 3: echo Hello, $LOGNAME!
 4: cp -v .profile .profile.bak
 5: echo 'echo Hello, $LOGNAME!' >> .profile
 6: tail -n 5 .profile
 7: history -w
 8: ls -altr
 9: cat .bash_history
10: exit

你会看到什么

user1@vm1's password:
Linux vm1 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jun  7 12:03:29 2012 from sis.site
Hello, user1!
user1@vm1:~$ ls -al
total 20
drwxr-xr-x 2 user1 user1 4096 Jun  7 12:18 .
drwxr-xr-x 3 root  root  4096 Jun  6 21:49 ..
-rw-r--r-- 1 user1 user1  220 Jun  6 21:48 .bash_logout
-rw-r--r-- 1 user1 user1 3184 Jun  6 21:48 .bashrc
-rw-r--r-- 1 user1 user1  697 Jun  7 12:04 .profile
user1@vm1:~$ cat .profile
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
echo Hello, $LOGNAME!
user1@vm1:~$ echo Hello, $LOGNAME!
Hello, user1!
user1@vm1:~$ cp -v .profile .profile.bak
`.profile' -> `.profile.bak'
user1@vm1:~$ echo 'echo Hello, $LOGNAME!' >> .profile
user1@vm1:~$ tail -n 5 .profile
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
echo Hello, $LOGNAME!
user1@vm1:~$ history -w
user1@vm1:~$ ls -altr
total 28
-rw-r--r-- 1 user1 user1 3184 Jun  6 21:48 .bashrc
-rw-r--r-- 1 user1 user1  220 Jun  6 21:48 .bash_logout
drwxr-xr-x 3 root  root  4096 Jun  6 21:49 ..
-rw-r--r-- 1 user1 user1  741 Jun  7 12:19 .profile.bak
-rw------- 1 user1 user1  308 Jun  7 12:21 .bash_history
-rw-r--r-- 1 user1 user1  697 Jun  7 12:25 .profile
drwxr-xr-x 2 user1 user1 4096 Jun  7 12:25 .
user1@vm1:~$ cat .bash_history
ls -al
cat .profile
echo Hello, $LOGNAME!
cp -v .profile .profile.bak
echo 'echo Hello, $LOGNAME!' >> .profile
tail -n 5 .profile
history -w
ls -altr
user1@vm1:~$ exit
logout

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

解释

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

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

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

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

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

    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 页面,并尝试阅读它。不用担心,如果它吓到你,只需要省略可怕的部分。

Image placeholder
leo2n
未设置
  0人点赞

没有讨论,发表一下自己的看法吧

推荐文章
笨办法学 Linux 初识less

#文本浏览器,少即是多 现在你可以编辑文本文件,这很好。但是如果你只想查看一个文本文件呢?当然,你可以使用vim,但很多时候它是过度的。还有两件事要考虑: 如果你想查看非常大的文件,你将需要在尽可能快

笨办法学 Linux 学习文本编辑器--vim

Linux学习文本编辑器--vim 在Linux中,就像任何类Unix操作系统,一切都只是文件。而Unix哲学指出,配置文件必须是人类可读和可编辑的。在几乎所有的情况下,它们只是纯文本。所以,首先,你

笨办法学 Linux 学习处理文件,`pwd`,`ls`,`cp`,`mv`,`rm`,`touch`

Bash:处理文件,pwd,ls,cp,mv,rm,touch 在Linux中,一切都是文件。但是什么是文件?现在完全可以说,它是一个包含一些信息的对象。它通常定义如下: 计算机文件是用于存储信息的

笨办法 学Linux 安装Linux

Linux学习起步 Windows,VirtualBox虚拟机(.ova格式的预配置映像) 学习Linux你需要什么 VitualBox,虚拟机播放器。 putty,终端模拟器。 预配置的Virtua

Java 程序员眼中的 Linux_1.0.Linux 介绍

Linux介绍 Linux这个名字 Linux的Wiki介绍:http://zh.wikipedia.org/zh/Linux Linux也称:GNU/Linux,而其中GNU的全称又是:Gnu’sN

[Java 程序员眼中的 Linux] Linux 下常用压缩文件的解压、压缩

Linux下常用压缩文件的解压、压缩 常用压缩包解压命令整理 Linux后缀为.tar.gz格式的文件-解压 命令:tarzxvfXXXXXX.tar.gz Linux后缀为.bz2格式的文件-解压

Linux/Unix 基础:什么是 Linux?

简单来讲,Linux是一个操作系统(OS)。我们都很熟悉其他操作系统,就像Microsoftwindows,AppleMacOS,iOS,Googleandroid,等等这些,linux就像它们一样,

Linux/Unix 基础:Linux 的历史

Linux的诞生 在1991年,来自芬兰Helsinki大学的学生LinusTorvalds认为市场上应该有一个比较统一的Unix版本,从此他就开始为这个项目奋斗。后来这个项目就成为了Linux操作系

别小瞧了 Linux,安卓、华为的自研系统,均源自 Linux!

众所周知,目前国内已有众多的国产系统,基本上均源自linux,以linux为基础进行二次开发。比如红旗linux、深度等等。但不知道为什么,一说起某系统是基于linux而来,很多网友就瞧不起,并且会觉

Linux Shell 脚本快速入门

shell脚本是在一个文件中写入一起执行的命令集。对于使用像dos操作系统的DOS,windows操作系统的bat,linux操作系统的files的人来说,这几乎都是相同的概念。你只需要把一串命令写

Linux Shell 脚本快速入门

shell脚本是在一个文件中写入一起执行的命令集。对于使用像dos操作系统的DOS,windows操作系统的bat,linux操作系统的files的人来说,这几乎都是相同的概念。你只需要把一串命令写入

leveldb源代码分析系列1.2:skiplist实现

skiplist的实现介绍leveldb中的SkipList是一个模板类,其模板参数的类型分别是存储的Key类型和Comparator类型。虽然名字是Key类型,但其实存储了整个entry,只不过Co

聊聊chronos的pullFromDefaultCFAndPush

序本文主要研究一下chronos的pullFromDefaultCFAndPushpullFromDefaultCFAndPushDDMQ/carrera-chronos/src/main/java/

Shell 和 Shell 脚本

ShellShell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访

即使站在风口也未必能飞:SaaS公司生存指南

Salesforce市值突破1000亿美元,Slack的估值超过70亿美元,这似乎让人觉得SaaS成为风口,任何人只要站在这个风口上,就能获得成功,虽然这么说并不能说不对,尤其是在风险投资盛行的美

即使站在风口也未必能飞:SaaS公司生存指南

Salesforce市值突破1000亿美元,Slack的估值超过70亿美元,这似乎让人觉得SaaS成为风口,任何人只要站在这个风口上,就能获得成功,虽然这么说并不能说不对,尤其是在风险投资盛行的美国。

聊聊chronos的DeleteBgWorker

序本文主要研究一下chronos的DeleteBgWorkerDeleteBgWorkerDDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chron

Spring-SpringAOP原理,手写Spring事务框架

一、Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopm

Java教程_在 Nashron 中使用 Backbone.js

这个例子展示了如何在Java8的NashronJavaScript引擎中使用Backbone.js模型。Nashron在2014年三月首次作为JavaSE8的一部分发布,并通过以原生方式在JVM上运行

由Linux内核bug引起SSH登录缓慢问题的排查与解决

今年7月,有一位用户反馈,使用该镜像创建出的快杰云主机每次启动时,第一次SSH登录会很慢,有时候需几十秒甚至几分钟才能登录成功,影响了使用体验。经过排查,定位到是Linux内核随机数熵池初始化慢的原因

jquery怎么获取a标签href的值?

jquery怎么获取a标签href的值?href是a标签的一个属性,获取属性的值,在jquery中使用attr()方法。获取a标签的href属性就是$('a').attr('href')语法:$(se

The Annual Summary Of 2019

Timeisflying,itarrivesattheendofyearagain.ThisismyfirstyearworkinginPinDuoDuoincanditseemsIarriveint

有了这8个Chrome扩展工具,Web开发事半功倍!

Chrome浏览器扩展程序,无论对开发人员还是设计人员来说,都是非常有用的,有些扩展程序会对开发工具的某类功能进行增强,也有一些会复制开发工具中的部分特性。从某种意义上来说,Chrome商店中的每个扩

死磕Synchronized底层实现,面试你还怕什么?

关于 synchronized 的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说

如何使用Vue构建Chrome扩展程序

浏览器扩展程序是可以修改和增强Web浏览器功能的小程序。它们可用于各种任务,例如阻止广告,管理密码,组织标签,改变网页的外观和行为等等。好消息是浏览器扩展并不难写。可以用你已经熟悉的Web技术(HTM