#!/bin/bash --login vs #!/bin/bash

4

我在寻找运行Appium与Jenkins的脚本时,阅读到以下内容:

#!/bin/bash --login

killall -9 "iPhone Simulator" &> /dev/null
killall -9 node &> /dev/null
killall -9 instruments &> /dev/null
...

我不明白为什么脚本的第一行需要在这里传递--login选项。我已经阅读了帮助文档,但仍有些困惑。

从帮助文档中我得到的是,传递--login参数可以使脚本被称为登录shell而不是交互式shell交互式shell是用户可以与之交互的shell,例如通过键盘输入内容。但是登录shell是什么?根据man页,它会加载~/.bash_profile文件。但是如果我通过Mac OSX的Terminal.app打开终端,它也会加载~/.bash_profile文件,我也能够与shell进行交互,对吗?那么,我打开的shell既是登录shell又是交互式shell

是的,一个 shell 可以同时是“登录”和“交互”shell。但是,.bash_profile 被读取并不一定意味着这一点。大多数人不理解 shell 初始化过程的工作方式,因此将一个 init 文件集合中的链接与另一个集合中的链接相连,以便无论是什么类型的 shell,所有东西都被加载(这是许多发行版的默认配置)。 - Etan Reisner
我会向供应商提出支持问题。我看不到使用此脚本进行此操作的好理由。任何所需的内容都应该被导出或明确设置。依赖用户在第三方产品中的启动文件是在寻找麻烦,并且是一种不必要的负担。我怀疑这是无意的。 - cdarke
1个回答

4
主要区别在于登录 Shell 在启动时执行您的个人资料。来自手册页面:
当 bash 作为交互式登录 Shell 或使用 --login 选项作为非交互式 Shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。在读取该文件后,它按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取和执行命令。可以在启动 Shell 时使用 --noprofile 选项来禁止此行为。
当登录 Shell 退出时,bash 会从文件 ~/.bash_logout 中读取并执行命令(如果该文件存在)。

1
所以 login shell 就是先加载 /.bash_profile、/.bash_login 和 ~/.profile,然后再执行你的脚本,对吗? - bufferoverflow76
1
脚本可能使用该选项,以便获取您在个人资料中设置的诸如“PATH”之类的设置。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接