を歓迎します。
Cでプログラムが自分のmain
機能のために、次の呼び出し規約を持っていることに留意してください:
int main(int argc, char *argv[])
これは、プログラムが個々の、個別の引数のリスト、ではないではない単一の文字列が渡されることを意味まだ解析されていません。 引数のベクトルが解析された元の文字列は、呼び出されたプログラムにまったく与えられません。しばしば、「元の文字列」は存在しません。したがって、呼び出されたプログラムには、 "ベルを解除し"、解析された文字列のリストから、生成された元の文字列に戻ることはできません。
したがって、スクリプトが外部コマンド(シェル関数とは対照的に)として呼び出された場合、オペレーティングシステムによって実行されるシェルの呼び出しは、the execve
syscallを経由します。引数は(1)実行するファイル。 (2)それを渡す引数ベクトル(つまり、前述の個々のC文字列のリスト)。 (3)環境変数のリスト。未解析のシェルコマンドラインの引数はないので、そのようなコンテンツはサブプロセスで使用できません。
ユーザーに適切な引用を使用するように指示します。
yourscript '#1234' # single quotes prevent content from being parsed as shell syntax
yourscript ''#1234 # "#" only begins a comment at the front of a string
yourscript '#'1234 # note that shell quoting is character-by-character
yourscript \#1234 # ...so either quoting or escaping only that single character suffices.
は...上記のいずれかを含むargv
を通過する(C構文で)char[][]{ "yourscript", "#1234", NULL }
任意のアイデアをリードポンド_why_:以下の全てが
yourscript
が関係している限り、完全に区別できない挙動を有するであろうこの(おそらく意図しない)副作用がありますか? –@RichardHaven、意図しない意味ですか?これはコメント構文です。 Cでコードとして解析されない '/ * something * /'や、Pythonでコードとして解析されない '#something'、C++での' something'、 '<! - 何か ' - > 'SGML-familyの言語など –
これはコマンドラインを1行のスクリプトとして扱い、8行目はその行の中で褒め言葉として解釈されます。 今すぐ取得します。ありがとう –