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

时间:2020-09-15 12:21:45

标签: linux bash shell

我是Shell的新手,如果我的问题太简单了,抱歉。我使用的是Bash shell,下面是触发尝试过的命令的不同方式:

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相同,不应该它吗?

3 个答案:

答案 0 :(得分:4)

为什么/ bin / sh ls不起作用?

posix manual sh中的一些相关部分:

sh [-abCefhimnuvx] [-o选项] ... [+ abCefhimnuvx] [+ o选项] ... [command_file [argument ...]]

sh -c [-abCefhimnuvx] [-o选项] ... [+ abCefhimnuvx] [+ o选项] ... command_string [command_name [argument ...]]

sh -s [-abCefhimnuvx] [-o选项] ... [+ abCefhimnuvx] [+ o选项] ... [参数...]

sh实用程序是命令语言解释器,它将执行从命令行字符串,标准输入或指定文件读取的命令。应用程序应确保要执行的命令以Shell命令语言中描述的语言表示。

-c 从command_string操作数读取命令。 [...]

-s 从标准输入读取命令。

如果没有操作数并且未指定-c选项,则应采用-s选项。

command_file 包含命令的文件的路径名。 [....]

该:

 /bin/sh ls

case属于sh command_file的情况。然后,命令文件应包含要由外壳程序解释的外壳程序命令。但是ls是可执行文件,很可能是ELF可执行文件格式-靠近换行符分隔的shell命令不远-因此,shell会因解析器错误而退出。

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

否。

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

不。通常,解释器和编译器的编写方式是将文件传递给它们。当您将文件传递给解释器或编译器时,例如执行gcc file.c时,您期望file.c用C编程语言编写,并将被编译成可执行文件。当您编写python file时-应该使用Python编程语言来编写file。无论使用什么(在现代/ POSIX操作系统上)编写文件,sh file都应使用包含POSIX兼容shell命令而不是shell的POSIX sh shell语言编写。命令本身。

答案 1 :(得分:2)

browserIE.Navigate(authURL); private void browserIE_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { this.Cursor = Cursors.WaitCursor; //Continously checking for Token ID while loading the document in Browser gettoken(); } 使/bin/sh ls打开sh并逐行读取以执行Shell命令。

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

从某种意义上讲,您可以认为ls等同于

/bin/sh ls

答案 2 :(得分:0)

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

相关问题