对于初次接触 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。
分享到:
相关推荐
书中的内容不仅涵盖了基础的系统调用、文件操作,还包括进程管理、网络编程等高级主题,是学习Unix/Linux系统编程的宝贵资料。光盘资源则为学习过程提供了丰富的实践练习,有助于巩固理论知识,提升实际操作技能。 ...
1. **Shell介绍**:首先,会介绍Unix/Linux中的各种Shell类型,如Bash、C Shell、Korn Shell等,并讲解它们之间的差异和共性。 2. **Shell语法**:包括变量、常量、运算符、控制结构(如if-else、for、while循环)...
1. **命令行接口**:Unix/Linux操作系统以命令行界面为主,学习如何使用shell(如bash)进行文件管理、进程控制、管道和重定向等操作是基础。 2. **文件系统**:理解Unix/Linux的目录结构和文件权限至关重要。文件...
1. **Shell脚本编程**:Unix/Linux系统中的Shell是用户与操作系统交互的重要工具,学习编写Shell脚本可以提高自动化任务处理的能力。包括变量、条件语句、循环结构、函数等基础知识。 2. **文件系统与文件操作**:...
1. **基本概念**:首先,书中会介绍Unix/Linux操作系统的基本概念,包括文件系统结构、进程管理、信号处理、I/O模型等,这些都是进行系统级编程的基础。 2. **Shell脚本编程**:学习如何编写Shell脚本,理解Shell的...
在Unix/Linux编程中,文件系统扮演着重要角色。学习如何创建、读取、修改和删除文件,以及理解和使用目录结构,是每个程序员的必备技能。此外,进程管理也是核心概念,包括进程的创建、通信、同步和信号处理。理解...
这一章还介绍了UNIX的系统构成,包括内核、shell、工具和应用程序等核心组件,以及与UNIX相关的几个关键术语,如fork、pipe、daemon等,这些是理解UNIX系统运行机制的基础。 第二章"UNIX常用操作"则侧重于实际操作...
### Unix/Linux入门指南知识点概述 #### 一、Unix/Linux系统简介 - **系统起源与发展:** Unix系统最早由AT&T Bell Labs开发,是多用户、多任务的操作系统,为现代计算机系统的基石之一。Linux则是在Unix的基础上...
本课件“Unix/Linux课件”来自湖南大学大四计算机选修课,旨在帮助学生全面了解这两种操作系统的核心概念、基本命令以及在实际应用中的使用技巧。 Unix操作系统是由AT&T贝尔实验室于1960年代末开发的一款多用户、多...
- 在UNIX/Linux系统中应用正则表达式:通过grep、sed、awk等工具实践正则表达式。 6. **第六章:Shell脚本** - 脚本编程基础:编写完整的Shell脚本,包括头行、变量声明、输入/输出重定向。 - 错误处理与调试:...
首先,C/M/S模型是Concurrent Multitasking/Message Passing System(并发多任务/消息传递系统)的缩写,它是UNIX和Linux操作系统中常见的进程通信机制。在这个模型中,C代表客户(Client),M代表中间人...
- **可使用多个程序合作完成复杂任务**: Unix支持通过管道机制让多个程序协同工作。 #### 二、GNU项目 - **GNU项目简介**: GNU项目始于1984年,由理查德·斯托曼发起,目标是创建一套完全自由的Unix-like操作系统...
- **1974年**:Unix首次走出贝尔实验室,开始受到关注并在政府、科研机构、企业及大学中流行。 - **1980年**:形成两大主流Unix版本线——Berkeley的BSD Unix和AT&T的Unix,引发Unix战争,导致各种Unix变种的出现...
《UNIX/Linux编程实践教程》是一本面向初学者和进阶者的实用教程,旨在帮助读者深入理解和掌握UNIX/Linux操作系统中的编程技术。随书光盘包含了丰富的学习资源,为读者提供了实践操作的机会,使得理论与实践相结合,...
《Unix/Linux编程实践》 ...以上是"ch06Unix/Linux编程实践"中涉及的主要知识点,通过深入学习和实践,你将能够熟练掌握Unix/Linux环境下的程序设计,为后续的系统级编程和软件开发打下坚实基础。
Unix/Linux的安全机制基于用户和组,权限分为读(r)、写(w)和执行(x)。理解UMask设置,以及sudo、su命令的使用,有助于控制系统的安全性。 9. **设备文件** 设备在Unix/Linux中被视为特殊文件,如/dev/null...
这一章的内容可能涵盖了许多关键的编程概念和技术,特别是在Unix/Linux环境中。在深入探讨这些知识点之前,我们先了解一下Unix/Linux系统编程的基本背景。 Unix/Linux系统编程是开发在这些操作系统上运行的软件的...
Unix/Linux操作系统是计算机科学领域中的基石,它们提供了强大的命令行界面和丰富的编程环境。本章“ch10”主要聚焦于Unix/Linux系统中的编程实践,涵盖了多个关键知识点,旨在帮助开发者深入理解操作系统内核与应用...
Java作为一种强大的、面向对象的编程语言,不仅可以用于开发桌面应用、Web应用,还可以应用于操作系统级别的任务,如模拟Unix/Linux中的Shell。标题“用Java编写的Linux中的Shell源代码”揭示了这个项目的核心——用...