草庐IT

/etc/profile和/etc/bashrc、~/.bash_profile和~/.bashrc、.zshrc和.zprofile的区别

a_simple_coder 2023-03-28 原文

简介

默认情况下,您的 Mac 使用 zsh 或 bash 作为登录 Shell 和交互式 Shell 的命令行解释器:

  • bash 是 macOS Mojave 及更低版本中的默认 Shell。
  • zsh 从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。
    与 Bourne Shell (sh) 高度兼容,并且与 bash 基本兼容,但存在一些差别。要进一步了解 zsh 及其全面的命令行完成系统,请在“终端”中输入 man zsh

如何查看自己使用的是哪一个shell

echo $SHELL

查看系统安装了哪些shell

cat /etc/shells

运行中的Bash有两种模式: login shell 和 non-login shell

1、login shell(登录Shell):就是需要输入用户名及密码登录的shell,如开机shell登录、ssh登录、su - username(从root切换到其他用户时无需密码)。
2、non-login shell:无需输入密码,如bash、su username、图形界面打开bash。
bashrc用于交互式non-login shell,而profile用于交互式login shell。系统中存在许多bashrc和profile文件

bash Shell

登录Shell

  1. /etc/profile(系统级(全局)配置文件):此文件为系统的所有登录用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。
  2. ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的
    .bashrc文件。
    此文件类似于/etc/profile,也是需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile 只对当前用户生效!
  3. ~/.profile:(针对个人)若bash是以login方式执行时,读取~/.bash_profile,若它不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile。另外,图形模式登录时,此文件将被读取,即使存在~/.bash_profile~/.bash_login
    ~/.zshrc:无论登录和非登录用户都可以读取

非登录Shell

  1. /etc/bashrc(系统级(全局)配置文件):为每一个运行bash shell的用户执行此文件, 当bash shell被打开时或在用户主目录下找不到.bashrc时,就会读取这该文件。
  2. ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)。
    此文件类似于/etc/bashrc,不需要重启生效,重新打开一个bash即可生效, /etc/bashrc对所有用户新打开的bash都生效,但~/.bashrc只对当前用户新打开的bash生效。但一般 来说都会在~/.bash_profile里调用~/.bashrc脚本以便统一配置用户环境。
    ~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
  3. ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。
  4. ~/.bash_history:是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。alias l = ‘ls -l’是设置别名的语句,把它放在这些配置文档中就可使我们能用简单的’l’命令,代替’ls -l’命令。

另外:不要轻易修改 /etc/environment 文件。


zsh Shell

从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。

~/.zprofile 的作用与 ~/.bash_profile 相同,并且在登录时运行(包括通过 SSH 运行)
~/.zshrc 的作用与 ~/.bashrc 相同,并针对每个新的“终端”会话运行

  • 说明: 如何切换到 zsh 描述文件和提示符
    如果您正在使用 bash 描述文件(例如,为了设置环境变量、别名或路径变量),则您应改为使用作用与它相同的 zsh 描述文件。

1、如何更改默认 Shell

无论您的用户帐户是配置为使用 zsh(推荐)、bash 还是其他 Shell,您都可以从“用户与群组”偏好设置或命令行中更改默认 Shell。

  • 从“用户与群组”偏好设置中更改
    选取苹果菜单  >“系统偏好设置”,然后点按“用户与群组”。
    点按锁形图标 ,然后输入您的帐户名称和密码。
    在左侧的用户列表中,按住 Control 键点按您的用户名,然后选取“高级选项”。
    从“登录 Shell”菜单中选取一个 Shell,然后点按“好”以存储更改。

  • 从命令行中更改
    在“终端”中,输入 $ chsh -s path,其中的 path 是 /etc/shells 中列出的某个 Shell 路径,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh,比如:$ chsh -s /bin/zsh$ chsh -s /bin/bash

如何在不更改默认 Shell 的情况下使用其他 Shell
如果您不希望“终端”在新的“终端”窗口和标签页中使用默认的登录 Shell,请按照以下步骤操作:
打开“终端”,然后选取“终端”>“偏好设置”。
从“通用”面板中,选择“命令(完整的路径)”。
在提供的栏位中,输入 /etc/shells 中列出的某个 Shell 路径,例如 /bin/zsh、/bin/bash、/bin/csh、/bin/dash、/bin/ksh、/bin/sh 或 /bin/tcsh。

2、在配置文件方面

bash读取的配置文件:

open -e ~/.bash_profile
// vim ~/.bash_profile
// sudo vim ~/.bash_profile

zsh读取的配置文件:

open -e ~/.zshrc
// vim ~/.zshrc
// sudo vim ~/.zshrc

没有电脑不存在,则新建一个配置文件:

touch .bash_profile //在用户(~)目录下
// touch ~/.bash_profile //任何目录下都可以用这个命令

当从bash切换为zsh时,如果不想重新配置一遍.zshrc文件,可以__在.zshrc文件中加上source ~/.bash_profile,从而直接从.bash_profile文件读取配置。

使环境变量生效

source ~/.zprofile

查看变量是否生效

echo $PATH

重启所有终端

macOS下打开的shell是登录式交互shell,登录Shell(不管是不是交互式的)文件加载顺序如下:
/etc/profile
~/.bash_profile(,如果安装了zsh,则.bash_profile 文件中的环境变量就无法起到作用,会加载~/.zprofile,这里面可以配置python环境变量等)
~/.bash_login
~/.profile

下面是几个例子:
首先需要明确的是,读取 ~/.bash_profile,该文件便会去读取~/.bashrc,而~/.bashrc又会去读取/etc/bashrc。所以只要读取~/.bash_profile,便会同时读取~/.bashrc/etc/bashrc

  1. 图形模式登录时,顺序读取:/etc/profile~/.profile

  2. 图形模式登录后,打开终端时,顺序读取:~/.bashrc/etc/bashrc

  3. 文本模式登录时,顺序读取:/etc/profile~/.bash_profile~/.bashrc/etc/bashrc

  4. 从其它用户su到该用户,则分两种情况:

    (1)如果带-l参数(或-参数,--login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/profile~/.bash_profile~/.bashrc/etc/bashrc

    (2)如果没有带-l参数,则bash是non-login的,它将顺序读取:~/.bashrc/etc/bashrc并从父进程继承其环境变量。

  5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout

  6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile,~/.bash_profile,~/.bashrc/etc/bashrc,用sh -l a.sh调用bash,它将会执行/etc/profile以及 ~/.profile。若使用其它方式,如:bash a.sh./a.shsh a.sh,则不会读取上面的任何文件,只能从其父进程处继承环境变量,像alias等就无法继承使用了。

  7. 上面的例子凡是读取到~/.bash_profile的,若该文件不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile

参考:
https://blog.csdn.net/weixin_49539546/article/details/123536394
https://blog.csdn.net/qq_43516969/article/details/107726153?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107726153-blog-85060825.pc_relevant_default&utm_relevant_index=1

有关/etc/profile和/etc/bashrc、~/.bash_profile和~/.bashrc、.zshrc和.zprofile的区别的更多相关文章

  1. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  4. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  5. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  6. ruby - 这两段代码有什么区别? - 2

    打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性

  7. ruby - Ruby 中 .next 和 .succ 的区别 - 2

    Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko

  8. ruby - 在参数为 `yield self` 的方法中使用 `&block` 和在没有参数 `yield self` 的方法中使用 `&block` 有什么区别吗? - 2

    我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti

  9. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  10. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

随机推荐