为什么在.bashrc / .bash_profile中没有shebang?


22

简单的查询:我刚刚意识到我从未见过脚本顶部的shebang.bashrc,这使我认为系统在登录(${SHELL})时使用默认的shell来提供源代码。我正在考虑这种情况的原因,即使用默认外壳程序以外的其他内容来运行登录脚本是否被视为一种坏习惯。


1
有一个原因叫它bash rc ...
Ajedi32

Answers:


28

.bashrc.bash_profile不是脚本。它们是每次使用bash以下两种方式之一获取的配置文件:

  • 互动
  • 登录

bash手册页的INVOCATION部分是相关的。

一个登录shell是一个其参数零的第一个字符是一个-,或者启动时的--login选项。

一个交互式壳是一个启动时没有非选项参数,并且没有将-c其标准输入和错误都被连接到终端(如通过选项isatty(3)),或开始与一个-i 选项。PS1被设置并且 $-包括i如果bash是交互式的,允许外壳脚本或用于测试此状态的启动文件。

以下段落描述了如何bash执行其启动文件。如果存在任何文件但无法读取,则bash报告错误。如下所述波浪线在文件名扩展 波浪线扩展扩展 部分。

当bash作为交互式登录shell或带有--login选项的非交互式shell 被调用时,它首先从文件/etc/profile(如果该文件存在)中读取并执行命令 。读取文件后,它会查找~/.bash_profile~/.bash_login以及 ~/.profile以该顺序,并读取并从存在并且可读的第一个执行命令。--noprofile启动外壳程序以禁止此行为时,可以使用该 选项。

当退出登录shell时,bash从文件中读取并执行命令~/.bash_logout(如果存在)。

启动不是登录外壳程序的交互式外壳程序时,bash会从中读取并执行命令~/.bashrc,如果该文件存在的话。使用--norc选项可以禁止这种情况。该--rcfile file 选项将强制bash从文件而不是从文件读取并执行命令~/.bashrc

您可以通过命令行开关--norc和来控制何时加载它们--noprofile。您还可以使用--rcfile开关覆盖它们加载的位置。

正如其他人提到的那样,您可以模拟通过使用source <file>命令或使用命令如何加载这些文件. <file>

最好考虑以下功能:

  1. bash在裸露的环境下启动
  2. bash然后打开这些文件之一(取决于如何以交互或登录方式调用它,然后...
  3. ...一行一行地执行文件中的每个命令...
  4. 完成后以提示的形式进行控制,等待输入

调用方法

该主题似乎bash有时会出现,因此这里是一些各种调用方法及其结果的摘要。注意:为了帮助我添加了消息“ sourced $ HOME / .bashrc”和“ sourced” $ HOME / .bash_profile”到各自的文件。

基本电话

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
    
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  3. bash -il-或-bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  4. bash -c“ ..cmd ..”

    $ bash -c 'echo hi'
    hi
    

    注意:请注意,该-c开关未提供任何文件!

禁止读取配置文件

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
    
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
    
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i-或-bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

更深奥的bash调用方式

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

这些失败了

  1. bash -i -rcfile〜/ .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

可能还有更多,但希望您能明白。

还有什么?

最后,如果您对这个主题非常感兴趣,以至于想阅读/探索更多,我强烈建议您阅读《 Bash入门指南》,特别是1.2伯恩再次壳的优势。在该小节下的各个小节中,从“ 1.2.2.1。调用”“ 1.2.2.3.3。交互式shell行为”解释了可以调用的各种方法之间的低级差异bash


@两栖动物-对不起,它有点失控,希望人们会欣赏它的价值,而不是用低票来惩罚它。有了这里,我们现在可以在以后的其他答案中引用它。8)。我当时正在考虑制作一张桌子来展示这个,但是那真是太疯狂了 8-)。
slm

实际测试过这些吗?我曾经尝试遵循我的bash的挤压操作,但它的行为与手册中所建议的
完全不符

@Bananguin-这些命令中的每个命令都是由我运行的,这是在命令下方产生的输出。我的设置中唯一可能出现的“问题”可能是,我.bash_profile包括了一条源代码.bashrc。但我认为这是非常典型的设置。
slm

这可能是主观的,但我不会说,.bashrc.bash_profile不是脚本。恕我直言,它们是特定目的的脚本,在bash初始化期间隐式地来源,或者在您需要应用其修改时显式地来源。它们不只是按照配置文件中的预期配置bash环境(变量,函数,别名...)。他们可以执行常见脚本中的任何操作。例如,他们可以启动各种操作,例如后台任务,编写日志记录,初始化某些程序等。无论如何,感谢您提供详细的摘要!
pabouk

这个答案甚至比这里的任何答案都更好stackoverflow.com/questions/415403/…
雅各布·汤姆林森

13

.bashrc脚本只能bash自己运行。它们不是独立式的,也不打算被exec系统使用。(实际上,它们通常没有标记为可执行文件,并且正如您所说,它们没有shebang行。)

此类脚本旨在作为sourced,因为它们通常会执行诸如更改环境变量之类的操作($PATH例如),这些环境变量有望在脚本完成后继续存在。因此,尝试在子shell中执行一个将毫无意义。


5

除了其他答复外,请注意,如果需要,也不能禁止在这些配置文件的开头放上空格。

这不会损害shell采购它们,因为shebang的处理将像常规注释一样,即被忽略。

这可能会帮助使用语法突出显示的编辑器找出文件中使用的编程语言。

请注意,有些编辑器vim提供了替代方式,例如为后者提供模式行。也就是说,你可以随时把模式在线条的结束~/.bashrc~/.bash_profile像这样:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
上面@slm可接受的答案很好,但这是我一直在寻找的东西,关于.bash_profile在ShellCheck的推荐下在我的开头添加一个Shebang。
jlucktay

1

我在任何地方都读不知道确切的地方,但这是真的

Bash手册在这方面有些混乱,但是Bash并不像shell脚本那样执行〜/ .bash_profile。它会读取文件,然后执行其中的命令(您可以通过运行source〜/ .bash_profile来执行类似的操作)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.