设为首页 收藏本站
查看: 1455|回复: 0

登陆shell和非登陆shell区别

[复制链接]

尚未签到

发表于 2018-8-30 09:24:47 | 显示全部楼层 |阅读模式
  第一部分
  An interactive login shell is started after a successful login, using /bin/login, by reading the /etc/passwd file. This shell invocation normally reads /etc/profile and its private equivalent ~/.bash_profile upon startup.
  An interactive non-login shell is normally started at the command-line using a shell program (e.g., [prompt]$/bin/bash) or by the /bin/su command. An interactive non-login shell is also started with a terminal program such as xterm or konsole from within a graphical environment. This type of shell invocation normally copies the parent environment and then reads the user's ~/.bashrc file for additional startup configuration instructions.
  A non-interactive shell is usually present when a shell script is running. It is non-interactive because it is processing a script and not waiting for user input between commands. For these shell invocations, only the environment inherited from the parent shell is used.
  The file ~/.bash_logout is not used for an invocation of the shell. It is read and executed when a user exits from an interactive login shell
  第二部分
  export ABC="123"
  su lfs
  echo $ABC
  export ABC="123"
  su - lfs
  echo $ABC
  实际上,当用su 用户 的时候,会使用当前用户的环境变量;如果当前用户是root,su后还是使用root的环境变量,而 su - 用户 的时候,会使用该用户登录时获取的环境变量,就是用户lfs的环境变量。
  第三部分  shell变量   (环境变量、预定义变量、位置变量、用户自定义变量)
  一、环境变量   (可以较好的了解到用户当前状态信息)
  1、查看环境变量
  #set  |  head -3   (查看多个环境变量)
  #echo  $PATH     ( 查询某个环境变量)
  2、常用环境变量
  #echo  $USER    ( 当前用户的登陆名称)
  #echo  $UID    ( 当前用户的用户号)
  #echo $SHELL    ( 当前用户登陆的shell)
  #echo  $HOME   (当前登陆用户的主目录)
  #echo  $PWD     (用户当前所在目录)
  #echo  $PATH    (当前用户的命令搜索路径)
  #echo  $PS1    (当前用户的主提示符)
  #echo  $PS2    (当前用户的辅助提示符)
  3、环境变量配置文件  (分全局配置文件、用户配置文件)
  环境变量全局配置文件:
  /etc/profile      ( 负责设置全局环境,并应用与所有的用户登陆shell)
  /etc/bashrc      ( 定义全局的函数和别名,除为系统中所有登陆用户提供设置外,
  也使用与非交互shell和非登陆shell)
  用户环境变量配置文件:
  /home/sto1/.bash_profile   (存在于用户的主目录内,作用于当前用户)
  /home/sto1/.bash_bashrc   (存在于用户的主目录内,作用于当前用户)
  -------------------------------------------------------------
  二、位置变量   (与shell脚本程序执行时所使用的命令参数相对应,命令行中的参数按照从左到右的顺序给位置变量赋值)
  $0     预定义变量
  $n     n="1"~9之间的一个数
  引号的作用:
  单引号('……') 对引号中的字符串不进行任何变量替换,保持字符串的原始值;
  双引号("……")对引号中的变量会以变量的值来替换,并作为字符串的一部分;
  反引号(`……`) 用于进行命令替换,引号中命令执行的结果将替换命令本身作为字符串
  ----------------------------------------------------------
  三、预定义变量  (是系统中已定义好的变量,用户只能使用不能改变或创建)
  $#     表示参数的数量
  $*      表示所有位置参数的内容
  $?      表示上一个命令执行后退出时的状态,为0表示正确执行,非0执行错误
  $$      表示当前进程的进程号
  $0      表示当前执行的进程名
  $!      表示后台运行的最后一个进程号
  ------------------------------------------------------------
  四、用户自定义变量  (又称本地变量,用户自己定义的变量,在用户自己的shell中有效)
  1、自定义变量的设置
  # DAY="sunday"
  2、自定义变量的查看与引用
  # echo $DAY
  3、自定义变量的输出   (输出变量到全局变量,在所有用户的子shell中使用)
  # export DAY
  4、自定义变量的清除
  # unset DAY
  ------------------------------------------------------------------------
  五、shell脚本
  1、创建shell脚本:
  # vi  hello.sh     (文件名用后缀.sh结尾,用来表明这是个shell脚本)
  2、shell脚本的首行(固定格式):
  #!/bin/shell
  3、注释行以#开头:
  # This  is  my  first  shell  program.
  4、脚本运行:
  # chmod  u+x  hello.sh   (给脚本添加可执行属性)
  # bash  hello.sh    (使用shell命令程序执行脚本,需要设置可执行属性)
  # ./hello.sh  (执行当前目录下的hello.sh,需要设置可执行属性)
  # /home/user1/hello.sh  (需要设置可执行属性)
  # . hello.sh  (用 . 命令执行,通常在脚本文件中调用其他脚本文件时使用,不需要hello.sh有可执行属性)
  第四部分  让Linux系统的程序在开机时自动运行
  【摘 要】 一个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的,如[prompt]$/bin/bash。一般一个非交互的shell出现在运行 shell脚本的时候。之所以叫非交互的  shell,是因为它不在命令行上等待输入而只是执行脚本程序。
  Linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
  阅读之前建议先看一下附图。
  本文中假设inittab中设置的init tree为:
  /etc/rc.d/rc0.d
  /etc/rc.d/rc1.d
  /etc/rc.d/rc2.d
  /etc/rc.d/rc3.d
  /etc/rc.d/rc4.d
  /etc/rc.d/rc5.d
  /etc/rc.d/rc6.d
  /etc/rc.d/init.d
  1. 关于linux的启动
  init是所有进程之父
  init读取/etc/inittab,执行rc.sysinit脚本
  (注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中)
  rc.sysinit脚本作了很多工作:
  init $PATH
  config network
  start swap function
  set hostname
  check root file system, repair if needed
  check root space
  ....
  rc.sysinit根据inittab执行rc?.d脚本
  linux是多用户系统,getty是多用户与单用户的分水岭
  在getty之前运行的是系统脚本
  2. 关于rc.d
  所有启动脚本放置在 /etc/rc.d/init.d下
  rc?.d中放置的是init.d中脚本的链接,命名格式是:
  S{number}{name}
  K{number}{name}
  S开始的文件向脚本传递start参数
  K开始的文件向脚本传递stop参数
  number决定执行的顺序
  3. 启动脚本示例
  这是一个用来启动httpd的 /etc/rc.d/init.d/apache 脚本:
  #!/bin/bash
  source /etc/sysconfig/rc
  source $rc_functions
  case "$1" in
  start)
  echo "Starting Apache daemon..."
  /usr/local/apache2/bin/apachectl -k start
  evaluate_retval
  ;;
  stop)
  echo "Stopping Apache daemon..."
  /usr/local/apache2/bin/apachectl -k stop
  evaluate_retval
  ;;
  restart)
  echo "Restarting Apache daemon..."
  /usr/local/apache2/bin/apachectl -k restart
  evaluate_retval
  ;;
  status)
  statusproc /usr/local/apache2/bin/httpd
  ;;
  *)
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1
  ;;
  esac
  可以看出他接受start,stop,restart,status参数
  然后可以这样建立rc?.d的链接:
  cd /etc/rc.d/init.d &&
  ln -sf ../init.d/apache ../rc0.d/K28apache &&
  ln -sf ../init.d/apache ../rc1.d/K28apache &&
  ln -sf ../init.d/apache ../rc2.d/K28apache &&
  ln -sf ../init.d/apache ../rc3.d/S32apache &&
  ln -sf ../init.d/apache ../rc4.d/S32apache &&
  ln -sf ../init.d/apache ../rc5.d/S32apache &&
  ln -sf ../init.d/apache ../rc6.d/K28apache
  4. 关于rc.local
  经常使用的 rc.local 则完全是习惯问题,不是标准。
  各个发行版有不同的实现方法,可以这样实现:
  touch /etc/rc.d/rc.local
  chmod +x /etc/rc.d/rc.local
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local &&
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local &&
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local &&
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local &&
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local &&
  ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local
  5. 关于bash启动脚本
  /etc/profile
  /etc/bashrc
  ~/.bash_profile
  ~/.bashrc
  是bash的启动脚本
  一般用来设置单用户的启动环境,也可以实现开机单用户的程序,但要明确他们都是属于bash范畴而不是系统范畴。
  他们的具体作用介绍如下:
  /bin/bash这个命令解释程序(后面简称shell)使用了一系列启动文件来建立一个运行环境:
  /etc/profile
  /etc/bashrc
  ~/.bash_profile
  ~/.bashrc
  ~/.bash_logout
  每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。
  /etc/profile 和 ~/.bash_profile 是在启动一个交互登陆shell的时候被调用。
  /etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动的时候被调用。
  ~/.bash_logout 在用户注销登陆的时候被读取
  一个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的,如[prompt]$/bin/bash。一般一个非交互的shell出现在运行 shell脚本的时候。之所以叫非交互的shell,是因为它不在命令行上等待输入而只是执行脚本程序。
  6. 关于开机程序的自动启动
  系统脚本可以放置在/etc/rc.d/init.d中并建立/etc/rc.d/rc?.d链接,也可以直接放置在/etc/rc.d/rc.local中。
  init.d脚本包含完整的start,stop,status,reload等参数,是标准做法,推荐使用。
  为特定用户使用的程序(如有的用户需要使用中文输入法而有的不需要)放置在~/中的bash启动脚本中


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558742-1-1.html 上篇帖子: 无交互shell脚本上传文件至服务器 下篇帖子: Shell脚本调试技术
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表