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

相关文章
|
27天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
63 1
|
29天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
29天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
27天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
28天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
30天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
2月前
|
人工智能 安全 Linux
Linux操作系统的演变与未来趋势###
本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其开源模式对技术创新和IT行业的影响,并展望了Linux在未来技术生态中的角色。通过历史回顾、现状分析和未来预测,本文旨在为读者提供一个关于Linux操作系统全面而深入的视角。 ###
|
2月前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
35 2
|
2月前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
51 1