• Linux shell编程学习笔记2:我是谁 | who am i ?


    〇、更新记录

    20230926 补充例子2

    一、前言

    由于Linux系统的shell有许多种:sh、bash、cshell、tcsh、zsh……这些shell以sh为基础对象,在保持兼容性时又各有有创建,形成自己的功能特点,要想让我们编写的shell代码正确、可靠运行,我们首先应该了解我们的目标系统在登陆后默认使用的是哪个shell,也就是我是谁 | whoami?

    二、示例约定

    从现在开始,我们就要逐步学习在终端中输入和执行linux命令并根据需要进行编程,这与DOS是相似的。

    按照DOS下的惯例,我们在命令提示符后通过键盘输入命令并按下Enter来执行。我们输入的的命令将使用下划线标注。

    三、who am i?

    linux提供了who am i 或 whoami命令,不过命令的功能用来查询当前登陆系统的帐号信息。

    所以如果我们要查询当前使用的shell类型,实际上使用的是其它命令和方法。

    要查询我们当前使用的shell类型,有很多种方法,有些很直接,一步到位;有些方法则需要绕一些,通过几个命令配合实现,或者不那么直观,有些则不太靠谱。

    (一)最直接的方法

    要想知道我们当前使用的shell类别,比较好的方法是使用命令:

    echo $0

    其中$0的含义要看具体应用场合,像上面这样在命令行中使用,它代表的是Shell本身的PID(ProcessID ),(btw,如果是在脚本中使用,$0表示脚本名称或函数名称)。

    1.例子1:

    [root@localhost ~]# echo $0

    sh

     

    可以看到我们当前使用的shell是历史最悠久的sh……其中[root@localhost ~]#是Linux系统终端的命令提示符,它的格式内容是可以自定义的,我们将会在以后学习。

    2.例子2:

    user@myhost:~>echo $0
    bash

    可以看到我们当前使用的shell是大多数系统默认的bash……其中user@myhost:~>是Linux系统终端的命令提示符,其内容跟例1是不同的,因为它的格式内容是可以自定义的,自定义的方法我们将会在以后学习。

    (二)有点绕的办法

    之所以说有点绕,是因为我们不能一步到位,需要执行两条命令:

    第一条命令:

    echo $$

    这条命令将显示Shell本身的PID(ProcessID),

    1.例子1:

    [root@localhost ~]# echo $$

    64

    在上面这个例子中,我们可以知道当前进程ID是64。 接下来我们执行第二条命令:

    ps

     这条命令用于显示当前进程的信息,类似于 Windows 系统中的控制台命令tastlist,例如:

    [root@localhost ~]# ps

    PID   USER     COMMAND

        1 root     {init} /bin/sh /sbin/init

        2 root     [kthreadd]

        3 root     [kworker/0:0]

        4 root     [kworker/0:0H]

        5 root     [kworker/u2:0]

        6 root     [mm_percpu_wq]

        7 root     [ksoftirqd/0]

        8 root     [kdevtmpfs]

        9 root     [netns]

       10 root     [oom_reaper]

       11 root     [writeback]

       12 root     [crypto]

       13 root     [kblockd]

       14 root     [kswapd0]

       15 root     [kworker/0:1]

       32 root     [khvcd]

       33 root     [kworker/0:2]

       43 root     dhcpcd

       56 root     [kworker/u2:1]

       64 root     sh -l

       66 root     ps

     从ps命令显示的进程信息中,我们可以看到PID等于64的进程信息是:

      64 root     sh -l

    这样我们就知道我们现在用的shell是历史最悠久的sh…… 

    2.例子2:

     user@myhost:~>echo $$
    14559
    user@myhost:~>ps
      PID TTY          TIME CMD
     6554 pts/0    00:00:00 ps
    14559 pts/0    00:00:00 bash
    user@myhost:~>

     

    在第2个例子中,我们先查询到当前进程ID是14559,然后我们通过ps命令查询到PID等于14559的进程信息是bash。

    (三) 不那么直观的方法

    通过cat命令  查看/etc/passwd文件信息

    cat /etc/passwd

    从而了解用户的登录Shell类型。

    1.例子1:

    [root@localhost ~]# cat /etc/passwd

    cat /etc/passwd

    root:x:0:0:root:/root:/bin/sh

    daemon:x:1:1:daemon:/usr/sbin:/bin/false

    bin:x:2:2:bin:/bin:/bin/false

    sys:x:3:3:sys:/dev:/bin/false

    sync:x:4:100:sync:/bin:/bin/sync

    mail:x:8:8:mail:/var/spool/mail:/bin/false

    www-data:x:33:33:www-data:/var/www:/bin/false

    operator:x:37:37:Operator:/var:/bin/false

    nobody:x:99:99:nobody:/home:/bin/false

    从中我们可以看到,root帐户登陆系统后使用的shell是sh。

    为了更直观一些,我们可以使用 管道操作 利用grep命令搜索包含字符串root的行,即:

    cat /etc/passwd | grep ^root

     例如:

    [root@localhost ~]# cat /etc/passwd | grep ^root

    cat /etc/passwd | grep ^root

    root:x:0:0:root:/root:/bin/sh

    命令执行后系统只显示包含字符串root的信息。

    2.例子2:

    user@myhost:~>cat /etc/passwd | grep ^user
    user:x:1002:1002:,,,:/home/user:/bin/bash

     

    在这个例子中,我们可以看到当前使用的shell是bash

    (四)不那么靠谱的方法

    这种办法主要是用环境变量$SHELL。如:

    echo $SHELL

    $SHELL的值被设置为你的默认 shell 的完整路径,当你在终端中调用不同的 shell时,$SHELL的值并不会随之改变,它始终指向你的默认 shell 的完整路径。

    实例:

    user@myhost:~>echo $SHELL
    /bin/bash
    user@myhost:~>exec dash
    \u@myhost:\w>echo $0
    dash
    \u@myhost:\w>echo $SHELL
    /bin/bash

    在上面的例中,我们首先使用echo $SHELL命令查询到系统默认的shell是bash

    然后,我们使用exec dash命令将shell改为dash

    接着我们使用echo $0命令证明我们当前使用的shell是dash

    但是我们再次使用echo $SHELL命令查询,环境变量$SHELL的值并没有变成dash,仍然是默认的bash。

    需要注意的是,$SHELL中的英文字母是大写的。也就是说,linux中的环境变量名称是区分大小英文字母的。$SHELL和$shell是两个环境变量。

  • 相关阅读:
    AidAim Single File虚拟存档/备份库
    23种设计模式(十三)组合模式(阁瑞钛伦特软件-九耶实训)
    详细介绍ADMM交替方向乘子法
    spring源码解析——IOC之bean创建
    nodejs+vue+ElementUi废品废弃资源回收系统
    物理主外键与逻辑外键
    ES6 入门教程 19 Generator 函数的语法 19.2 next 方法的参数
    ASP.NET Core高性能服务器HTTP.SYS
    1.7.1、常见的计算机网络体系结构
    多种方法实现conda环境迁移
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/133251324