このサイトには、インタープリタータグでのさまざまな言語の実装に関連する多くの問題がありました。ただし、実際にはそれらはすべて、誰も使用しない難解な言語でした。ここのユーザーのほとんどがおそらく既に知っている実用的な言語の通訳を作成する時間です。はい、タイトルの読みに問題がある場合(あなたが持っているのではない)のシェルスクリプトです。(はい、GolfScriptやBefungeなどの言語がすべてを獲得するのにうんざりしているので、私は意図的にこの挑戦をしました。そのため、より実用的なプログラミング言語が勝つ可能性が高い場合に挑戦をしました)
ただし、シェルスクリプトは比較的大きな言語であるため、実装を求めません。代わりに、シェルスクリプト機能の小さなサブセットを作成します。
私が決めたサブセットは次のサブセットです。
- プログラムの実行(ただし、単一引用符が許可されている場合でも、プログラムには文字のみが含まれます)
- プログラム引数
- 単一引用符(空白を含む印刷可能なASCII文字を受け入れ、単一引用符を除く)
- 引用符で囲まれていない文字列(ASCII文字、数字、ダッシュを許可)
- パイプ
- 空のステートメント
- 改行で区切られた複数のステートメント
- 末尾/先頭/複数のスペース
このタスクでは、STDINから入力を読み取り、要求されたすべてのコマンドを実行する必要があります。POSIX互換のオペレーティングシステムを安全に想定できるため、Windowsなどの移植性は必要ありません。他のプログラムにパイプされていないプログラムは、STDINから読み取らないと安全に想定できます。コマンドが存在すると仮定しても安全です。他に何も使用されないと想定しても安全です。何らかの安全な仮定が破られていれば、何でもできます。最大15個の引数と512文字未満の行を安全に想定できます(明示的なメモリ割り当てなどが必要な場合-Cがまだ小さい場合でも、Cで勝つ可能性はほとんどありません)。ファイル記述子をクリーンアップする必要はありません。
すべての行を受信した後、またはSTDINが終了した後でも、いつでもプログラムを実行できます。必要なアプローチを選択してください。
シェルをテストできるシンプルなテストケース(3番目のコマンドの後に続く空白に注意してください):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
上記のプログラムは、次の結果を出力するはずです。
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
コマンドの引数がない場合を除き、シェル自体を実行することはできません(この例外はPerlで作成されたものでsystem
、引数をに入れるだけでシェルでコマンドを実行しますが、言語も、文字を保存する方法でそれを行うことができる場合)、または実行するコマンドはシェル自体です。多くの言語にはsystem
シェルを実行する関数があるため、これはおそらくこの課題における最大の問題です。代わりにsubprocess
、Pythonのモジュールのようなプログラムを直接呼び出す言語APIを使用します。とにかく、これはセキュリティにとっては良い考えです。そして、安全でないシェルを作成したくないでしょうか?これはおそらくPHPを停止しますが、とにかく選択する他の言語があります。
あなたはシェルスクリプトでプログラムを作成しようとしている場合は、使用を許可されていないeval
、source
または.
(機能、いない文字、のように)。私の意見では、それは挑戦をあまりにも簡単にするでしょう。
巧妙なルールの乱用が許可されています。私が明示的に禁止したことはたくさんありますが、あなたが私が許可していないことをまだ許可されていると確信しています。私のルールを人々がどのように解釈しているかに驚かされることがあります。また、私が言及していないことは何でもできるということを忘れないでください。たとえば、変数を使用しようとすると、ハードディスクを消去できます(ただし、しないでください)。
これがcodegolfであるため、最短のコードが優先されます。