.bashrc 不导出路径?

.bashrc 不导出路径?

每次登录我们公司集群时,我都会先获取Kerberos票证,然后尝试提交作业,但找不到spark-ubmit:

-bash-4.1$ ./pipeline.runtime/scripts/vpspark-submit.sh crow-env/ /user/gsamaras/crow_spm-1.0.2.3.tar.gz --properties-file $SPARK_CONF_PROPERTIES --num-executors 1 foo.py 
./pipeline.runtime/scripts/vpspark-submit.sh: line 51: spark-submit: command not found

但是,如果我获取 .bashrc,它就可以正常工作。

>> cat .bashrc
[ -f /etc/bashrc ] && . /etc/bashrc
export PATH=${SPARK_HOME}/bin:$PATH
export SPARK_CONF_DIR=~/tripodrt-spark/conf/
export SPARK_CONF_PROPERTIES=~/tripodrt-spark/conf/spark-overrides-tt.conf

为什么?我希望 .bashrc 在登录时运行。我使用的是红帽企业 Linux。

答案1

bash手册中:

当启动非登录 shell 的交互式 shell 时,bash 从 读取并执行命令~/.bashrc(如果该文件存在)。

所以如果你的shell是登录shell,~/.bashrc则不会被读取。

我会添加一些内容来PATH代替~/.bash_profile,和/或可能~/.bashrc从那里获取。

某些 shell 会区分两种或三种类型的 shell 初始化文件:

  1. A轮廓登录 shell 读取的文件。
  2. 由交互式 shell 读取的文件。
  3. 并且可能是由非交互式 shell(即脚本)读取的文件。

为了bash

  1. ~/.bash_profile
  2. ~/.bashrc
  3. 无论文件$BASH_ENV指向什么。

分离点轮廓交互式 shell 读取的脚本中的启动脚本可以让您一劳永逸地为所有未来的 shell 会话执行(可能很繁重)设置任务。这通常涉及至少设置PATH以及任何其他导出的变量(即环境变量)。

然后,交互式 shell 初始化脚本(~/.bashrc在 的情况下bash)只需要执行交互式 shell 特别需要的操作。这包括设置PS1不应导出的 shell 变量,以及定义别名和函数等。您还应该设置需要为此会话以及从此会话启动的进程设置的环境变量,例如GPG_TTY( GPG_TTY="$(tty)") 如果您'正在使用 GnuPG。

我倾向于source $HOME/.bashrc按照我想要的方式~/.bash_profile设置PATH和调整我的设置,然后设置历史文件变量、提示符和umask~/.bashrcPS1PAGEREDITOR别名和函数等等。 (这半是谎言;我实际上 exec如果我能找到我的个人资料中的shell ksh93,但如果找不到,我会继续bash)。我也雷尼采我的 shell 位于交互式 shell 初始化文件中(带有renice -n 4 $$),因为我经常在共享计算机上工作,其中有很多比我更需要 CPU 的人(但只有我)。

外壳ksh93使用

  1. ~/.profile
  2. ~.kshrc(或任何$ENV指向)

ksh93bash它知道存在交互式登录 shell 之类的东西要理智$ENV一些,因此在读取~/.profile.

shellpdksh还读取~/.kshrc非交互式 shell,这让我很恼火(并且破坏了我使用的一些重要脚本),所以我有

case $- in
    *i*)    ;;
    *)      return      ;;
esac

在我的文件顶部~/.kshrc

相关内容