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

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

简单询问:我刚刚意识到我从未见过舍邦.bashrc脚本之上,这让我认为系统在登录时使用默认 shell 来获取它 ( ${SHELL})。我正在思考为什么会出现这种情况,即使用默认 shell 之外的其他东西来运行登录脚本是否被认为是一个坏习惯。

答案1

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

  • 交互的
  • 登录

召唤bash 手册页的相关部分是相关的。

A登录外壳参数零的第一个字符是 a -,或者以选项开头--login

一个交互的shell 是一种没有非选项参数且没有-c选项的启动方式,其标准输入和错误都连接到终端(由 确定)isatty(3)),或者是使用该选项启动的-i 。 PS1 已设置并 $-包括iifbash是交互式的,允许 shell 脚本或启动文件来测试此状态。

以下段落描述了如何bash执行其启动文件。如果任何文件存在但无法读取,bash 会报告错误。波形符在文件名中扩展,如下所述 波形符扩展在里面扩张 部分。

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

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

交互的启动非登录 shell 的 shell,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 --无配置文件

    $ 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. Bourne Again SHell 的优点。该部分下的各个小节,“1.2.2.1.调用”通过“1.2.2.3.3.交互式 shell 行为”解释您可以调用的各种方法之间的低级差异bash

答案2

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

此类脚本旨在进行编辑,因为它们通常会执行诸如更改环境变量(例如)之source类的操作,这些变量预计在脚本完成后会持续存在。$PATH因此,尝试在子 shell 中执行它确实毫无意义。

答案3

除了其他回复之外,请注意,如果您愿意,没有什么可以禁止您在这些配置文件的开头放置 shebang。

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

这可能有助于使用语法突出显示的编辑者找出文件中使用的编程语言。

请注意,有些编辑器喜欢vim提供替代方法,例如后者的模型行。即您始终可以将模式行放在 的末尾,~/.bashrc如下~/.bash_profile所示:

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

答案4

我在任何地方读过这篇文章,不知道具体在哪里,但这是真的

Bash 手册在这方面有点令人困惑,但 Bash 并不像 shell 脚本那样执行 ~/.bash_profile。它确实读取文件,然后执行其中的命令(您可以通过运行 source ~/.bash_profile 执行类似的操作)。

相关内容