首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么"/bin/sh ls“不执行ls?

为什么"/bin/sh ls“不执行ls?
EN

Stack Overflow用户
提问于 2020-09-15 12:21:45
回答 3查看 1.5K关注 0票数 1

我对shell很陌生,如果我的问题太基础了,很抱歉。我正在使用Bash,下面是我尝试过的触发命令的不同方式:

代码语言:javascript
运行
复制
ls               // of course it works :)

/bin/sh ls       // error,  ")" unexpected

/bin/sh -c ls    // work just like `ls`

那么,为什么/bin/sh ls不能工作呢?当我使用ls时,ls不是/bin/目录中的一个可执行对象,所以ls应该和/bin/sh ls一样,不是吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-15 13:24:23

为什么/bin/sh ls不工作?

posix手册sh的相关部分

sh -abCefhimnuvx..。+abCefhimnuvx[command_file论点.] -c -abCefhimnuvx..。+abCefhimnuvxcommand_string [command_name论点.] -s -abCefhimnuvx..。+abCefhimnuvx争论..。sh实用程序是命令语言解释器,它将执行从命令行字符串、标准输入或指定文件读取的命令。应用程序应确保要执行的命令用Shell命令语言描述的语言表示。-c从command_string操作数读取命令。..。 -s从标准输入读取命令。 如果没有操作数且未指定-c选项,则应假定为-s选项。command_file包含命令的文件的路径名。……

以下方面:

代码语言:javascript
运行
复制
 /bin/sh ls

案件属于sh command_file案件。然后,命令文件应该包含由shell解释的shell命令。但是ls是一个可执行文件,很可能是ELF可执行格式--与换行符分隔的shell命令不太接近--所以shell存在解析器错误。

当我使用ls时,ls不是/bin/目录中的一个可执行对象,所以ls应该与/bin/sh目录相同,不是吗?

不是的。

在shell中以不同的方式调用命令时的不一致性?

不是的。通常,解释器和编译器的编写方式是将文件传递给它们。当您将文件传递给解释器或编译器时,就像执行gcc file.c时一样,您期望用C编程语言编写file.c,并将其编译成可执行文件。当您编写python file时,file应该是用programming语言编写的。同样,当您编写sh file文件时,不管它是什么,(在现代/ POSIX操作系统上)都需要用包含符合POSIX的shell命令的POSIX shell语言编写,而不是作为shell命令本身。

票数 4
EN

Stack Overflow用户

发布于 2020-09-15 13:30:10

/bin/sh ls使sh打开ls并逐行读取它,以便执行shell命令。

/bin/sh -c ls使sh执行命令行ls

在某种意义上,您可以认为/bin/sh ls相当于

代码语言:javascript
运行
复制
/bin/sh -c 'while IFS= read -r line; do eval "$line"; done < ls'
票数 2
EN

Stack Overflow用户

发布于 2020-09-15 13:37:02

/bin/sh希望获得一个脚本文件作为参数(当没有提供更多的选项时),即包含Shell命令的文本文件。ls是一个二进制文件,不能被Shell读取。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63901732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档