/.bashrc VS-/.profile VS-/.bash_profile

2020-10-25 03:12:52

有时,当我远程登录到一些Linux计算机或使用Docker容器时,我会发现shell是纯黑白的,这与我过去在本地机器上处理的五颜六色的shell不同。这有时会给我查找库、可执行文件和文件夹带来麻烦。有时,某些可执行文件可以直接从本地shell调用,但不能从远程登录shell直接调用。

原来,shell是一个可执行文件,它是由特殊的shell脚本(如~/.bashrc、~/.profile、~/.bash_profile)“配置”的。在这篇博客文章中,我想简要讨论一下这些脚本之间的区别。

我不时修改~/.bashrc文件,因为有时我想设置一些环境变量,包括PATH,它是Linux和其他类似Unix的操作系统中的环境变量,它告诉shell搜索可执行文件的目录。但是几十年来,我一直忽略它最初的注释块。

$cat~/.bashrc#~/.bashrc:由bash(1)针对非登录shell执行。#参见/usr/share/doc/bash/examples/start-files(在bash-doc包中)#了解示例...。

这意味着在本地shell中,如果我们使用bash,此shell脚本将在执行bash后立即执行。还有许多其他的shell可执行变体,比如zsh。~/.bashrc仅特定于bash。

在~/.bashrc中有许多代码使shell看起来五颜六色。例如,。

#启用ls的颜色支持,并添加方便的aliasesif[-x/usr/bin/dircolor];然后测试-r~/.dircolor&;&;eval";$(dircolor-b~/.dircolor)";||eval";$(dircolor-b)";alias ls=';ls--color=auto';#alias dir=';dir-color=auto';#alias vdir=';vdir-color=auto';as grep=';grep-color=auto';#alias vdir=';vdir-color=auto';as grep=';grep-color=auto';#alias vdir=';vdir-color=auto';as grep=';grep-color=auto';别名fgrep=--fgrep--color=auto&39;别名egrep=';egrep--color=auto&39;fi。

来自~/.profile的注释块明确地告诉我们,它将针对登录shell执行。但是,如果存在~/.bash_profile或~/.bash_login,则不会执行~/.profile。

$cat~/.profile#~/.profile:由登录shell的命令解释程序执行。#如果~/.bash_profile或~/.bash_login#存在,此文件不会被bash(1)读取。#有关示例,请参阅/usr/share/doc/bash/examples/start-files。#这些文件位于bash-doc包中。#默认umask设置在/etc/profile中;要设置ssh登录的umask#,请安装并配置libpam-umask包。#umask 022#如果运行bashif[-n";$BASH_VERSION";];如果[-f";$HOME/.bashrc";];则#include.bashrc(如果存在)。";$HOME/.bashrc";FIFI#设置路径,使其包含用户的私有垃圾桶(如果它存在);则path=";$HOME/bin";则path=";$HOME//bin:$path";fi#设置路径,使其包括用户的私有bin(如果它存在)[-d";$HOME/.local/bin";];则path=";$HOME/.local/bin:$path";fi。

~/.profile的默认内容很简单。最有可能的是,它继承~/.bashrc中的所有内容,并将一些特定于用户的可执行文件路径添加到环境变量PATH中。因此,如果~/.bashrc中有使shell看起来五颜六色的命令,那么登录shell也应该看起来五颜六色。

不幸的是,在我的大多数登录试验中,shell从来都不是丰富多彩的,有时环境变量与我的预期不符。这是因为存在~/.bash_profile,因此不会执行~/.profile或~/.bashrc。通常,~/.bash_profile将为空,这意味着我们不会拥有本地shell中的环境和外观。

要使登录shell“恢复正常”,我们可以删除~/.bash_profile,也可以通过添加一些命令来修改~/.bash_profile,例如。

有时,一个非彩色的外壳可能会有帮助。它会告诉您不能在本地shell中工作。它可以是Docker shell,也可以是远程登录shell。知道我们对付的是什么炮弹,我们就不太可能做危险的行动了。例如,在Docker shell中,我们几乎可以做任何事情,比如没有sudo的RM-RF/,而不会损害本地系统。