我对shell很陌生,如果我的问题太基础了,很抱歉。我正在使用Bash,下面是我尝试过的触发命令的不同方式:
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
一样,不是吗?
发布于 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包含命令的文件的路径名。……
以下方面:
/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命令本身。
发布于 2020-09-15 13:30:10
/bin/sh ls
使sh
打开ls
并逐行读取它,以便执行shell命令。
/bin/sh -c ls
使sh
执行命令行ls
。
在某种意义上,您可以认为/bin/sh ls
相当于
/bin/sh -c 'while IFS= read -r line; do eval "$line"; done < ls'
发布于 2020-09-15 13:37:02
/bin/sh
希望获得一个脚本文件作为参数(当没有提供更多的选项时),即包含Shell命令的文本文件。ls
是一个二进制文件,不能被Shell读取。
https://stackoverflow.com/questions/63901732
复制相似问题