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