linux shell 运行后没有那个文件或目录,需要怎么改?

【嵌牛导读】:Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序,shell不属于内核部分,在核心之外,以用户态方式运行,基本功能是解释并执 行用户打入的各种命令,实现用户与Linux核心的接口。系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。

【嵌牛提问】:什么是shell 它的功能与命令有哪些?

Shell是用户与操作系统之间的接口,为用户提供了使用操作系统的接口。

Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序,shell不属于内核部分,在核心之外,以用户态方式运行,基本功能是解释并执 行用户打入的各种命令,实现用户与Linux核心的接口。系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。shell的执行过程如下:

1、读取用户由键盘输入的命令行。

2、解析命令,以命令名作为文件名,并将其它参数改造为系统调用execve函数内部处理所要求的形式。

3、终端进程调用fork函数建立一个子进程。

4、终端进程本身用系统调用wait4( )来等待子进程完成(如果是后台命令,则不等待)。

当子进程运行时调用execve,子进程根据文件名(即命令名)到目录中查找有关文件,将它调入内存,执行这个程序(解释这条命令)。

5、如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait4( )等待,立即发提示符,让用户输入下一个命令,转到第1步。如果命令末尾没有&号,则终端进程要一直等待,当子进程(即运行命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。

刚接触Linux时,对shell总有种神秘感;在对shell的工作原理有所了解之后,便尝试着动手写一个shell。下面是一个从最简单的情况开始,一步步完成一个模拟的shell的过程。这个所谓的shell和主流的shell还是有不少区别的,最大的区别是它本身不能执行shell脚本、也不能对一些复杂的命令行进行分析——原因很简单,我没有写相应的解释器。如果想自己实现一个简化的shell脚本解释器,如果有编译原理的知识准备,本身不是难事,但是工作量比较大,这里就不完成了,有兴趣的可以进行尝试。

直接使用pipe()就可以了,管道的写法没什么特别,不过对于同时使用了输出重定向和管道的command1,需要把它的管道关闭,这样就会给command2发送一个EOF。

3.5 模仿,再模仿……

使用系统自带的wc,并随便编写个1.txt,测试目前的版本吧。

看上去怎么就那么别扭呢?对比一下,下图是真实的shell的行为:

这个问题的原因尝试了很久才想明白:第二个wc是第一个wc的子进程,而wshell最多只等待第一个wc,不等后一个进程结束就显示下一行提示符了!

首先想到两种解决办法:

因此,只好根据(1)的思路进行修改,为了能使用wait()/waitpid(),唯一的方法是让command1和command2都是wshell的子进程了。这样修改需要改变一部分已有逻辑关系,不过为了追求高仿,还是进行了。

嗯,还不错,这样修改后,甚至可以为command2也配置出"&"了。

4.1 和真实的shell相比,有什么不足

· 暗藏了不少bug是肯定的,毕竟调试次数还是很少;

· 内建指令不全,只实现了最常用的cd,作为示例,姑且算是足够了吧;

· 不能执行shell脚本、用户命令分析模式单一,这都是没有编写完整解释器的缘故。以前本科编译原理实验课的时候写过还算完整的一个小语言的词法分析和句法分析器,那时就写的有点吐血。当然,正则表达式这样高端的功能更是别想了。如果真写起来shell的解释器,代码量绝对比上文中的shell多。

· 异常处理机制不够健全,只有少数的异常处理,并且对不正确的用户命令也无法处理,部分还是因为解释器,另一部分是因为示例程序,我对它的健壮性就偷懒了不少;

· shell机制没模仿全,只有管道、重定向、后台执行——如果加其他功能,同样是需要扩充解释器的;

· 命令行没有历史命令,这是readline库的特性,我没有加上;

· 一些可能的性能优化没有进行,因为主要目的是展示原理,关于性能没有再做深入思考。

问题分析: 1、将windows 下编写好的SHELL文件,传到linux下执行,提示出错。 2、出错信息:bad interpreter: 没有那个文件或目录。

问题原因: 因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。脚本文件是DOS格式的 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.

解决方法: 可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的 (1) vim filename 然后用命令 :set ff 可看到dos或unix的字样,如果的确是dos格式的, 那么用set ff=unix把它强制为unix格式的,,然后存盘退出后就可运行。 转换不同平台的文本文件格式可以用 1. unix2dos或dos2unix这两个小程序来做.

另外, 当SHELL程序报告command not found时, 总是去检查一下你的PATH里面有没有程序要用到的每一个命令(没指定绝对路径的那种). 你这么小的程序, 可以一行一行核对。 附:少写一个/引发的没有那个文件或目录问题

今天在翻看以前写的简单的shell脚本时,发现一个问题:

(试试看你能否一眼看出错误)

后来几番检查发现自己写的丢了一些东西.

唉,很简单的问题,自己以前没有发现还有这样的错误! shell脚本的确好用,可唯一难的就是格式要求太高!

上传文件功能会默认将您的文件上传到 Cloud Shell 实例的$HOME 目录下。...

网站程序的目录用于上传文件时,建议您将目录权限设置为可读可写(禁止脚本执行),可降低木马、病毒恶意文件上传后被执行的风险。如果对网站程序的文件或目录设置相应权限后,网站访问出现异常,您可以将对应的文件或目录恢复为初始默认...

脚本文件管理包括新建脚本文件、编辑脚本文件执行脚本文件。在多方安全分析控制台,您需要使用 SQL 语言编辑脚本文件,并基于建模数据实现多方参与的数据安全分析。新建脚本文件登录多方安全分析控制台,并在右上角的下拉框选择需要...

本文介绍了在联合分析场景,多方安全分析控制台的操作流程。查看当前项目的分析样本和样本的安全配置,请参见 查看数据安全配置。...执行脚本文件,请参见 执行脚本文件。获取执行脚本文件后的结果,请参见 查看执行结果。

脚本类型输入配置输出配置创建联邦表原始样本(多个)联邦表(一个多个)预处理规则联邦表(一个多个)联邦表(一个多个)预处理应用联邦表(一个多个)联邦预处理规则(一个)联邦表(一个多个)模型开发联邦表(一个多个)...

您可以使用FTP客户端管理云虚拟主机上的网站文件,也可以使用Linux操作系统云虚拟主机管理控制台文件管理器来管理网站文件。本文为您介绍使用文件管理器管理网站文件的方法。前提条件 已自行准备网站文件到本地主机。背景信息

初始访问 执行 持久化 防御规避 发现 命令与控制 供应链攻击(开启供应链下载安装监控)计划任务作业(禁止下载脚本执行主机相关操作)计划任务作业(禁止下载脚本执行主机相关操作)文件或目录权限变更(禁止下载脚本执行主机相关...

脚本文件夹管理包括新建脚本文件夹、重命名脚本文件夹和删除脚本文件夹。新建脚本文件夹登录多方安全分析控制台,并在右上角的下拉框选择需要进入的项目。在 脚本文件 区域,右键点击空白区域,在弹出的右键菜单选择 新建文件夹,即可...

在联邦建模控制台,您需要通过新建脚本、编辑脚本执行脚本完成联邦建模。操作步骤在联邦建模控制台右上角的下拉框选择需要进入的项目。在 脚本文件 区域,右键单击空白区域,在弹出的右键菜单选择 新建脚本,即可弹出新建文件的...

选中文件列表需要下载的文件或目录,右键选择下载打包下载,可以下载当前选中的文件,如果是目录,下载的是当前打包的目录。压缩文件。按住ctrl键后,单击文件列表文件可以同时选中多个文件,或者单击列表的起始位置按下shift键,...

Zeppelin支持Shell脚本(以%sh开头)。与开源Zeppelin相比,E-MapReduce(简称EMR)数据开发集群的Shell解释器支持在不同EMR集群环境里切换。本文通过示例为您介绍如何在Zeppelin使用Shell。使用示例 运行hadoop命令

脚本编辑完成,通过执行脚本生成联邦建模数据、预处理规则和联邦模型。前提条件已经按照脚本类型,为脚本文件配置了输入数据和输出数据,更多信息请参见 脚本输入/输出配置说明。操作步骤脚本文件编辑完成后,单击页面右上方的 执行,即可...

执行脚本类型为 预处理规则 模型开发 脚本任务后,在其执行结果可以保存脚本执行后产出的预处理规则联邦模型。操作:单击 日志,可以查看该任务的执行日志信息,请参见 查看执行日志。单击 结果 可以查看该任务执行完成后的产出结果...

执行异常(Exception)脚本执行过程出现了异常。常见于您的脚本代码出现了逻辑错误超时,例如传入的参数错误、执行时间超过了50ms等。您可以在ES配置的扩展项中增加_es_dbg配置,并通过CDN控制台EdgeScript页面右上角的调试工具查看...

创建作业作业指提交到E-HPC集群进行高性能计算的基本工作单元,包括Shell脚本、可执行文件等,具体作业执行顺序根据您设置的队列以及调度器决定。您可以在集群使用GROMACS软件运行水分子算例。查看作业结果您可以在E-HPC管理控制台查看...

您无需对业务和镜像进行改造,只需要在Kubernetes的Deployment文件(Pod、Deployment、StatefulSet、Job等都支持)新增一个Sidecar配置,就可以将定时任务托管到SchedulerX平台,拥有白屏运维、可视化和监控报警能力。例如:批量运维:在...

任务执行路径 云助手会将用户的命令内容以文件形式先保存到实例上,然后再执行文件,具体保存路径如下:Linux:/tmp Windows:云助手安装路径/work/script 命令 需要在实例中执行的具体命令操作,如一份Shell脚本或者PowerShell脚本。...

选择 PYTHON 脚本 Shell 脚本 需要添加规则目标,用于校验用户的应用操作权限。业务应用:仅支持业务租户的用户操作。自定义服务器:操作对象无限制。选择 系统插件 需要添加操作符、目标数量以及应用,用于查询应用 POD 数。关联...

引导操作功能可以在集群扩容弹性伸缩自动在新增节点上运行指定脚本。手动执行功能,可以批量选择在已有节点上运行指定脚本,以实现个性化需求,手动执行脚本的详情,请参见手动执行脚本。引导操作类似手动执行,在集群创建...

在场景配置页签下,单击上传文件,添加JMeter脚本、JAR文件(即放置在JMeter的安装目录./lib/ext下的相关JAR文件)和其他数据文件。注意 上传的同名文件将覆盖之前上传的文件。如上传了多个JMX文件,选择一个JMX文件作为该压测场景使用的...

彻底删除目录时目录中的内容会被递归清理。单个文件系统一次只能执行一个彻底删除任务。正在彻底删除文件或目录时,无法发起新的恢复清理任务。调试 您...

单个文件系统最大文件或目录数量 14亿个 文件/目录数量随文件系统容量增长而增加,每1200 GiB容量支持约1500万文件或目录,单个文件系统上限14亿,如需更高要求,请在创建文件系统前,提交工单申请。单个目录下最大文件或目录数量 1亿 单个...

当配额为0仍然允许创建文件,但是不能向该文件中写内容。目录不占用磁盘空间,因此不计入空间配额中。命令示例 管理员命令 管理员可以通过以下命令来管理额度:设置目录的名称配额为N。hdfs

本文介绍如何将告警信息推送至邮箱集成。场景在服务器上产生异常推送至邮箱通知是常见场景,本文介绍将以一段包含关键指标/异常信息的日志推送至邮箱集成为例,在运维...脚本执行时将会把test.log的日志推送到邮件集成。查看邮件集成告警记录

本文介绍在Windows操作系统,如何以AD域身份挂载SMB文件系统。以及挂载成功后,如何以AD域身份访问SMB协议文件系统,查看和编辑文件或目录的ACL。前提条件 SMB文件系统挂载点已接入AD域。具体操作,请参见将SMB文件系统挂载点接入AD域。...

脚本执行目录用于输入执行自定义Shell脚本的本地目录。cocoapods在iOS场景下,用于安装/更新pods依赖。选项说明xcodeproj目录用于设置工程根目录到xcodeporj目录的相对路径。deintegrate

Cloud Shell内置可视化代码编辑器。简化版WebIDE的设计,让...打开后,如下图:2)使用代码编辑器浏览$HOME文件目录以及查看和编辑文件,在页面下方继续使用Cloud Shell。说明 通过 Cloud Shell 绑定存储空间,您编辑的文件可以进行永久存储。

我要回帖

更多关于 linux简单的shell编程 的文章

 

随机推荐