Bash

了解自定義 shell 中的命令行參數以及使用引號的效果

  • October 17, 2020

我正在使用 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 '

感謝@iFreilicht 和@Andy Dalton。我很傻。Bash shell 使用引號,根據參數是否用 ’ 或 " 括起來,shell 將插入參數。這個stackoverflow 執行緒提供了更詳細的解釋。

引用自:https://unix.stackexchange.com/questions/615035