我正在使用 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 将插入参数。这堆栈溢出线程提供了更详细的解释。