bash的配置文件(linux学习之八)

一、什么是shell

广义的shell指,能够操作应用程序的接口都成为shell,(包括linux和windows的图形界面)

狭义的shell指,命令行方面的程序,包括zsh,bash,csh,等等

查看当前系统的可用shell,文件/etc/shells 中所列的shell,称为当前系统上安全的shell列表。默认shell如果非文件/etc/shells中的shell,很可能拒绝登入系统。

[[email protected] ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

为甚么/etc/shells 文件中的shell列表称为合法的shell列表,这是因为系统某些服务在运行的时候,会去检查用户能够使用的shells,而检查的标准就是根据/etc/shells 文件中的shell列表。

二、bash命令与sh命令的区别

Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne shell 的基础上增加、增强了很多特性。

GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 ash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。

debian和Ubuntu中,/bin/sh默认已经指向dash,这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准。

三、bash的四种模式

在man bash的INVOCATION一节讲述了bash的四种模式,bash会依据这四种模式而选择加载不同的配置文件,而且加载的顺序也有所不同。

Bash是shell的一种,运行中的Bash有两种属性(状态/模式),一种,是否interactive shell(交互式Shell),另一种,是否login shell(登录Shell)。两种组合成四种模式。

  • login shell(交互式shell):

定义:A login shell is one whose first character of argument zero is a -, or one started with the --login option.

大概意思是:一个登入式shell,它的第零个参数的第一个字符是  -,或者 它是一个以 --login 选项启动的shell。

解释一下这个定义

1、第零个参数的第一个字符是 - 的shell是登入式shell

比如: tty1-tty6 终端登入系统(系统默认shell是bash)是登入式shell

tty1-tty6 登入系统后

echo $0
-bash

第零个参数的第一个字符是 -,所以这是一个登入式shell。

2、以 --login 选项启动的bash是登入式shell

比如:bash --login[-l]

系统登入以后,在当前shell中登入子shell,加上--login选项,表示登入的这个子shell是登入式shell

此外。除定义外,我们判断这两种模式的方法。

登入式shell与非登入式shell的区别我们可以从字面上理解,登入式shell要求用户输入用户名,密码。包含登入一个shell的全过程。(这个说法不一定严谨准确,比如bash --login[- l]  这种方式就不需要输入用户名密码,因为它登入的是当前shell的子shell,用户名,密码与当前shell相同,所以省去)

登入式shell和非登入式shell的退出机制不同。

非登入式shell,退出时,使用exit命令退出,不能使用logout命令退出

登入式shell,退出时,使用logout命令退出,能够使用exit命令退出,但是此时的exit命令扔是调用logout命令。

常见的login shell与no-login shell

下列为login shell 统计不完整。(no-loginshell及说明待更新)

tty1-tty6

su -[l] UserName

ssh [email protected]

ssh [email protected] "command"

bash --login[-l]

su -[l] UserName -c "command"

bash --login[-l] -c "command"

bash -l[--login] script.sh

  • interactive shell(登入式shell):

定义:An  interactive  shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option.  PS1 is set and $- includes  i  if  bash  is interactive, allowing a shell script or a startup file to test this state.

(解释以及常见的非交互式shell 待更新)

四、种模式配置文件文件加载过程

配置文件的作用: 持久保存用户的配置,只在登入时读取一次

运行中的Shell排列组合有这么几种

  • 登录交互式Shell
  • 登录非交互式Shell

这两种模式,加载配置文件的顺序和过程相同

man bash 帮助文档中的描述如下:

When  bash  is  invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists.  After reading that file, it  looks  for  ~/.bash_profile,  ~/.bash_login,  and~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.  The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the files~/.bash_logout and /etc/bash.bash_logout, if the files exists.

  • 非登录交互式Shell

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc,  if  that  file  exists.This  may  be  inhibited  by  using  the  --norc option.  The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

  • 非登录非交互式Shell

When bash is started non-interactively, to run a shell script, for example, it looks  for  the  variable  BASH_ENV  in  the  environment, expands  its  value  if  it appears there, and uses the expanded value as the name of a file to read and execute.  Bash behaves as if the following command were executed:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

but the value of the PATH variable is not used to search for the file name.

(英文解释待续,非登录非交互式Shell加载 BASH_ENV变量测试过程中有点问题,问题链接 待续。各个配置文件的说明未完待续)

五、补充一下,以其他用户运行command命令时,是否加-或-l 选项 ,环境变量加载都不成功得原因

以下是好久之前网上的找的,没有原文章链接。

sudo command

sudo命令是以root的身份执行command命令,但是环境变量还是当前用户的,执行目录也仍然是当前目录

即环境变量和执行目录都不会切换到root

sudo command1 | command2     这种命令只会是command1有root权限,但是管道符后面的command则还是没有root权限。Sudo只会提升紧跟其后的那个命令的权限

su - username -c "command1;command2"

su命令是切换到另一个用户,环境变量会切换到username,执行目录会切换到目标用户username的家目录

提醒:

假设当前用户为普通用户lx(该用户没有ORACLE_SID这个环境变量),以lx用户执行命令

su - oracle -c "echo $ORACLE_SID"

输出会是空

su - username -c环境变量会切换到username,为什么没打印出oracle用户的ORACLE_SID环境变量呢?

因为双引号是不屏蔽$这个特殊字符的,在执行su - oracle -c "echo $ORACLE_SID"命令,

将先在当前用户下替换变量ORACLE_SID(当前用户的ORACLE_SID变量为空),然后发送给oracle执行的命令就成了 echo ""

我们的意图是将echo $ORACLE_SID这个命令发送给oracle用户,打印出oracle用户用户的环境变量ORACLE_SID,有以下解决方式:

1、su - oracle -c ‘echo $ORACLE_SID‘   (单引号会屏蔽所有的特殊字符)

2、su - oracle -c "echo \$ORACLE_SID"

命令行命令“

su 与 su - 命令的却别:

su 命令仅切换用户身份,例如从A切换到B,执行whoami命令,显示的是用户B,但当前目录不会切换,

环境变量也仍未切换,仍为A用户的环境变量

su - 命令切换用户,A切换到B,会以登录B的流程执行,不仅会切换用户,还会执行.profile文件,

更换成B用户的环境变量,目录切换到B的家目录

待更新文章

笔记本太烂,虚拟机不能运行,周六元宵节

回公司 一些列子待更新

参考:man bash 的帮助文档。

时间: 2024-10-12 18:33:59

bash的配置文件(linux学习之八)的相关文章

<LINUX >bash shell 入门 --linux学习笔记

首先说下我个人对于shell的理解,我觉得shell是一种通过各种控制语句将linux命令进行集合实现批处理的一种脚本语言. shell编程入门其实很简单,语法知识并不多,但是高级shell编程就很难,因为shell是用户和linux之间的桥梁,要编写高质量的shell脚本,就需要用户对linux有很全面的认识. 这里我们只分析shell脚本的语法知识,如想透彻的学习linux还需多努力. shell结构       1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建she

Linux学习之八--关闭Firewall安装Iptables并配置

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 2.安装iptables防火墙 yum install iptables-services #安装 vi /etc/sysconfig/iptables #编辑防火墙配置文件 # Fi

linux学习之八---Linux进程基础知识

一.linux进程 linux是一个多用户多任务的操作系统. 多用户是指多个用户可以在同一时间使用计算机: 多任务是指linux可以同时执行几个任务. 进程简单来说就是运行中的程序,Linux系统的一个重要特点是可以同时启动多个进程.根据操作系统的定义:进程是操作系统资源管理的最小单位. 1.Linux进程的概念 进程是一个动态的实体,是程序一次执行过程,并且进程是操作系统资源分配的基本单位. 进程与程序的区别:进程是动态的,程序是静态的:进程是运行中的程序,而程序还是保存在硬盘上的可执行代码.

Linux学习之八-配置FTP连接Linux服务器

配置ftp连接Linux服务器 通过配置ftp服务器,可以实现局域网内共享文件,甚至不同用户具有不同权限,需要的工具有Windows平台ftp客户端FileZilla(免费开源) 下载地址:https://download.filezilla-project.org/client/FileZilla_3.32.0_win64-setup_bundled.exe 登录到Linux服务器端,安装ftp服务端yum install vsftpd –y 启动ftp服务端/etc/init.d/vsftp

12、自学——Linux的学习进度与任务【bash的配置文件】

bash的配置文件 bash的配置文件: 持久保存用户配置 profile类:为交互式登录的用户提供配置 /etc/profile 全局 /etc/profile.d/*.sh 全局 ~/.bash_profile 个人配置,仅对当前用户有效 功能: 设定环境变量 用来实现运行命令或者脚本 如何读取配置文件: /etc/profile -->/etc/profile.d/*.sh -->~/.bash_profile-->~/.bashrc -->/etc/bashrc bashr

Linux学习日记--基础命令(7)--bash中的变量,配置文件

变量的定义和使用 变量类型 强类型:定义变量时必须指定类型.参与运算必须符合类型要求:调用未声明变量会产生错误: 弱类型:无须指定类型,默认均为字符型:参与运算会自动进行隐式类型转换:变量无须事先定义可直接调用: 变量命名法则:                1.不能使程序中的保留字:例如if, for;                 2.只能使用数字.字母及下划线,且不能以数字开头:                3.见名知义,         bash中的变量的种类:          

Linux学习 -- Shell基础 -- Bash基本功能

历史命令 history -c   clear -w   写入 ~/.bash_history 默认保存1000条, 可在/etc/profile中修改 调用 Tab补全 命令.目录.文件 命令别名 alias 别名='原命令' 命令执行顺序: 绝对路径或相对路径 > 别名 > Bash的内部命令 > $PATH环境变量中找到的第一个命令(外部命令) 配置文件:/root/.bashrc 删除:unalias 别名 常用快捷键 输入输出重定向 标准输入输出 输出重定向 注意:2和>

菜鸟学Linux - bash的配置文件

bash是各大Linux发行版都支持的shell.当我们登陆bash的时候,虽然我们什么都没做,但是我们已经可以在bash中调用各种各样的环境变量了.这是因为,系统中已经定义了一系列的配置文件,以及加载这些配置文件的规则.下面通过CentOS举例说明.在这之前,我们需要了解两个概念:login shell与non-login shell.很明显,这二者的区别在于需不需要login,同时这两种shell加载配置文件的规则也不相同. login shell:通俗的讲,当我们登陆shell时,需要输入

linux学习之路之bash及其特性

我们知道当我们用鼠标点击,或输入一个命令,系统就玩帮我们完成一个任务,那么当我们点击一个链接时,系统由是如何知道要去完成相应的操作呢?这是因为通过shell来完成的. 那么什么是shell呢? shell就是用户和操作系统之间的一个接口,通过这个接口shell接受来自用户的命令,并调用相应的应用程序来呼叫kernel来处理相应的工作. 在linux系统上面存放着多种类型的shell,这些shell存放在/etc/shells文件里,默认RedHat使用的shell为bash 下面介绍一些bash