当前位置: 首页 > news >正文

linux shell从入门到精通(一)——初识Shell程序

linux shell从入门到精通

  • 0.第一个例程
    • 0.1源码解析——位于第一行的#!
    • 0.2自删除脚本
  • 1.Shell的命令种类

0.第一个例程

  这是一个完整的,可执行的Linux Shell程序,是一个相对简单的程序。

#! /bin/sh
echo "hello world!"

  运行linux程序有三种方法:

  • 使文件具有可执行权限,直接运行文件
  • 直接调用命令解释器执行程序
  • 使用source执行文件

0.1源码解析——位于第一行的#!

  当命令行Shell执程序时,首先判断是否程序有执行权限。如果没有足够的权限,则系统会提示用户“权限不够”。从安全角度考虑,任何程序要在机器上执行时,必须判断执行这个程序的用户是否具有相应权限。在第一种方法中,我们直接执行文件,则需要文件具有可执行权限。
  chmod命令可以修改文件的权限。+x参数程序使程序文件具有可执行权限。
  命令行Shell接受到我们的执行命令,并且判断我们有执行权限后,则调用Linux内核命令新建(fork)一个进程,在新建的进程中调用我们指定的命令。如果这个命令文件是编译型的(二进制文件),则Linux内核知道如何执行文件。不幸的是,我们的.sh程序文件并不是编译型的文件,而是文本文件,内核并不知道如何执行,于是,内核返回“not execable format file”(不是可执行的文件类型)出错信息。Shell收到这个信息时说:“内核不知道怎么运行,我知道,这一定是个脚本!”
  Shell知道这是个脚本后,启动了一个新的Shell进程来执行这个程序。但是现在的Linux系统往往拥有好几个Shell,到底挑选哪个Shell,这就要看脚本中意哪个了。在第一行中,脚本通过“#!/bin/sh”告诉命令行:“我只和他好,让他来执行吧!”
  这种选择Shell方法有助于执行方式的通用化。用户在编写脚本时,在程序的第一行通过#!来设置运行Shell创建一个什么样的进程来执行此脚本。在我们的.sh中,Shell创建了一个/bin/sh(标准Shell)进程来执行脚本。

0.2自删除脚本

  当你运行这个脚本时,基本上什么都不会发生,当然这个文件消失不见了!

#! /bin/rm
WHATEVER=65
echo "This line will never print!"
exit $WHATEVER

1.Shell的命令种类

  Linux Shell可执行的命令有3种:内建命令、Shell函数和外部命令。

  • 内建命令就是Shell程序本身包含的命令。这些命令集成在Shell解释器中,例如,几乎所有的Shell解释器中都包含cd内建命令来改变工作目录。部分内建命令的存在是为了改变Shell本身的属性设置,在执行内建命令时,没有进程的创建和消亡;另一部分内建命令则是I/O命令,例如echo命令。
  • Shell函数是一系列程序代码,以Shell语言写成,它可以像其他命令一样被引用。
  • 外部命令是独立于Shell的可执行命令。例如find、grep、echo.sh。命令行Shell在执行外部命令时,会创建一个当前Shell的复制进程来执行。在执行过程中,存在进程的创建和消亡。外部命令的执行过程如下:
      ①调用POSIX系统fork函数接口,创建一个命令行Shell进程的复制(子进程)
      ② 在子进程的运行环境中,查找外部命令在Linux文件系统中的位置,如果外部命令给出了完全路径,则跳过查找这一步:
      ③子进程里,以新程序取代Shell复制并执行(exec),此时父进程进入休眠,等待子进程执行完成;
      ④子进程执行完毕后,父进程接着从终端读取下一条命令。
http://www.dtcms.com/a/277063.html

相关文章:

  • opencv中contours的使用
  • Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
  • Docker从环境配置到应用上云的极简路径
  • 【Docker基础】Dockerfile指令速览:文件与目录操作指令详解
  • 【深度学习新浪潮】什么是新视角合成?
  • Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • ARC 02 runner scale set chart:对接集群与 Github Action 服务器
  • Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)
  • 速通TypeScript装饰器
  • 【windows办公小助手】比文档编辑器更好用的Notepad++轻量编辑器
  • 机器学习sklearn入门:使用KNN模型分类鸢尾花和简单调参
  • 分类问题-机器学习
  • 「小程序开发」项目结构和页面组成
  • Http与Https区别和联系
  • 13. Flink 高可用机制简述(Standalone 模式)
  • 单页面和多页面的区别和优缺点
  • phpMyAdmin:一款经典的MySQL在线管理工具又回来了
  • 数学建模:评价决策类问题
  • 【nRF52832】【Ble 1】【低功耗蓝牙简介】
  • UML类图完全解读
  • 【C++详解】STL-priority_queue使用与模拟实现,仿函数详解
  • es里的node和shard是一一对应的关系吗,可以多个shard分配到一个node上吗
  • 板凳-------Mysql cookbook学习 (十一--------9)
  • 什么时候需要用到 multiprocessing?
  • Java集合框架深度解析:LinkedList vs ArrayList 的对决
  • 完整 Spring Boot + Vue 登录系统
  • 决策树学习
  • Spring Cloud Gateway 实战指南
  • 设计模式深度解析:单例、工厂、适配器与代理模式