Alibaba Cloud Linux操作系统Shell程序

简介: 了解Alibaba Cloud Linux Shell和用户Shell定制、C/C++编写一个简单的Shell程序

Alibaba Cloud Linux操作系统Shell程序

1. 创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息


2. shell的基础知识及使用

  1. Linux Shell的基础知识

1)Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。是在Linux内核与用户之间的解释器程序,现在Linux通常指/bin/bash解释器来负责向内核翻译以及传达用户/程序指令,shell相当于操作系统的“外壳”。

2)、shell不止有一种。在计算机历史的长河里,有许多种shell,例如:

①Bourne shell(简称为sh):第一个shell,UNIX上的标准shell,很多UNIX版本都配有sh。sh是第一个流行的Shell。

②C shell(简称为csh):这个shell的语法有点类似C语言,所以才得名为C shell ,简称为csh。

③Bourne Again Shell(简称为bash):这是对Bourne shell的增强版本。bash shell是Linux的默认shell。bash由GNU组织开发,保持了对sh shell的兼容性,是各种Linux发行版默认配置的 shell。尽管如此,bash和sh还是有一些不同之处:一方面,bash扩展了一些命令和参数;另一方面,bash并不完全和sh;兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用bash代替sh。

④Tenex C shell(简称tcsh):是C shell的增强版本,加入了命令补全功能,提供了更加强大的语法支持。

⑤ash:一个简单的轻量级的Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

  1. 默认的linux Shell ——bash Shell和ksh、tcsh以及zsh使用和设置
  2. shell常用命令的使用

cd命令

cd .. ——进入上级目录,cd 路径——切换到路径目录下

输入cd .. 可见 ~ 变为 / ,意味着从家目录切换到了根目录。家目录一般为用户目录。

输入命令 ls 可以看到根目录脚下的所有文件。

cd root / 又变回~,说明这里的家目录是root,因为我们目前使用的是root账户。

touch命令——新建一个文件

输入touch 1.c,在输入ls可以看到创建文件成功。亦可用vi编辑器创建文件,这里不再演示。

mkdir命令——新建文件夹

输入 mkdir new,再输入ls查看。

cat命令——查看当前文件内容

用vi/vim编辑器编辑1.c,这里不再演示,直接上结果。

./+可执行文件名——运行可执行文件

gcc编译并生成可执行文件

2)更换其他类型的shell

Linux默认使用的是bash,但是其实支持许多类型的。可以通过这个命令查看linux支持的cat /etc/shells

用echo $SHELL可以查看系统默认的shell

没有ksh、tcsh、zsh,需要安装

输入yum -y install ksh tcsh zsh进行这些shell的安装,并再次查看当前linux的shell,发现已经都成功安装。

chsh命令——用来更换登录系统时使用的shell

通过chsh -s /bin/xxx 尝试shell的切换

上述命令只是修改了登录时启动的shell,如果要切换shell需要重新登录

通过sudo login想重新登录,系统提示远程连接断开,点击重新连接后,再查看当前的shell,改变了


3. shell的原理及实现

1.了解管道和进程组、会话和进程组、会话和作业控制的内容。

管道 :多个进程的一种通信手段 共享内存区,进程把共享信息放在那里,通过一些API提供信息交换

进程组 :是一个或者多个进程的集合,通常与一组作业相关联

会话 :是一个或者多个进程组的集合,一个会话可以有一个控制终端

作业控制: 让一个作业在前台或者后台运行

2.shell原理

shell就是利用程序替换的原理进行实现的。fork一个进程,如果fork成功,子进程执行指定的操作或命令,需要执行exec族函数;父进程⽤wait命令等待子进程结束。wait系统调⽤同时从内核取得退出状态或者信号序号以告知⼦进程是如何结束的。

3.实现一个简单的命令解释器,即Linux中的Shell程序。要求其设计类似目前流行的Shell解释程序,但不需要具备太复杂的功能。

这部分需要独立完成,并不会给出教程,实现shell过程中可能会用到的系统调用如下。

(1) pid_t fork(void):创建一个新的进程。返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,创建进程失败,返回-1.

注意:通过fork创建的子进程,会拷贝父进程的(数据段、bss段、堆、栈、I/O流缓冲区等)数据段,与父进程共享代码段。可以根据返回值的不同,让父子进程进入不同的分支,执行不同的代码。

(2) int execvp(const char *file, char * const argv[]):加载一个可执行程序到调用进程的地址空间,然后执行这个程序。如果成功,它就会覆盖当前运行的进程内容。有若干个类似的exec系统调用。

(3) int wait(int *stat_loc):如果有退出的子进程,则返回退出的子进程的状态;如果没有任何子进程在运行,则返回错误。如果当前有子进程正在运行,则函数会一直阻塞直到一个子进程退出。

(4) pid_t waitpaid(pid_t pid, int *stat_loc, int options):类似于函数wait,但允许用户等待某个进程组的特定进程,并可以设置等待选项。

(5) int tcsetpgrp(int fildes, pid_t pgid_id):将前台进程组ID设置为pgid_id,files是与控制终端相联系的文件描述符。终端通常指标准输入、标准输出和标准错误输出(文件描述符为0、1、2)。

(6) int setpgid(pid_t pid, pid_t pgid):把pid进程的进程组ID设置为pgid。

(7) int dup2(int fildes, int fildes2):把fildes文件描述符复制到fildes2。如果files2已经打开,则先将其关闭,然后进行复制,使fildes和fildes2指向同一文件。

(8) int pipe(int fildes[2]):创建一个管道,把管道的读和写文件描述符放到数组fildes中。


4. 实验要求及总结

(1) 比较至少两种Shell的特点;

(2) Shell环境变量对系统安全和用户使用的影响,以PATH alias举例说明;

(3) 实现一个简单的命令解释器,即Linux中的Shell程序。要求其设计类似目前流行的Shell解释程序,但不需要具备太复杂的功能。提供清晰、详细的Shell程序设计文档和源程序。

实验链接:https://developer.aliyun.com/adc/scenario/3238d571312543278c4b2c2eb3f104f5

相关文章
|
9天前
|
存储 安全 Linux
探索Linux操作系统的心脏:内核
在这篇文章中,我们将深入探讨Linux操作系统的核心—内核。通过简单易懂的语言和比喻,我们会发现内核是如何像心脏一样为系统提供动力,处理数据,并保持一切顺畅运行。从文件系统的管理到进程调度,再到设备驱动,我们将一探究竟,看看内核是怎样支撑起整个操作系统的大厦。无论你是计算机新手还是资深用户,这篇文章都将带你领略Linux内核的魅力,让你对这台复杂机器的内部运作有一个清晰的认识。
28 3
|
9天前
|
存储 数据挖掘 Linux
服务器数据恢复—Linux操作系统网站服务器数据恢复案例
服务器数据恢复环境: 一台linux操作系统服务器上跑了几十个网站,服务器上只有一块SATA硬盘。 服务器故障: 服务器突然宕机,尝试再次启动失败。将硬盘拆下检测,发现存在坏扇区
|
16天前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
21天前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
7天前
|
存储 监控 安全
探究Linux操作系统的进程管理机制及其优化策略
本文旨在深入探讨Linux操作系统中的进程管理机制,包括进程调度、内存管理以及I/O管理等核心内容。通过对这些关键组件的分析,我们将揭示它们如何共同工作以提供稳定、高效的计算环境,并讨论可能的优化策略。
17 0
|
21天前
|
网络协议 Linux Shell
探索Linux操作系统:从基础到高级编程
【8月更文挑战第31天】本文旨在为读者提供一条清晰的路径,从Linux操作系统的基础知识出发,逐步深入到高级编程技巧。我们将一起揭开Linux神秘的面纱,了解其内部工作原理,并通过实际代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你带来新的视角和技能提升。
|
21天前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!
|
21天前
|
Linux
探索Linux操作系统的启动过程
【8月更文挑战第31天】本文将深入探讨Linux系统从按下电源键到登录界面出现之间的神秘世界。我们将一步步揭开内核加载、初始化进程启动和系统服务运行的面纱,同时通过实际代码示例,揭示这一切是如何精妙地编织在一起的。无论你是系统管理员还是对操作系统感兴趣的爱好者,这篇文章都将给你带来新的视角和深刻的见解。
|
21天前
|
存储 Linux 调度
深入理解Linux操作系统的启动过程
【8月更文挑战第31天】本文将深入探讨Linux操作系统的启动过程,包括BIOS、内核、init进程等关键步骤。我们将通过实际代码示例,揭示Linux启动过程中的奥秘,帮助读者更好地理解和掌握Linux系统。
|
4月前
|
关系型数据库 MySQL Linux
Alibaba Cloud Linux release 3 (Soaring Falcon)操作系统
Alibaba Cloud Linux release 3 (Soaring Falcon)操作系统