如果您在搜索中找到此页面,您可能正在尝试解决运行 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