Cを使用してカスタムシェルを作成しており、解析、フォークと実行、パイピング、リダイレクトなどを正常に実行しています。特定のタイプのコマンドが私のシェルを捨てているようです。
Bashシェルでは、次のコマンドが機能します。
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 コマンドは動作し、2 番目のコマンドは以下のように失敗します。
sed: 1: "'s/a/b/g'": invalid command code '
これがシェルからコマンドを分岐して実行する方法です。
execvp(qualifiedPath, arguments)
上記のコマンドでは、qualifiedPath"/usr/bin/sed"
とパラメータは文字ポインタで終わる配列です(例:最初のNULL
コマンドの場合は、、、2番目のコマンドの場合、、、、)。
[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シェルは引用符を使用し、引数が 'または'で囲まれているかどうかに応じて、シェルが引数を挿入します。スタックオーバーフロースレッドより詳細な説明が提供される。