重击详细发布

如果您在搜索中找到该页面,则可能是试图解决运行bash的问题。

您的环境bash可能没有设置环境变量,并且您不明白为什么。 您可能已经将某些内容随机塞入了各种bash引导文件或配置文件中,或随机塞入了所有文件中,直到它起作用为止。

无论如何,本文的重点是尽可能简单地概述bash的启动过程,以便您处理问题。

图表


此流程图总结了启动bash时的所有过程。



现在,让我们仔细看看每个部分。

登录Shell?


首先,您需要选择是否在登录外壳中。

登录外壳程序是您登录交互式会话时输入的第一个外壳程序。 登录外壳不需要用户名和密码。 您可以通过在调用bash时添加--login标志来强制启动登录shell,例如:

  bash-登录 

首次运行bash shell时,登录shell将配置基本环境。

互动的?


然后,确定外壳是否是交互式的。

这可以通过PS1变量的存在来检查(它设置了命令输入功能):

 如果[“ $ {PS1-}”]; 然后
  回声互动
别的
  回声非交互式
科幻 

或者查看是否在bash中使用特殊的连字符变量设置了-i选项,例如:

  $ echo $- 

如果输出中有一个i ,则说明该外壳是交互式的。

在登录shell中?


如果您位于登录shell中,则bash将查找/etc/profile文件并运行(如果存在)。

然后,它按以下顺序搜索这三个文件中的任何一个:

  〜/ .bash_profile
 〜/ .bash_login
 〜/ .profile 

找到一个后,它将启动它并跳过其他的。

在交互式外壳中?


如果您处于没有登录名的交互式外壳程序(非登录外壳程序)中,则假定您已经访问了登录外壳程序,将配置环境并将其继承。

在这种情况下,以下两个文件(如果存在)将按顺序执行:

  /etc/bash.bashrc
 〜/ .bashrc 

没有一个选择?


如果您既不在登录外壳中也不在交互式外壳中,那么您的环境确实是空的。 这会引起很多混乱(请参阅下面的cron作业)。

在这种情况下,bash会查看您环境的BASH_ENV变量并执行此处列出的相应文件。

典型的困难和经验法则


Cron职位


在95%的情况下,由于cron作业无法按预期进行,因此我已经调试了bash的启动。

当我在命令行上运行该任务时,该任务正常运行,但在crontab中启动时失败

两个原因

  • Cron作业不是交互式的。
  • 与命令行脚本不同,cron作业不会继承Shell环境。

您通常不会注意到或关心外壳脚本不是交互式的,因为环境是从交互式外壳继承的。 这意味着所有PATHalias按预期配置。

这就是为什么您通常必须为cron任务设置特定的PATH的原因,如下所示:

  * * * * * PATH = $ {PATH}:/路径/到/ my /程序/文件夹myprogram 

相互调用的脚本


另一个常见的问题是错误地将脚本配置为相互调用。 例如, /etc/profile引用~/.bashrc

通常,这发生在有人尝试修复某种错误而一切似乎都正常的情况下。 不幸的是,当您需要分离这些不同类型的会话时,会出现新的问题。

沙盒Docker映像


为了试验外壳启动,我创建了一个Docker映像,可用于在安全环境中调试外壳启动。

发射:

 $ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash 

Dockerfile在这里

强制登录并模拟登录外壳:

 $ bash --login 

要检查变量BASH_ENV的集合:

 $ env | grep BASH_ENV 

要调试crontab每分钟将执行crontab简单脚本(在/root/ascript ):

 $ crontab -l $ cat /var/log/script.log 

Source: https://habr.com/ru/post/zh-CN452410/


All Articles