zoukankan      html  css  js  c++  java
  • 关于login/interactive/no-interactive shell和profile/bash_profile/bashrc

    login shell:第一次登录进系统时的shell,一般是指本机启动时的控制台shell或者ssh远程登录时的shell。

    interactive shell:登录以后,再打开控制台时运行的shell。

    none interactive shell:只是用来执行脚本的shell,执行完就结束进程了,没有用户交互过程。

    mac有个特殊地方:每次打开一个终端都是一个login shell。

    检测当前shell是哪种的方法:

    To check if you are in an interactive shell:

    [[ $-==*i*]]&& echo 'Interactive'|| echo 'Not interactive'

    To check if you are in a login shell:

    shopt -q login_shell && echo 'Login shell'|| echo 'Not login shell'

    有了这个区分,然后就有了对各种profile/rc文件的执行时机的准则:(通过man bash得知)

    1、对于(必然为交互式的)login shell:首先执行 /etc/profile;然后在~/.bash_profile, ~/.bash_login, ~/.profile中查找第一个存在的执行。(对于非交互式shell如果带--login选项也对应此情况)

    2、对于交互式非login shell:先后执行 /etc/bash.bashrc 和 ~/.bashrc,注意是都会执行,只要它们存在。(这种默认设置可以用--norc和--rcfile选项来改变)

    3、对于非交互式shell:执行环境变量BASH_ENV对应的文件。

    结合以上知识,一般的启动脚本配置是:环境变量定义放在.bash_profile里,其它代码放在.bashrc里,然后在.bash_profile里source .bashrc。

    解释:

    linux:首次登录执行.bash_profile,其内执行.bashrc,所有代码都运行到。以后每次打开终端虽然只执行.bashrc,但环境变量自动继承父进程的仍然可以得到。

    mac:每次都是执行.bash_profile,其内执行.bashrc,所有代码都运行到。

    其它问题:

    1、在bashrc里不应该放echo之类产生输出的代码,否则会导致rsync失败。

  • 相关阅读:
    【CF1416D】Graph and Queries(虚点)
    【CF1120D】Power Tree(建图,差分,最小生成树)
    AtCoder Regular Contest 121
    [2021.5] 我要交作业!
    [校内训练2021_03_03]C
    [校内训练2021_03_02]C
    [经验与教训2021_03_01-2021_03_05]
    [校内训练2021_02_24]B,代数数的和仍然是代数数
    [校内训练2021_02_25]C
    [经验与教训2021_02_19-2021_02_26]
  • 原文地址:https://www.cnblogs.com/wellbye/p/3738024.html
Copyright © 2011-2022 走看看