`

Unix/Linux 中的 shell 机制

 
阅读更多



对于初次接触 Unix/Linux 系统 的同学来说,Unix/Linux 系统与 Windows 系统最大的不同就是,操作 Unix/Linux 系统更多时候不是使用 GUI 图形界面而是使用 shell 命令行。那么,作为 Unix/Linux 系统的标志性建筑,shell 机制究竟是什么呢?
shell 是功能强大的命令解释程序,是 Unix/Linux 系统面向用户 的接口界面。但是,shell 程序仅仅是操作系统 的一部分,是用以与系统内核 进行交互的工具,并不是操作系统的核心组成部分。程序员可以根据需要编写符合接口规范的 shell 程序。
我们分析一下 Unix/Linux 系统的启动登陆过程,就可以更清楚的了解 shell 程序在 Unix/Linux 系统中的地位了。
当 Unix/Linux 系统启动时,操作系统的内核部分被装入内存 , 其余部分仍在硬盘上,只有当用户请求执行时才会被加载到内存中。Unix/Linux 系统完成启动后,由内核中的 init 进程激活 getty 进程,getty 进程在相应的终端上显示“login: ”提示,等待用户登录。当用户输入用户名时,getty 进程读取用户输入并启动 login 进程,由 login 进程完成整个登陆过程。用户完成登录后,login 进程根据启动配置文件 ,启动与该登录用户相对应的“默认 shell ”。此时,shell 进程被启动,用户可以通过 shell 终端与系统内核进行交互。
从 Unix/Linux 系统的启动过程可以看出,shell 程序并非神秘无比,而是一种“长相奇特”的“普通的”、“用以与内核进行交互”的“应用程序 ”。

各种各样的 shell

和 Unix/Linux 中的其它程序一样,shell 也仅仅是一个程序,在 Unix/Linux 系统中并没有特权。这也是为什么 Unix/Linux 系统中出现各种各样 shell 的原因。
1、Bourne shell(sh)。大多数 Unix 系统的默认安装 shell。
2、Korn shell(ksh)。
3、C shell(csh)。
4、TENEX/TOPS C shell(tcsh)。
5、Bourne Again shell(bash)。大多数 Linux 系统的默认安装 shell。

切换 shell

大多数的 Unix/Linux 系统都提供了多个 shell。当系统启动时,由启动配置文件确定启动(默认的) shell,用以用户与系统进行交互。
在 Red Hat 9 中,可以通过以下任何一种命令,确定登录用户的默认 shell。
cat /etc/passwd    #M1
echo $SHELL    #M2
在决定要切换 shell 之前,必须知道系统中安装了哪些 shell。在 Red Hat 9 中,可以通过以下命令,确定系统中已经安装的各种 shell 程序。
cat /etc/shells
在我的 Red Hat 9 系统中,得到了如下的结果:
/bin/sh
/bin/bash
/sbin/nologin
/bin/bash2
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
可以看出来,这其实是一个 shell 程序文件的列表。一般来说,/bin 和 /sbin 目录都在环境变量 PATH 中。为了切换为我们喜欢的 shell 种类,(我们已经知道,shell 也仅仅是一种与系统进行交互的程序),我们只需要在命令提示符下输入 shell 在 /bin 和 /sbin 目录中的相应名称即可。

我在使用哪个 shell

Unix/Linux 系统极少被重新启动,多个对 shell 有不同爱好的管理员可能操纵过计算机 ,我们姑且假设他们都使用相同的管理帐号。于是,这就产生了一个问题,我的终端上究竟运行着什么样的 shell?
针对这个问题,我在 Google 上搜寻了一下,有各种各样的答案。有一个回答是
echo $SHELL
我觉得这是不对的,SHELL 是环境变量,在整个会话中都不回改变,它表示的是登录用户的“默认 shell ”。还有人说用
cat /etc/passwd
这样得到的结果也是登录用户的“默认 shell ”,很显然也不能解决上述问题。
在 Red Hat 9 系统上,我用下述方法解决这个问题:
首先,使用命令
echo $$
获得当前 shell 进程的 PID。我在测试中,得到的结果是 10650。
然后,使用命令
ps -A | grep 10650
获取进程列表,并进行筛选。得到这样的测试结果:
10650 pts/0 00:00:00 csh
于是得到的结论是,测试中使用的 shell 是 csh。

分享到:
评论

相关推荐

    Shell脚本调试技术

    shell编程在unix/linux世界中使用得非常广泛,熟练掌握shell编程也是成为一名优秀的unix/linux开发者和系统管理员的必经之路。脚本调试的主要工作就是发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行,...

    UNIX操作系统教程 张红光

    第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...

    linux驱动学习去开发入门

    在Unix类的操作系统中只用到了两个级别:最高和最低级别。 (4)要十分注意驱动程序的并发处理。 (5)内核API中具有双下划线(_ _)的函数,通常是接口的底层组件,应慎用。 (6)内核代码不能实现浮点书运算。 ...

    操作系统实验

    2)分析UNIX SysV/Linux的超级块及其结构,并建立相关数据结构,通过编程实现UNIX SysV/Linux文件系统内各部分的定位。 3)至少要实现对给定i节点文件的只读访问。 4)建议根据文件名读取文件。

    linux复习题

    5. 在UNIX/Linux系统添加新用户的命令是() A. groupadd B. usermod C. userdel D. useradd 6. Android系统是基于Linux操作系统开发的手机系统,因此在进行刷机、删除系统自带软件时需要获得管理员账户( )的权限。 ...

    UNIX环境高级编程

    17.2 PostScript通信机制 413 17.3 假脱机打印 415 17.4 源码 417 17.5 小结 434 习题 434 第18章 调制解调器拨号器 435 18.1 引言 435 18.2 历史 435 18.3 程序设计 436 18.4 数据文件 437 18.5 服务器设计 439 ...

    unix学习笔记

    4.开放源代码的Linux,UNIX的体系结构加MS Windows形式的图形用户界面,主要应用 在基于Intel x86体系结构的系统上。 Unix系统特征: 1.可移植性强--Unix操作系统大量代码为C语言编写,C语言具有跨平台的特性。 2....

    linux教程——很使用的那种

    由于linux中的别名机制,使用rm等价与使用rm -i,这样在删除文件或目录时会有提示,如果不想出现提示内容,需要加选项-f。写脚本的时候需要加上-f,因为批量删除文件或目录不需要每次都提示询问。 在unix中rm删除文件...

    从头开始构建一个嵌入式Linux发行版.pdf

    本教程假定用户基本熟悉 UNIX® 或 Linux 系统管理,并且有主机系统的根访问权限。 本教程假定您 shell 是 Bourne shell 的变体;如果您使用的是 C shell 变体,那么提示符可能会不同,需要使用不同的命令来设置...

    netcat 瑞士军刀 linux windows netcat 瑞士军刀 linux windows

     nc -l -p port -e /bin/sh //unix,linux  attacker machine: //攻击者的机器.  nc ip -p port //连接victim_IP,然后得到一个shell。  3.4.反向连接  attacker machine: //一般是sql2.exe,远程溢出,webdavx...

    中文第一版-UNIX环境高级编程

    17.2 PostScript通信机制 413 17.3 假脱机打印 415 17.4 源码 417 17.5 小结 434 习题 434 第18章 调制解调器拨号器 435 18.1 引言 435 18.2 历史 435 18.3 程序设计 436 18.4 数据文件 437 18.5 服务器设计 439 ...

    RED HAT LINUX 6大全

    第1章 Red Hat Linux和UNIX简介 1 1.1 Linux的优点 2 1.2 版权和保证 3 1.3 在哪里可以获取Red Hat Linux 3 1.4 系统需求 3 1.5 小结 4 第2章 Red Hat系统的安装 5 2.1 准备,认真准备 5 2.2 安装Red Hat Linux 6 ...

    UNIX环境高级编程第二版

    17.2 PostScript通信机制 413 17.3 假脱机打印 415 17.4 源码 417 17.5 小结 434 习题 434 第18章 调制解调器拨号器 435 18.1 引言 435 18.2 历史 435 18.3 程序设计 436 18.4 数据文件 437 18.5 服务器设计 439 ...

    UNIX环境高级编程 不扣分哦

    本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、进程间通信以及各种I/O。在此基础上,分别按...

    Linux程序设计 第4版.haozip01

    14.1.3 linux的信号量机制 490 14.1.4 使用信号量 492 14.2 共享内存 496 14.2.1 shmget函数 497 14.2.2 shmat函数 497 14.2.3 shmdt 498 14.2.4 shmctl 498 14.3 消息队列 502 14.3.1 msgget函数 502 ...

    Linux C 一站式学习

    Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体...

    redhat linux教材20课程学习文档

    1.4 Linux 与 Unix的比较 1.5 Linux 的发行版本和内核版本 1.6 Linux 的适用场合 1.7 Linux 的未来 第二章 Linux系统基本原理 2.1 Linux的体系结构以图来表现 2.2 基本特点 2.2.1 单核心 2.2.2 多用户的操作系统 ...

    Linux程序设计 第4版.haozip02

    14.1.3 linux的信号量机制 490 14.1.4 使用信号量 492 14.2 共享内存 496 14.2.1 shmget函数 497 14.2.2 shmat函数 497 14.2.3 shmdt 498 14.2.4 shmctl 498 14.3 消息队列 502 14.3.1 msgget函数 502 ...

Global site tag (gtag.js) - Google Analytics