我是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
相同,不应该它吗?
答案 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无法读取该文件。