精华内容
下载资源
问答
  • shell的作用
    千次阅读
    2021-05-25 15:38:48

    摘录自博客链接地址:http://c.biancheng.net/view/706.html

    1. Shell是什么?

    答:shell本意是指壳,在计算机术语中,shell是指用户操作接口的意思。操作系统运行起来后都会给用户提供一个操作接口,这个操作接口就叫shell。
    用户可以通过shell来调用操作系统内部的复杂实现。

    Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
    Shell 本身并不是内核的一部分,它只是在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。
    然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。

    2. Shell的分类?

    答:常用的Shell功能有两种形式外在形式:GUI和cmdline
        (1)GUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。
        (2)cmdline(命令行界面),譬如linux的终端和windows的cmd,特点是不易用易学,优点是可以进行方便的shell编程,适合做开发的人。
        用户界面和命令行就是这个另外开发的程序,就是“代理”作用。在Linux下,这个特定程序叫做 Shell。


    3. 为什么需要Shell?
    答:1. 因为计算机程序本身很复杂,操作系统内部功能的实现和外面接口的调用必须分开。
           操作接口本身就是对内部复杂功能实现的一种封装,外部只需要通过操作接口就可以很容易去调用操作系统内部功能,但是却不用理会内部功能实现的复杂性和原理。

           2. 由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;
           该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。

    4. Shell 是如何连接用户和内核的?
    答:Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,
           这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!

           其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell           隐藏了起来,它自己在背后默默进行,我们看不到而已。接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

           比如,我们都知道在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?

           这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,

           并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。

    5. Shell 也支持编程
    Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python 等常见的编程语言并没有什么两样。

    Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:
    if...else 选择结构,case...in 开关语句,for、while、until 循环;
    变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
    函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。

    站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
    Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。

    使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。
    尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器。


    6. Shell 是一种脚本语言
    任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

    编译型语言:有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。

    脚本语言:有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。

    编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
    脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

    Shell就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

    更多相关内容
  • 今天小编就为大家分享一篇浅谈shell循环中变量的作用域问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 登录脚本的执行顺序:【注:仅适用于 bash shell】 Login Shell 是指登录时,需要提供用户名密码的shell,如:su – user1 , 图形登录, ctrl+alt+F2-6进入的登录界面。 这种Login shell 执行脚本的顺序: 1. /...
  • 说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下...
  • letter-shell | 一个功能强大的嵌入式shell

    万次阅读 多人点赞 2020-04-04 19:51:42
    应用场景 在嵌入式项目中,做出一个项目之后还需要用户在串口终端中进行操作,这样的情况很少,串口的作用基本都是用来在调试阶段打印信息。 但是在调试的模组比较复杂时,比如SPI Flash、LCD屏幕这些,我希望可以...

    嵌入式开源项目精选专栏

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,本专栏的优势在于:

    不会单纯的介绍分享项目,还会包含作者亲自实践的过程分享,甚至还会有对它背后的设计思想解读

    目前本专栏包含的开源项目有:

    如果您自己编写或者发现的开源项目不错,欢迎留言或者私信投稿到本专栏,分享获得双倍的快乐!

    1. letter-shell

    本期给大家带来的开源项目是 letter-shell,一个功能强大的嵌入式shell,作者NevermindZZT,目前收获 155 个star,遵循 MIT 开源许可协议。

    letter shell 3.0是一个C语言编写的,可以嵌入在程序中的嵌入式shell,通俗一点说就是一个串口命令行,可以通过命令行调用、运行程序中的函数。


    目前 letter-shell 3.0版本支持的功能有:

    • 命令自动补全
    • 快捷键功能定义
    • 命令权限管理
    • 用户管理
    • 变量支持

    项目地址:https://github.com/NevermindZZT/letter-shell

    2. 移植letter-shell

    2.1. 移植思路

    ① 看项目readme文件中的移植说明,一般都比较完善;
    ② 看项目中的demo,举一反三;
    ③ 看别人移植好的博客;

    2.2. 移植过程

    letter-shell的移植非常简单,自己实现串口读写一个字符的接口,自己编写一个初始化函数,完成。

    本文中我使用的是小熊派IoT开发套件,主控芯片为STM32L431RCT6:

    移植之前需要准备一份裸机工程,我使用STM32CubeMX生成,使用USART1的查询方式发送数据、使用USART1的中断方式接收数据,参考教程:

    ① 复制源码到工程中:

    ② 新建存放实现移植接口的文件:

    ③ 在keil中添加文件,添加头文件路径:

    目录下还有头文件,添加到头文件路径中:

    ④ 编辑shell_port.c文件,实现向串口写入一个字符的接口,并编写shell的初始化函数:

    /**
     * @brief	shell移植到STM32L431时的接口实现
     * @author	mculover666
     * @date	2020/03/27 
    */
    
    #include "shell.h"
    #include <stm32l4xx_hal.h>
    #include "usart.h"
    #include "shell_port.h"
    
    /* 1. 创建shell对象,开辟shell缓冲区 */
    Shell shell;
    char shell_buffer[512];
    
    
    /* 2. 自己实现shell写函数 */
    
    //shell写函数原型:typedef void (*shellWrite)(const char);
    void User_Shell_Write(const char ch)
    {
    	//调用STM32 HAL库 API 使用查询方式发送
    	HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    }
    
    /* 3. 编写初始化函数 */
    void User_Shell_Init(void)
    {
    	//注册自己实现的写函数
        shell.write = User_Shell_Write;
    	
    	//调用shell初始化函数
        shellInit(&shell, shell_buffer, 512);
    }
    

    ⑤ 编辑shell_port.h文件,声明自己编写的初始化函数:

    #ifndef _SHELL_PORT_H_
    #define	_SHELL_PORT_H_
    
    #include "shell.h"
    
    /* 将shell定义为外部变量,在串口中断回调函数中还要使用 */
    extern Shell shell;
    
    /* 声明自己编写的初始化函数 */
    void User_Shell_Init(void);
    
    #endif /* _SHELL_PORT_H_ */
    

    ⑥ 在main.c文件的末尾编写串口中断回调函数,在接收到一个字符之后调用 shellHandler 函数进行处理,首先把头文件包含进来:

    /* USER CODE BEGIN Includes */
    #include "shell_port.h"
    /* USER CODE END Includes */
    

    接着开辟一个串口接收缓冲区(一个字符):

    /* USER CODE BEGIN PV */
    uint8_t recv_buf = 0;
    /* USER CODE END PV */
    

    然后编写回调函数

    /* USER CODE BEGIN 4 */
    /* 中断回调函数 */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        /* 判断是哪个串口触发的中断 */
        if(huart ->Instance == USART1)
        {
            //调用shell处理数据的接口
    			  shellHandler(&shell, recv_buf);
            //使能串口中断接收
    			  HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
        }
    }
    /* USER CODE END 4 */
    

    ⑥ 在main函数中使能中断接收,调用自己编写的shell初始化函数:

    /* USER CODE BEGIN 2 */
    //使能串口中断接收
    HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
    User_Shell_Init();
    /* USER CODE END 2 */
    

    至此,移植完成,编译、下载之后使用串口终端软件Mobaxterm即可看到效果:

    2.3. 宏定义配置

    letter-shell具备很多功能,可以通过宏定义来开启或者关闭,在shell_cfg.h文件中根据需要进行配置:

    在本次移植过程中,我将shell默认用户改为了mculover666,其它宏保持默认:

    #define     SHELL_DEFAULT_USER          "mculover666"
    

    3. 使用letter-shell

    3.1. 应用场景

    在嵌入式项目中,做出一个项目之后还需要用户在串口终端中进行操作,这样的情况很少,串口的作用基本都是用来在调试阶段打印信息。

    但是在调试的模组比较复杂时,比如SPI Flash、LCD屏幕这些,我希望可以在串口直接调用某几个功能函数开始执行,当移植了shell之后,在代码中只需要添加一行宏定义,就可以在串口中调用此函数开始执行,多爽!

    当然也可以在main函数中调用,然后打断点进入调试,根据个人喜好选择就行。

    3.2. 可执行命令定义宏

    这个宏可以实现将函数添加到shell的可执行命令列表中,使用时需要确保shell_cfg.h中的宏定义要开启:

    #define     SHELL_USING_CMD_EXPORT      1
    

    该宏定义的定义如下:

    /**
     * @brief shell 命令定义
     *
     * @param _attr 命令属性
     * @param _name 命令名
     * @param _func 命令函数
     * @param _desc 命令描述
     */
    #define SHELL_EXPORT_CMD(_attr, _name, _func, _desc) \
            const char shellCmd##_name[] = #_name; \
            const char shellDesc##_name[] = #_desc; \
            const ShellCommand \
            shellCommand##_name SECTION("shellCommand") =  \
            { \
                .attr.value = _attr, \
                .data.cmd.name = shellCmd##_name, \
                .data.cmd.function = (int (*)())_func, \
                .data.cmd.desc = shellDesc##_name \
            }
    

    第一个参数attr表示该命令的属性,包括命令权限和命令类型等,但是对于目前这种应用场合下多用户没什么用,所以设置为下面的值就ok:

    SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)
    

    最后需要注意一点,这个宏目前测试在MDK中可以正常使用,在IAR和GCC中请移步项目地址阅读文档。

    3.3. 调用函数示例

    在main.c文件中随便定义一个函数,然后使用宏定义导出到命令列表进行测试:

    /* USER CODE BEGIN 0 */
    int test(int i, char ch, char *str)
    {
        printf("input int: %d, char: %c, string: %s\r\n", i, ch, str);
    	
    	return 0;
    }
    
    //导出到命令列表里
    SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, test, test);
    
    /* USER CODE END 0 */
    


    有两点需要注意:

    目前支持的参数类型为整型、字符型、字符串型,不支持浮点型参数

    函数最大传入参数个数由shell_cfg.h中的宏定义配置

    
    #define     SHELL_PARAMETER_MAX_NUMBER  8
    

    所以在使用时导出到命令列表中的参数最大是 8 - 1 = 7个,测试如下:

    int test2(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8)
    {
    	printf("input int: %d, %d, %d, %d, %d, %d, %d, %d\r\n", i1, i2, i3, i4, i5, i6, i7, i8);
    	return 0;
    }
    //导出到命令列表里
    SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test2, test2, test2);
    

    执行之后失败:

    4. letter-shell设计思想解读

    4.1. 终端软件交互原理

    当我们使用诸如 mobaxterm 这类软件作为串口终端交互时,首先需要注意三点:

    ① 当在终端软件中输入一个字符时,这个字符会被直接通过串口发送,屏幕上不会显示任何东西;
    ② 如果单片机做了回显,终端软件中收到后才会显示出来;
    ③ 当在终端软件中按下回车键、退格键、删除键、四个方向键时,会直接发送其键值,单片机中靠这个键值来解析是否按下了按键。

    在lettershell中输入keys命令即可查看当前支持的按键键值解析:

    解析这些键值的源码在shell.c中,分别对应以下的函数:

    void shellUp(Shell *shell);
    ……
    void shellTab(Shell *shell);
    void shellBackspace(Shell *shell);
    void shellEnter(Shell *shell);
    ……
    

    除此之外,lettershell还支持设置快捷键来快速调用函数执行,比如这里我设置在终端中按下Ctrl+A之后调用hello函数,过程如下:

    ① 首先在串口中断中添加一行代码,查看按下Ctrl+A快捷键之后串口发送的键值:

    编译下载,在终端软件中按下Ctrl+A,得到的键值如下:

    此处需要注意,终端发送的字符串序列以大端模式表示,所以单片机解析的键值应该为0x01000000

    ② 一行代码搞定键值解析,在main文件中添加测试函数hello,并使用宏定义向lettershell中添加按键解析值:

    int hello()
    {
    	printf("Hello World\r\n");
    	return 0;
    }
    SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0), 0x01000000, hello, hello);
    

    将之前串口接收中断函数中添加的printt注释,编译,下载:

    4.2. 如何解析命令

    在letter shell中,当它接收到一个字符后,首先判断是不是特殊的按键,否则直接扔进命令解析缓冲区,因为它对左右方向键、退格键处理的比较好,相当于不停的在维护命令解析缓冲区的内容,非常整齐,解析时就变得相对容易了。

    当用户按下回车键时,首先去命令列表中匹配:

    /**
     * @brief shell匹配命令
     * 
     * @param shell shell对象
     * @param cmd 命令
     * @param base 匹配命令表基址
     * @param compareLength 匹配字符串长度
     * @return ShellCommand* 匹配到的命令
     */
    ShellCommand* shellSeekCommand(Shell *shell,
                                   const char *cmd,
                                   ShellCommand *base,
                                   unsigned short compareLength)
    

    如果匹配到之后则开始执行这条命令:

    /**
     * @brief shell运行命令
     * 
     * @param shell shell对象
     * @param command 命令
     */
    static void shellRunCommand(Shell *shell, ShellCommand *command)
    

    限于文章篇幅,具体解析的过程和方法不再深入讲述,如有兴趣可以自行研究学习,另外,=除了本文所讲述的自定义函数调用,自定义快捷键设置,letter shell还有非常多的功能,比如自定义变量查看,用户登录,用户权限,自动锁定shell等高级内容,也欢迎有兴趣的读者探索,研究!

    5. 项目工程源码获取和问题交流

    目前我将LetterShell源码、我移植到小熊派STM32L431RCT6开发板的工程、移植到STM32Nucleo-STM32G071RB开发板的工程源码上传到了QQ群里(包含好几份HAL库,QQ相对速度快点),可以在QQ群里下载,有问题也可以在群里交流,当然也欢迎大家分享出来自己移植的工程到QQ群里

    放上QQ群二维码:

    接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

    展开全文
  • 什么是shell,用途是什么?

    千次阅读 2021-06-19 20:30:38
    shell学习11、什么是shell2、什么是shell脚本3、shell的用途 1、什么是shell 1、shell是操作系统的最外层,是一个用户跟操作系统之间交互的命令解释器。 2、大多数linux默认的shell命令解释器是 bash(/bin/bash...

    1、什么是shell

       	1、shell是操作系统的最外层,是一个用户跟操作系统之间交互的命令解释器。
       	2、大多数linux默认的shell命令解释器是 bash(/bin/bash)
    	3、shell独立于内核,是链接内核和应用程序的桥梁,通俗来讲shell是内核周围的外壳
    

    在这里插入图片描述

    2、什么是shell脚本

      	hell脚本是shell命令组成的文件。换一种说法,shell脚本是利用shell的功能所写的一个程序,
     	这个程序使用纯文本文件将一些shell语法和指令写在里面,让使用者很容易的就能够一个操作执行多个命令。
    

    3、shell的用途

    	1、shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序
    	2、shell能够减少大量的重复输入和交互操作,能够进行批量的处理和自动化完成维护,减轻管理层	  
    	的负担
    
    展开全文
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项
  • UEFI shell - 简单认识

    千次阅读 2020-05-29 11:22:26
    1. UEFI shell作用 EFI Shell是EFI提供的一个交互式的命令行Shell环境,在这里你可以执行一些efi应用程序,加载efi设备驱动程序. 一般从Setup下面的Boot Manager或者快捷启动进入,其画风如下: 2. UEFI shell的加载...

    1. UEFI shell作用

    EFI Shell是EFI提供的一个交互式的命令行Shell环境,在这里你可以执行一些efi应用程序,加载efi设备驱动程序.

    一般从Setup下面的Boot Manager或者快捷启动进入,其画风如下:
    在这里插入图片描述
    在这里插入图片描述

    2. UEFI shell的加载

    在edk2下面的ShellPkg就是UEFI shell对应的开源包
    从开发者角度讲其实就是一个UEFI_APPLICATION类型的应用程序,只是它的功能比较特殊而已.
    其工程文件ShellPkg/Application/Shell/Shell.inf

    [Defines]
      INF_VERSION                    = 0x00010006
      BASE_NAME                      = Shell
      FILE_GUID                      = 7C04A583-9E3E-4f1c-AD65-E05268D0B4D1 # gUefiShellFileGuid
      MODULE_TYPE                    = UEFI_APPLICATION
      VERSION_STRING                 = 1.0
      ENTRY_POINT                    = UefiMain
    

    在我们build的OvmfPkg的dsc文件已经把shell加进去了

    !if $(TOOL_CHAIN_TAG) != "XCODE5"
    INF  ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf
    !endif
    INF  OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf
    INF  ShellPkg/Application/Shell/Shell.inf
    

    在Build/OvmfX64/DEBUG_GCC5/X64/ShellPkg/Application/Shell/Shell/OUTPUT这个目录下面把Shell.efi取出来,在虚拟机的uefi shell执行下
    在这里插入图片描述在这里插入图片描述这里就有一个疑问我们是在UEFI shell去执行这个shell.efi,但是UEFI是怎么执行到UEFI shell的呢?这个问题我们要看下BDS部分:
    UEFI系统在启动的时候,会去根据对应GUID找到shell.efi,并且创建UEFI shell的启动项,再由BDS调用
    edk2/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c

    //
      // Register UEFI Shell
      //
      PlatformRegisterFvBootOption (
        &gUefiShellFileGuid, L"EFI Internal Shell", LOAD_OPTION_ACTIVE
        );
    

    3. UEFI shell的代码实现

    shell.efi的入口函数在shell.c的UefiMain
    首先会先init各种资源

    省略...
    //
        // Now initialize the shell library (it requires Shell Parameters protocol)
        //
        Status = ShellInitialize();
        ASSERT_EFI_ERROR(Status);
    
        Status = CommandInit();
        ASSERT_EFI_ERROR(Status);
    
        Status = ShellInitEnvVarList ();
    省略...
    

    然后根据cmd进行处理

    CmdLine[BufferSize / sizeof (CHAR16)] = CHAR_NULL;
        Status = RunCommand(CmdLine);
    
    //
        // Depending on the first parameter we change the behavior
        //
        switch (Type = GetOperationType(FirstParameter)) {
          case   File_Sys_Change:
            Status = ChangeMappedDrive (FirstParameter);
            break;
          case   Internal_Command:
          case   Script_File_Name:
          case   Efi_Application:
            Status = SetupAndRunCommandOrFile(Type, CleanOriginal, FirstParameter, ShellInfoObject.NewShellParametersProtocol, CommandStatus);
            break;
          default:
            //
            // Whatever was typed, it was invalid.
            //
            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter);
            SetLastError(SHELL_NOT_FOUND);
            break;
        }
    

    从上面看:
    uefi shell下面处理主要分为两部分

    1. File_Sys_Change (改变目录)
    2. 具体操作
      1. Internal_Command (内置命令)
      2. Script_File_Name (脚本文件)
      3. Efi_Application (应用程序)
    展开全文
  • GitLab系列4 GitLab Shell

    千次阅读 2019-06-04 15:11:31
    仅允许用户执行管理员所指定的 shell 命令,达到安全控制的作用 ,如下图所示 上图主要是说,当我们在 $HOME/.ssh/authorized_keys 末尾追加如下格式的内容: # command="./cmd ssh-rsa <my-rsa-key>" command =...
  • 在解读shell之前要把bash理解一下,把它看成一种多层的模式。要清楚shell并不是某一个时间里只能存在一个的。打个比方就是,比如我们进入一个房子,看到门,打开门进去就是进入了一个环境,但是在这里我们又发现一扇...
  • Shell变量作用

    千次阅读 2019-01-28 17:06:06
    变量作用域就是变量的有效范围,shell中变量作用域有三种: 1.全局变量:在当前shell中任何地方使用的变量。 2.局部变量:只能在函数内使用的变量。 3.环境变量:可以在任何shell中使用的变量。 全局...
  • 您可能感兴趣的文章:shell脚本中28个特殊字符的作用简明总结Shell命令行中特殊字符与其转义详解(去除特殊含义)Shell脚本中的特殊字符(美元符、反斜杠、引号等)作用介绍Shell脚本中的位置变量参数(特殊字符)实例...
  • SpringBoot Shell使用简介

    千次阅读 2019-08-14 01:30:53
    SpringBoot Shell基于JLine库实现了REPL(READ EVAL PRINT LOOP) 模式的命令行工具,给我们提供了方便的使用命令行的工具。 使用入门 通过https://start.spring.io/创建SpringBoot项目,并添加依赖。 <dependency...
  • shell中$的作用

    万次阅读 2017-11-09 13:43:43
    shell中使用$符号来取一个变量的值,常见的就是$VAR,为了搞懂其它$#,$@,$0,$1,$2,$*,$$,$?的意义,我们可以写一个测试脚本运行下:#! /bin/bashVAR="Hello World!" echo "\$VAR : $VAR"echo &...
  • 区别在于invoke_shell使用SSH shell通道,而exec_command使用SSH exec通道.作为用户/开发人员对您真正意味着什么,实际上取决于SSH服务器,而不是Paramiko本身.常见的* nix OpenSSH服务器:> shell通道执行登录shell...
  • shell作用

    千次阅读 2017-09-30 10:05:37
    GUI和CLI都是shell,和其他软件不同,shell主要用来管理文件和运行程序。 为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操 作造成损害,内核的周围建了一个外壳(shell)。用户向shell提出请求,...
  • shell脚本的作用

    千次阅读 2021-01-09 16:24:46
    Shell 读取这个文件,依次执行里面的所有命令,就好像这些命令直接输入到命令行一样。所有能够在命令行完成的任务,都能够用脚本完成。 脚本的好处是可以重复使用,也可以指定在特定场合自动调用,比如系统启动或...
  • Bash Shell入门

    2018-03-23 15:23:05
    linux bash shell学习 Shell基本语法: 1. Shell脚本的第一行中的符号“#!”用来指定解释执行该脚本文件的Shell程序。如果脚 本文件中缺少该行,在执行过程中,会报出错误信息。 2. Shell脚本完成后保存为*.sh,而后...
  • linux shell while读取文件变量作用

    千次阅读 2016-04-06 17:05:58
    程序如下: -----程序开始---------- a=0 cat b.sh|while read line do  a=$(($a+1))  echo "inter:"$a done echo "outer:"$a ----程序结束----- 程序输出结果为: inter:1 ...out
  • Shell作用与分类

    千次阅读 2022-01-04 10:43:05
    1、Shell作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果。 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入。 ...
  • Jenkins中execute shell正常执行,服务未能正常启动,情况描述如下: 1.Shell脚本在Linux服务器中能正常执行 2.Jenkins中调用脚本正常执行 3.构建完成后服务未能启动 原因: Jenkins会在构建完成后使用...
  • shell学习资料

    2019-05-07 15:50:15
    shell作用和使用技巧,关于shell基础的一些东西,可以看看,希望对大家有帮助
  • Shell 冒号(:)作用

    千次阅读 2022-04-18 14:45:53
    #赋值为空 : ${var=1} echo $var #输出空 unset var echo $var var="" : ${var:=1} echo $var #输出1 而":="是变量不存在或值为空时才对其赋值 参考: shell中冒号等于用途 | 网络进行时 Shell中的冒号_...
  • 在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin...
  • shell-pop-el:shell-pop.el帮助您在Emacs上轻松使用shell。 只有一项关键行动才能发挥作用
  • Shell简介文档

    2017-01-11 16:11:10
    Shell简介
  • shell脚本中EOF的作用

    千次阅读 2020-09-28 13:34:05
    1、EOF的作用 Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。 可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。 回顾一下<...
  • paramiko模块exec_command()函数是将...invoke_shell()函数类似shell终端,可以将执行结果分批次返回,看到任务的执行情况,不会因为执行一个很长的脚本而不知道是否执行成功 exec_command() invoke_shell() ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 314,229
精华内容 125,691
关键字:

shell的作用