linux的csh shell运行,Shell基础知识10分钟入门篇-程序员宅基地

技术标签: linux的csh shell运行  

shell 英文含义是“壳”,这是相对于内核来说的,shell 也确实就像是内核的壳,通常来说,所有对内核的访问都要经由 shell 。同时,shell 还是一门功能强大的编程语言。shell 是 Linux 学习中必然要经过的一环。实际上,Linux 系统在启动完成,登录成功后运行的第一个程序就是一个 shell ,Linux 的许多功能都可以从 shell 中轻松实现。

一、什么是 shell

UNIX / Linux 系统在逻辑上可以分为两部分:内核和实用工具。shell 其实就是一个实用工具,准确的说,shell 是一个作为用户与 Linux 系统间接口的程序,它允许用户向操作系统输入需要执行的命令。

1.1 命令解释器 shell

shell 是一个命令解释器,可以将用户输入的命令翻译成内核可以识别的代码,然后由内核去控制硬件;而内核则可以通过 shell 将硬件信息翻译成用户可识别的代码,展现给用户。可以用下图大致表达一下 shell 与内核以及其他实用工具之间的关系:

f50936f252af8f1e7e8ad7b80d89f24b.png

Linux 提供了多种版本的 shell 供用户选择使用,它们大多数都是从最初的 Bourne shell(sh) 演变而来。在 Linux 中,最常用的 shell 是 bash(Bourne-Again Shell), /bin/bash 也是多数 Linux 系统的默认 shell。bash 是开源的,基于 GNU,且符合 POSIX 标准,因此可以被移植到几乎所有的类 UNIX 系统上,本文所使用的 shell 也是 bash。在大多数的 Linux 发行版中,默认的 shell 程序 /bin/sh 实际上是对程序 /bin/bash 的一个连接。

除此之外,还有许多其他的 shell 可以使用。 常用的 shell 有以下几种:

shell 名称

描述

sh (Bourne shell)

源于UNIX早期版本的最初的 shell

csh、tcsh、zsh

C shell 及其变体

ksh/pdksh

korn shell 和它的公共域兄弟 pdksh(public domain korn shell),是许多商业版本 UNIX 的默认 shell

bash(Bourne-Again shell)

l来自 GUN 项目,是 Linux 的主要 shell,它是开源的,且具有很高的移植型,与 kron shell 有许多相似之处

可以使用下面的命令来查看系统的默认 shell:

[linuxmi@localhost ~]$ echo $SHELL

/bin/bash

[linuxmi@localhost ~]$ bash --version

GNU bash, version 4.2.46(2)-release (x86_64-RedHat-linux-gnu)

Copyright (C) 2011 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software; you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

[linuxmi@localhost ~]$

复制代码

如上,笔者的系统中的默认 shell 是 bash,使用 bash --version 命令查看 bash 的版本,可以看到 GNU 证书。

在 Linux 系统中安装多个 shell 是完全可行的,用户可以挑选一种自己喜欢的 shell 来使用,使用下面命令可以查看系统中有多少可以使用的 shell:

[linuxmi@localhost ~]$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

复制代码

可以看到,系统中可用的 shell 有 sh 和 bash。同时,我们还发现有一个特殊的家伙混了进来:sbin/nologin。这其实也是一个 shell,使用这个 shell 的用户不允许登录当前系统,即使有密码也不行。不过,虽然无法登入系统,但是用户还是可以使用其他的系统资源的,许多系统账户都是使用的这个  shell,如 ftp、mail 等,它们只需要使用系统资源,而不需要登入系统,设置成使用 sbin/nologin 可以使系统更安全。

想要切换到另一个 shell 也很简单,直接运行这个 shell 就行,比如,笔者的系统上默认 shell 是 bash,如果我想要切换到 sh 的话,直接在命令行输入:/bin/sh 即可切换到 sh,再输入 exit 即可退出 sh 回到 bash:

[linuxmi@localhost ~]$ /bin/sh

sh-4.2$

sh-4.2$ exit

exit

[linuxmi@localhost ~]$

如果用户想使用 csh 或者 ksh 而系统中没有这个 shell 的话,也可以使用 yum 在线安装获得它们:

[linuxmi@localhost ~]$ sudo yum install csh

[linuxmi@localhost ~]$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

复制代码

安装完成后再使用 cat /etc/shells 查看,可以发现 csh 已经可以使用了。

1.2 编程语言 shell

shell 还是一种功能强大的解释型编程语言,使用 shell 来执行 shell 程序,这些程序通常被称为脚本,它们是在运行时解释执行的。这使得调试工作比较容易进行,因为你可以逐行的执行指令,而且节省了重新编译的时间。然而,这也使得 shell 不适合用来完成时间紧迫型和处理器忙碌型的任务。shell 非常适合于编写一些执行相对简单的任务的小工具,它们更强调的是易于配置、易于维护和可移植性,而不是很看重执行的效率。

二、解释型语言与编译型语言

2.1  解释型语言

解释型语言的源代码不是直接翻译成机器语言的,而是先翻译成中间代码,再由解释器对中间代码进行解释运行(解释器一般是用编译型语言编写的程序)。解释型语言编写的程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次,因此效率较低,依赖于解释器。但是,也正是由于解释的特性,使得这种语言编写的程序可移植性很好,只要有相应的解释环境,就可以在不同的操作系统上运行。常见的解释型语言有 Shell、Python、Ruby等。

2.2 编译型语言

编译型语言在执行之前需要先进行编译,将程序直接编译成机器语言,然后直接运行即可,不需要再进行翻译。这种程序执行效率高,依赖于编译器,跨平台性要弱一点。常见的 C、C++等都是编译型语言。

三、为什么要使用 shell 脚本

1)简单性

shell 脚本可以很简单的对文件、目录层次的内容进行操作,使用 shell 脚本将使得许多事情变得十分简洁;

2)可移植性

shell 脚本的可移植性非常好,因为它是遵循 POSIX 标准的,基本上无需修改就可以在不同的系统上执行;

3)易于开发

shell 脚本易于开发,你可以在一个较短时间内完成一个功能强大又好用的脚本。

四、如何编写一个 shell 脚本

4.1 先从最简单的 shell 脚本说起

假如我想要使用 shell 脚本在终端打印一串字符:Hello world! 可以这样编写 shell 脚本:

#!/bin/bash

# 这是一个 shell 脚本,脚本将打印 Hello world! 这个字符串

echo Hello world!

exit 0

将文件保存为 hello.sh 后退出,这就是一个简单的 shell 脚本了。虽然 Linux 中并不依靠后缀名来识别文件,但是最好还是加上一个 .sh 的后缀,以方便用户识别这是一个 shell 脚本。

在 shell 脚本中,# 符号表示这一行接下来的语句是注释。注意,第一行中的 #!/bin/bash 是一个特殊形式的注释, #! 告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。在这里,这一句的作用是告诉系统这个文件是一个 shell 脚本,默认 shell 是 /bin/bash。shell 脚本都是以这个语句作为开始的。

由于脚本程序本质上被看作是 shell 的标准输入,所以它可以包含任何能够通过你的 PATH 环境变量引用到的 Linux 命令。因此,在该脚本中,直接使用 echo 命令来打印一串字符。由于能够直接在脚本中使用 Linux 命令,因此许多操作将会变得简单易行,这也是为什么 shell 脚本易于开发。

exit 命令的作用是确保脚本程序能够返回一个有意义的退出码,这个以后再详细说明。

4.2 执行一个 shell 脚本

在上一节,我们编写了一个简单的 shell 脚本,现在来尝试运行这个脚本。运行一个脚本很简单,只需要在该脚本所在目录下从命令行输入:

./shell脚本名

这样就能执行脚本了。使用 ./ 是为了把 shell 脚本所在相对路径告诉 shell,以便 shell 根据路径找到脚本。当然,使用绝对路径也是可以的。

但是,按照上述方法在命令行输入指令后,发现脚本并没有被执行。这是因为刚新建好的脚本还不具有可执行权限:

[linuxmi@localhost ~/Shell_Program]$ ls -l | grep hello.sh

-rw-rw-r-- 1 linuxmi tongye    38 Sep 26 15:03 hello.sh

使用 ls -l 命令查看脚本文件的属性,可以发现该脚本是没用可执行权限的,我们可以使用 chmod 指令来给文件赋予可执行权限:

[linuxmi@localhost ~/Shell_Program]$ chmod +x hello.sh

[linuxmi@localhost ~/Shell_Program]$ ls -l | grep hello.sh

-rwxrwxr-x 1 linuxmi tongye    38 Sep 26 15:03 hello.sh

再次查看,发现文件有了可执行权限,然后再执行脚本文件,即可得到想要的结果:

[linuxmi@localhost ~/Shell_Program]$ ./hello.sh

Hello world!

0b1331709591d260c1c78e86d0c51c18.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39639643/article/details/116639188

智能推荐

串口屏如何配置波特率_淘晶池串口屏下拉栏-程序员宅基地

文章浏览阅读1.1k次。串口屏如何配置波特率在Program.s中配置bauds=你需要的波特率记住要写在page指令之前,page指令之后的代码是不会执行的_淘晶池串口屏下拉栏

chatgpt赋能python:Python数据预处理技术与实践-程序员宅基地

文章浏览阅读270次,点赞3次,收藏8次。数据预处理是指在进行数据分析和挖掘之前,对原始数据进行整理、清理、转换和集成的过程,以便于后续分析和挖掘。数据预处理是数据挖掘和机器学习的关键步骤,对数据分析和挖掘的结果具有重要的影响。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。

i5 10500和i5 10400哪个好-程序员宅基地

文章浏览阅读5.3k次。酷睿i5-10500基于祖传的14nm++制程工艺,全新的LGA 1200接口设计,拥有6核12线程,默认主频3.1Ghz,最大睿频4.5Ghz,三级缓存为12MB,不支持超频,设计功耗65W,内置了UHD630核心显卡选i5 10500还是i5 10400这些点很重要!看完你就知道了https://list.jd.com/list.html?酷睿i5-10400cpu具备超线程设计,线程数增加了一倍,Comet Lake-S处理器非K系列的处理器TDP为65W,而K和KF系列处理器将提高至125W_i5 10500和i5 10400哪个好

python自动化RobotFramework中Collections列表关键字使用(四)_robotframe的get match count的用法-程序员宅基地

文章浏览阅读185次。安装好robotframework库后,跟之前文章介绍的BuiltIn库一样BuiltIn库使用介绍,在“python安装目录\Lib\site-packages\robot\libraries”中有一个常用库Collections.py,主要用于操作列表和字典。打开客户端ride后,BuiltIn模块是默认导入,可直接使用,而其他模块或者第三方模块/包都需要import才能被使用。我们可以在测试套件和resource文件中导入这些模块或者包,两者导入的方式是一样的。_robotframe的get match count的用法

slider控件的简单使用_access 窗体中的slider 控件-程序员宅基地

文章浏览阅读4.9k次。如何使用slider控件绑定编辑框,使编辑框的内容随slider滑块的滑动而改变数值就像下面的图片上一样首先在主对话框上拖入一个slider控件,和编辑框控件。分别为两个控件绑定一个变量。为slider控件绑定一个控制事件 NM_COSTUMDRAW.然后在主对话框初始化函数中添加以下代码 m_slider.SetRange(0, 40); m_slider.SetLineSize..._access 窗体中的slider 控件

基于java的文章发布系统设计与实现_java实现发布任务-程序员宅基地

文章浏览阅读316次。基于Java的文章发布系统设计与实现的性能评估是对系统在特定工作负载下的响应速度和资源利用率进行评估和分析,旨在验证系统是否能够满足用户在实际使用中的性能需求。1、并发性能评估:并发性能是指系统在多用户同时访问的情况下的表现。通过模拟多个用户同时进行操作,评估系统的并发性能。可以观察系统是否能够正确处理并发请求,同时保持较好的响应速度。通过增加并发用户数,可以评估系统的并发处理能力和性能瓶颈。在本系统的性能测试中,通过不断增加并发用户数,测试系统的并发处理能力和性能瓶颈。_java实现发布任务

随便推点

图的m着色问题c语言源代码,已知如下递归代码用于求解图的m着色问题:#define&nb...-程序员宅基地

文章浏览阅读240次。#includeusingnamespacestd;intv,e,graph[100][100];//v顶点数,e边数,graph图的邻接矩阵intc,color[100];//c颜色数color当前边的颜色intsum=0;//着色方法的数目//判断当前位置的颜色是否和相邻位置颜色重复boolok(intcur){for(inti=1;i<=v;i++){i..._以下代码是图的m着色问题递归搜索核心代码,根据代码判断空缺部分的填写是否正

JQuery简单的登录注册验证_通过jquery实现用户注册身份验证,当每个文本框失去焦点时进行该文本框内容校-程序员宅基地

文章浏览阅读4.4k次,点赞4次,收藏19次。当文本框失去焦点时进行判断,如果内容为空则给出提示。_通过jquery实现用户注册身份验证,当每个文本框失去焦点时进行该文本框内容校

Matlab中的meshgrid函数-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏23次。参考:https://blog.csdn.net/hhhhhyyyyy8/article/details/76209094matlab函数手册meshgrid是Matlab中用于生成网络采样点的函数。常用于3d绘图。调用方式:[X, Y]=meshgrid(xgv,ygv);复制网格向量xgv和ygv生成矩阵网格(X,Y)的坐标输出X,Y为维度相同的矩阵。令nx,ny 分别为向量xgv,ygv中数的个数,那么xgv被复制ny次以形成X的列,ygv被复制nx次形成Y的行。示例:[X, Y,_matlab中的meshgrid函数

自定义IDEA代码补全插件_idea 代码补全插件-程序员宅基地

文章浏览阅读1.6k次,点赞19次,收藏22次。背景:通过自定义Idea插件了解开发工具的插件如何工作,提高我们的工作效率。目标:需要一款插件,当我们输入字符时能自动提示包含这个字符的静态方法,选中后自动完成代码,并引入静态类。设计:初步构想,存储所有静态方法,当用户输入时使用自动弹窗显示候选方法。因为有可能并不是所有的静态方法都需要调用,所以可以只遍历用户自定义的文件位置。我们将上述的步骤分解:需要在设置页视图化操作,让用户选中文件位置,为后面遍历方法做准备..._idea 代码补全插件

其中关于unity清空txt文本的坑(个人笔记)写得比较乱-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏3次。我做了一个在线验证,和服务器连接的在线激活在线解绑定的demo:大概是这样的。 在线方式:场景1:客户端发送:a=1&amp;设备号给服务端,服务端判断,返回1(设备号存在,验证成功)返回2(设备号不存 在,验证失败)场景2:客户端发送:a=2&amp;设备号&amp;激活码给服务端,服务端判断,返回1(激活码不正确)返回2(激活成功并绑定设备号)返回3(激活码重复绑定)场景3..._unity清空txt

Meltdown使系统调用变得更加昂贵。 如何避免它们?-程序员宅基地

文章浏览阅读71次。当然,您现在已经听说过Meltdown。 这是一个硬件漏洞,它允许未经授权的进程访问特权内存。 它影响自1995年以来生产的英特尔处理器。以下是一些详细信息: https : //en.wikipedia.org/…/Meltdown_(security_vulnerability) 解决此问题的唯一有效方法是对操作系统的内核(Linux,Windows,macOS)应用补丁,这将显着增加系统..._meltdown预防