zoukankan      html  css  js  c++  java
  • linux变量

    环境变量对我这种小白来说简直是谜一样的存在,经常莫名其妙import失败,找不到文件等。

     1、变量分类

    按变量的生存周期划分:

    • 永久的:需要修改配置文件,变量永久生效。
    • 临时的:使用export命令声明即可,变量在关闭shell时失效。

    在配置永久的环境变量时,又可以按照作用范围分为

    • 用户环境变量
    • 系统环境变量

    系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效。

    2、login & non-login shell

    Linux系统自举时,内核会创建init进程,来进行一系列的系统初始化操作。每一个用户登录shell时,无论以伪终端登录:ssh,X11下控制台,还是tty控制台终端,都会读取相关相关的登录配置文件。linux 有两种登录shell:login和nologin:

    • login shell:登录shell时需要完整的登录流程,称为 login shell。何为完整:输入用户名和密码。例如:走tty1-tty6控制终端,或走ssh等伪终端远程登入
    • non-login shell:登入shell时不需要输入帐号信息。例如在X11下,打开伪终端,或者在shell下,进入shell子进程。

    在下列情况下,我们可以获得一个login shell:

    1. 登录系统时获得的顶层shell,无论是通过本地终端登录,还是通过网络ssh登录。这种情况下获得的login shell是一个交互式shell。

    2. 在终端下使用--login选项调用bash,可以获得一个交互式login shell。

    3. 在脚本中使用--login选项调用bash(比如在shell脚本第一行做如下指定:#!/bin/bash --login),此时得到一个非交互式的login shell。

    4. 使用"su -"切换到指定用户时,获得此用户的login shell。如果不使用"-",则获得non-login shell。

    这两种登入shell的区别是:在登入shell是,读取的配置文件不同。

    ogin shell(bash)在登入时,会读取的配置文件:

    • /etc/profile,全局配置
    • ~/.bash_profile 或~/.bash_login 或 ~/.profile,个人配置。之所以有三个文件,是因为不同的shell有可能命名不同,只会按顺序读取其中的一个。login shell退出时读取并执行~/.bash_logout中的命令。

    non-login shell(bash)在登入时,只会读取的配置文件:

            交互式的non-login shell启动时读取~/.bashrc资源文件。非交互式的non-login shell不读取上述所有配置文件,而是查找环境变量BASH_ENV,读取并执行BASH_ENV指向的文件中的命令。

            ~/.bashrc。bashrc这个文件有时候不存在,需要自己创建,里面可以进行个性化的定制,不会影响到其他用户。

    3、su&sudo

    在我接触的Linux 发行版中,ubuntu在安装过程中不会提示root密码的设置,只有进入系统后才能在shell下通过passwd来设置root的密码,fedora,centos安装过程中多会要求设置root密码和建立一个常用的用户。可以看出linux的设计者们本身就期望用户以较低的权限来进行平时的操作,这是基于于安全的考虑。

    但在shell环境下,由于各种工作的需要,我们经常需要进行用户权限的切换,最常用的就是获取root用户的权限。最常用的命令有su和sudo。

     
    1. su [-lc] [username]  
    2. - , -l, --login : 表示使用以login shell的方式登录username,若username为空,则默认登录root。  
    3.                   如果没有该参数,则以nonlogin的方式登录  
    4. -c, 仅执行一次命令 ,命令需要用引号括起来  

    这里要强调的就是su 和su -的区别,就是前面撤了一大串的login 和non-login的区别

    sudo命令的存在我觉得有两个原因:

    • 使用su切换到root,需要是所有用户都知道root密码,不安全;
    • 很多时候我们切换到root用户只是需要执行一条语句,尽管su -c可以完成,但每次都要敲个空格-c,而且每次都要输入root密码;

    上面两个原因,就是sudo存在的理由。sudo可以让用户通过验证自己的密码来获得其他用户的权限,只需要root对/etc/sudoers进行相关的配置

    4、设置环境变量

    4.1 export命令

    在shell的命令行下直接使用[export 变量名=变量值] 定义变量。该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

    4.2 修改系统环境变量

    系统环境变量一般保存在下面的文件中

    • /etc/profile

    全局(公有)配置,不管是哪个用户,登录时都会读取该文件。

    处在shell配置文件的最顶端。这是系统shell环境的全局设定,例如PATH,MAIL很多环境变量。对它的修改,会影响到所有用户。

    • /etc/bash.bashrc

    它也是全局(公有)的 bash执行时,不管是何种方式,都会读取此文件。

    • /etc/environment

    不要轻易修改此文件

    4.3 修改用户环境变量

    用户环境变量通常被存储在下面的文件中:

    • ~/.profile

    若bash是以login方式执行时,读取~/.bash_profile,若它不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile。

    • ~/.bash_profile 或者~./bash_login

    若bash是以login方式执行时,读取~/.bash_profile,若它不存,则读取~/.bash_login,若前两者不存在,读取 ~/.profile。 
    只有bash是以login形式执行时,才会读取.bash_profile,Unbutu默认没有此文件,可新建。 通常该配置文件还会配置成去读取~/.bashrc。

    • ~/.bashrc

    处在shell配置文件的最低端。这是针对每个用户shell环境的配置文件,我们的大部分个性化的定制,都可以直接修改在这个文件中。

    当bash是以non-login形式执行时,读取此文件。若是以login形式执行,则不会读取此文件。

    ~/.bash_profile是交互式、login 方式进入 bash 运行的 
    ~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

    通常我们要定制一些配置时,将配置写在~/.bashrc中,然后在~/.bash_profile中读取~/.bashrc,这样可以保证login shell和交互式non-login shell得到相同的配置。至于/etc/profile就不要轻易去改啦,毕竟会影响系统全局的配置。

    5、修改环境变量配置文件

    如想将一个路径加入到环境变量(例如$PATH)中,可以像下面这样做(修改/etc/profile): 
    sudo vi /etc/profile 
    以环境变量PATH为例子,环境变量的声明格式:

    PATH=$PATH:PATH_1:PATH_2:PATH_3:------:PATH_N 
    export PATH

    你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句:

    $source /etc/profile

     6、环境配置文件的区别

    6.1 profile、 bashrc、.bash_profile、 .bashrc介绍

    bash会在用户登录时,读取下列四个环境配置文件:

    全局环境变量设置文件:/etc/profile、/etc/bashrc。 
    用户环境变量设置文件:~/.bash_profile、~/.bashrc。

    读取顺序:① /etc/profile、② ~/.bash_profile、③ ~/.bashrc、④ /etc/bashrc。

    ① /etc/profile:此文件为系统的每个用户设置环境信息,系统中每个用户登录时都要执行这个脚本,如果系统管理员希望某个设置对所有用户都生效,可以写在这个脚本里,该文件也会从/etc/profile.d目录中的配置文件中搜集shell的设置。 
    ② ~/.bash_profile:每个用户都可使用该文件设置专用于自己的shell信息,当用户登录时,该文件仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。 
    ③ ~/.bashrc:该文件包含专用于自己的shell信息,当登录时以及每次打开新shell时,该文件被读取。 
    ④ /etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。

    6.2 bashrc和.bash_profile的区别


           .bash_profile会用在登陆shell, .bashrc 使用在交互式非登陆 shell 。简单说来,它们的区别主要是.bash_profile是在你每次登录的时候执行的;.bashrc是在你新开了一个命令行窗口时执行的。 
           当通过控制台进行登录(输入用户名和密码):在初始化命令行提示符的时候会执行.bash_profile 来配置你的shell环境。但是如果已经登录到机器,在Gnome或者是KDE也开了一个新的终端窗口(xterm),这时,.bashrc会在窗口命令行提示符出现前被执行。当你在终端敲入/bin/bash时.bashrc也会在这个新的bash实例启动的时候执行。

    6.3 建议

           大多数的时候你不想维护两个独立的配置文件,一个登录的一个非登录的shell。当你设置PATH时,你想在两个文件都适用。可以在.bash_profile中调用.bashrc,然后将PATH和其他通用的设置放到.bashrc中。 
           要做到这几点,添加以下几行到.bash_profile中:

    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi

           现在,当你从控制台登录机器的时候,.bashrc就会被执行。

  • 相关阅读:
    iOS 项目中的NSNotification简单使用
    IOS开发之格式化日期时间的使用 && 编程中常见问题
    linker command failed with exit code 1 (use -v to see invocation),经典Xcode编译错误的出现和解决!
    CocoaPods安装和使用教程
    机器学习算法--贝叶斯分类器(二)
    机器学习算法--贝叶斯分类器(一)
    Linux系统初始化过程及运行级别简介
    Linux基本符号
    索引节点inode详解
    Linux文件类型介绍
  • 原文地址:https://www.cnblogs.com/qjoanven/p/7574139.html
Copyright © 2011-2022 走看看