详细运行 Bash

如果您在搜索中找到此页面,您可能正在尝试解决运行 bash 的某些问题。

也许您的 bash 环境没有设置环境变量,而您不明白为什么。 您可能在各种 bash 启动文件或配置文件或所有文件中随机插入了某些内容,直到它起作用为止。

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

Диаграмма

该流程图总结了运行 bash 时的所有过程。

详细运行 Bash

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

登录外壳?

首先您需要选择是否处于登录 shell 中。

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

bash--登录

当您首次启动 bash shell 时,登录 shell 会设置基本环境。

交互的?

然后确定 shell 是否是交互式的。

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

如果[“${PS1-}”]; then echo 交互式 else echo 非交互式 fi

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

$回声$-

如果输出中有一个符号 i,那么 shell 是交互式的。

在登录外壳中?

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

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

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

当它找到一个时,它会启动它并跳过其他的。

在交互式 shell 中?

如果您处于非登录 shell 中,则假定您已经处于登录 shell 中,环境已配置并将被继承。

在这种情况下,如果存在以下两个文件,则按顺序执行它们:

/etc/bash.bashrc ~/.bashrc

没有选择吗?

如果您不在登录 shell 或交互式 shell 中,那么您的环境确实是空的。 这会导致很多混乱(请参阅下面有关 cron 作业的内容)。

在这种情况下 bash 查看变量 BASH_ENV 您的环境并创建在那里指定的相应文件。

常见困难和经验法则

计划任务

95% 的情况下,我调试 bash 启动都是因为 cron 作业没有按预期运行。

这该死的任务 当我在命令行上运行它时工作正常,但当我在 crontab 中运行它时失败.

这是 两个原因:

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

通常,您不会注意到或关心 shell 脚本不是交互式的,因为环境继承自交互式 shell。 这意味着一切 PATH и alias 按照您的预期配置。

这就是为什么经常需要设置一个特定的 PATH 对于像这样的 cron 任务:

* * * * * PATH=${PATH}:/path/to/my/program/文件夹 myprogram

脚本相互调用

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

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

沙盒 Docker 镜像

为了试验运行 shell,我创建了一个 Docker 映像,可用于在安全环境中调试运行 shell。

发射:

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

Dockerfile 位于 这里.

强制登录并模拟登录 shell:

$ bash --login

测试一组变量 BASH_ENV:

$ env | grep BASH_ENV

用于调试 crontab 一个简单的脚本将每分钟执行一次(在 /root/ascript):

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

来源: habr.com

添加评论