了解自定义 shell 中的命令行参数以及使用引号的效果

了解自定义 shell 中的命令行参数以及使用引号的效果

我正在使用 C 语言创建一个自定义 shell,并且我成功地进行了解析、fork 和 exec、管道、重定向等。我注意到一种特殊类型的命令似乎正在抛出我的 shell。

在 bash shell 中,以下命令有效。

bash> echo "abc" >> tempFile
bash> sed  s/a/b/g  tempFile
bash> sed  's/a/b/g'  tempFile

在我的自定义外壳中,

mysh> sed  s/a/b/g  tempFile
mysh> sed  's/a/b/g'  tempFile

第一个 sed 命令有效,第二个命令失败,如下所示

sed: 1: "'s/a/b/g'": invalid command code '

这就是我在 shell 中分叉并执行命令的方式。

execvp(qualifiedPath, arguments)

在上面的命令中,qualifiedPath"/usr/bin/sed"和参数都是NULL字符指针终止数组,例如 第一个命令的 [0] = "sed", [1] = "s/a/b/g", [2] = "TEMP", 和第二个命令的 , , , 。 [3] = (char*)NULL[0] = "sed"[1] = "'s/a/b/g'"[2] = "TEMP"[3] = (char*)NULL

有谁知道为什么单引号导致 exec 失败,并且也观察到相同的行为

mysh> sed  "s/a/b/g"  tempFile
sed: 1: "'s/a/b/g'": invalid command code '

答案1

感谢@iFreilicht 和@Andy Dalton。我真是太傻了。 Bash shell 使用引号,并根据参数是否用 ' 或 " 括起来,shell 将插入参数。这堆栈溢出线程提供了更详细的解释。

相关内容