qua*_*ela 5 bash login .profile environment-variables
当我重新启动 Ubuntu 14.04 时,环境变量被设置回默认值,我source .bash_profile每次都必须运行,这很烦人。我通常将我的环境变量保存.bash_profile在主目录中,该目录位于/home/buraktas. 这是文件的文本:
### export JAVA_HOME variable
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$JAVA_HOME/bin
### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin
### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何形式的回应。
TL;DR:将您的export命令放入其中.profile,删除或重命名.bash_profile,然后注销并重新登录以应用您的更改。
默认情况下,大多数桌面环境都经过配置,以便.profile在您以图形方式登录时获取主目录中的文件。听起来您正在使用 Ubuntu 的默认桌面环境,即 GNOME with Unity。那应该有效。
当作为登录 shell调用时,大多数Bourne 风格的 shell也会使用 source 。这包括 bash,但仅当且不存在时才会获取 bash 。如果存在则使用;否则,如果存在,将使用它;否则,将被使用。.profile.profile.bash_profile.bash_login.bash_profile.bash_login.profile
这样做的原因是,您想要在登录时运行的不依赖于 bash shell 的命令可以进入 ,.profile如果有特定于 bash 的命令,您可以将它们放入其他两个命令之一文件。.profile通常您会从内部.bash_profile或进行采购.bash_login。
如果其中唯一的命令.bash_profile是您在问题中显示的命令,那么您根本不需要使用,.bash_profile因为这些命令可以跨 Bourne 风格的 shell 移植。然后您可以删除.bash_profile(或将其重命名为类似的名称.bash_profile.old)并将这些命令放入.profile. 它们可以位于该文件的最底部,如果您愿意,您可以先备份它(备份的合理名称可能是.profile.old或.profile.orig,但您可以将备份命名为任何您想要的名称,因为它实际上并未被使用)。
缺少.bash_profile--provided.bash_login也不存在 -- 将导致.profile被使用。(.profile可能已经用于您的图形登录。)
删除或重命名.bash_profile.
编辑.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
Run Code Online (Sandbox Code Playgroud)
您只需将全部十一行代码(如果不计算空行和注释,则为六行)添加到 的底部.profile,保存文件,然后注销并重新登录。
尽管这完全是可选的,但您可能想借此机会重构您的export语句。目前您使用:
### export JAVA_HOME variable
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$JAVA_HOME/bin
### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin
### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin
Run Code Online (Sandbox Code Playgroud)
PATH修改三次,每次为每个其他变量分配一次。这没关系,可能就是您想要的。但它比这个替代方案更长并且(在我看来)更少自我记录:
# export Java, Maven, and Scala homes and add their bins to PATH
export JAVA_HOME=/usr/local/dev/jdk1.8.0_20
export M2_HOME=/usr/local/dev/maven
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin:$SCALA_HOME/bin
Run Code Online (Sandbox Code Playgroud)
.bash_profile其他东西(但您可能不需要)我应该指出,我所推荐的内容与c0rp之前所说的非常相似(在对已被删除的帖子的评论中):
将所有变量放入
~/.profile,并~/.profile从 中获取~/.bash_profile。~/.profile在启动过程桌面会话期间由 DisplayManager 自动执行,并且在从文本控制台登录时由登录 shell自动执行。
但我的建议在一个重要方面有所不同:因为在我看来,您根本不需要文件.bash_profile,所以我建议您将其移开(即删除或重命名),而不必费心将其采购到.profile。
如果您出于某种原因确实需要一个.bash_profile文件,那么您仍然应该避免在其中包含环境变量定义(因为它们仅适用于bash登录,而不适用于图形登录)。
如果您有必须放入.bash_profile文件中的 bash 特定命令,那么正如 c0rp 所说,您可以将此行放入.bash_profile文件中:
. $HOME/.profile
Run Code Online (Sandbox Code Playgroud)
然后将运行 bash 和非 bash 登录的.bash_profilesource.profile和命令。.profile
.profile不起作用然后需要进行更多故障排除,但值得注意的是:
我听人们说 LightDM 没有源码.profile,我认为这是真的,至少因为它被封装在某些操作系统中。我不能绝对地谈论这个问题,但是在我使用 LightDM 作为显示管理器的 Ubuntu 系统中,.profile 已经在图形会话中获取了源,并且变量导出是.profile有效的。
(它在其他操作系统上并不总是对我有用,例如 Debian。)
.profile不起作用:一个快速而肮脏的替代方案如果您愿意在变量定义中保留一些冗余,则可以将其用作.pam_environment快速替代方案。
man pam_env解释说可以KEY=VAL在 envfiles 中将环境变量定义为一对。正如该手册页所解释的,默认的系统范围环境文件是/etc/environment,默认的每用户环境文件是~/.pam_environment。
因此,您可以在主目录中创建一个.pam_environment文件并在其中放入类似以下内容:
JAVA_HOME="/usr/local/dev/jdk1.8.0_20"
M2_HOME="/usr/local/dev/maven"
SCALA_HOME="/usr/local/dev/scala-2.11.2"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/dev/jdk1.8.0_20/bin:/usr/local/dev/maven/bin:/usr/local/dev/scala-2.11.2/bin"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,更改任何内容都需要您进行多次更改,而且这种高度的重复也使其难以阅读和理解。这就是为什么我首先不推荐这种方式。
.profile根据您的情况,最简单且最自记录的方法是如上所述定义和导出环境变量。
EnvironmentVariables文章声称可以修改环境变量的值,甚至包括其他环境变量的扩展,在 中,使用类似于 的语法。然而,这似乎与(更多)官方文档完全不一致,我在多台机器上尝试过但没有成功,而且我只听说过它在其他机器上也失败了。我强烈怀疑 wiki 作者混淆了 pam_env“envfile”语法和pam_env“conffile”语法(使用 中使用的术语)。希望有一天有人能抽出时间来确定这一点,然后可以编辑维基(无论是为了纠正还是澄清)。.pam_environmentPATH DEFAULT=${PATH}:${HOME}/MyProgramsman pam_env
.bash_profile在 OS X 中有效OS X 是少数环境/系统之一,其默认图形桌面(即 Terminal.app 实例)上的终端默认配置是将 shell 作为登录 shell 而不是作为非登录 shell 启动。(Cygwin是另一个。)
由于 OS X 上由 Terminal.app 直接启动的每个 bash 实例(除非您重新配置了一些东西)都充当登录 shell,因此.bash_profile会被获取。
我怀疑,在通过 Terminal.app(或非图形登录,例如 SSH 会话)访问的环境之外,.bash_profile也不会应用导出。
OS X 和 Ubuntu 之间的主要区别在于.bash_profile:
在 OS X 中,由 Terminal.app 启动的 shell 作为登录 shell 启动。由于 bash 是 OS X 中的默认交互式 shell(从 OS X 10.3 或其他版本开始),因此.bash_profile如果存在,则对其进行源化。
在 Ubuntu 中,当您从图形会话中运行 GNOME 终端(或另一个 GUI 终端模拟器)时,启动的 shell 通常不是登录 shell。登录 shell 执行的任务通常已经执行过(通常由显示管理器执行)来设置图形会话,因此无需再次执行这些任务。
当没有执行任何类似于登录的操作时启动登录 shell 也有点奇怪。
| 归档时间: |
|
| 查看次数: |
13721 次 |
| 最近记录: |