linux 下 shell 有用的常识

发布时间:2012-09-25
本文采用问答式,介绍linux下shell常用的知识,希望对大家有帮助
    Q、如何查看当前使用什么shell。
    A: echo $SHELL 或ps都可以看到。
    Q、如何查看当前系统支持哪些shell。
    A: chsh --list-shells 或  cat /etc/shells
    Q、如何更改当前shell
    A:chsh -s /bin/csh; 或编辑/etc/passed. 这些改变不会立即生效,改变的是用户登录shell,需要用户重新登录才能看到shell改变。如果想立即改变shell。 直接运行/bin/csh。
    另外在shell脚本可以指定 #!/bin/bash 。指定解析shell。也可以 /bin/bash xx.sh 显示指定shell解析器运行。
    Q、什么是登录shell 好非登录shell
    A:登录shell 是通过输入用户名密码登录得到的shell。如ssh或telnet登录进入的shell。非登陆shell如在图形系统下打开控制台。或直接在命令行里输入/bin/csh 之类切换得到shell。属于非登录shell。如果在命令行里输入 /bin/bash --login. 那么这时候得到的就是登录shell
    两者差别是,登录shell会加载一些文件。首先执行/etc/profile,然后执行以~/.bash_开头的文件,其次~/.profile。退出时候执行~/.bash_logout脚本(如果存在)。
    非登陆shell不会执行上面这些脚本。而是执行~/.bashrc。
    一般系统为了保证~/.bashrc都会被执行,~/.bash_profile中调用~/.bashrc
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    如此一来。~/.bashrc反而变成保证一致性,变得非常通用而且很重要的初始化地方。
    另外由于~代表各个用户自己,所以为了避免给每个用户修改~/.bashrc 文件。由此产生了一个全局所有用户的文件/etc/bashrc。 在每个用户 ~/.bashrc 文件有这样一句话
    if [ -f /etc/bashrc ]; then
    . /etc/bashrc
    fi
    这样就方便了,更改一个文件内容,对登录还是分登录shell,所有用户都能生效。
    Q、什么是交互shell和非交互shell
    A:非交互Shell是指为执行脚本而fork出来的子Shell。说简单点。就是script脚本里面shell命令是在非交互shell下执行。因为解析这些命令时候。会启动一个/bin/bash 之类解析器去执行。
    Q、如何去执行一个shell脚本
    A:有两种方式:1是启动一个子shell解析器去执行脚本。就是上面说到的非交互shell。
    ./test.sh 或 /bin/bash test.sh(和sh test.sh等同)
    另一种方式是不启动子shell解析器。在当前shell内执行。
    source test.sh 或 .  test.sh. 这种情况下实际上source和。 是bash的内部指令
    Q、如何查看当前是终端还是伪终端
    A:使用ps命令。
    在当前机器,如在虚拟机里面输入ps如下。看到是终端类型TTY
   

   
   在ssh或telnet登录的控制 使用ps查看
   


   这里pts 中p=pseudo意思。

   这些终端设备当文件使用。例如你可以使用echo 1 > /dev/tty1  或 echo 2 > /dev/pts/1 直接显示消息到终端上去。可以帮你消息输出到别人控制台上去很有意思。

Q:shell 和进程组,会话的关系
A:在shell在命令行下运行的进程。该进程一般是进程组长,进程ID=进程组ID。该进程的会话组长一般是shell。