2017-12-06 46 views
0

私はdebianストレッチを行い、安定したリポジトリからCMUCLをインストールします。次cmucl:実行プログラムの出力プロセスが終了しました

(run-program "sh" '("ls") :output T) 

をしようとすると、私は期待される出力なし

#<process 2845 :EXITED>

を取得します。助けてください?

+0

Debianにパッケージ化されている 'sbcl'を考慮する必要があります。 –

+2

はい、sbclはよりアクティブで人気がありますが、他の実装を使用しないようにしてください。 Common Lispエコシステムは、複数のオープンソース実装を持つことが重要です。 – Svante

答えて

3

Read ls(1)およびdash(1) & bash(1)POSIX /bin/shは、多くの場合、その1つのシンボリックリンクです(多くの場合、dash、時にはbash)。 の役割にご注意ください(例:shellsexecvp(3))。そして、system(3)はと-cを使用しており、sh(POSIXシェルであると仮定します)には、文字列をコマンドとして解釈するのに-cが必要です。

あなたは

(run-program "/bin/ls" nil :output t) 

または

(run-program "/bin/sh" '("-c" "ls") :output t) 

を試みることができるあなたはおそらくあなたのworking directorylsを持っていない(ただし、どこかあなたのPATHで、POSIX上で、それは/bin/lsする必要があります)と/bin/lsされますshell scriptではなく、ELF実行可能ファイル(Linuxの場合、ほとんどのUnixでは、それはexecutableであり、スクリプトではありません) t)。したがって、/bin/sh ls(またはsh ls)は、あなたが望むように動作することはできません。

lsを実行するには、シェルを起動する必要はありません。 opendir(3)readdir(3)stat(2)FFIと呼び出すことができます(または、someパッケージを実行していることがわかります)ので、lsプロセスをフォークする必要はありません。

PS。私はこれらをテストするためにSBCLを使用しました。

+0

答えに感謝します。 'ls'はほんの一例でした。私は最終的にシェルで他のタスクを実行したいと思います。しかし、私は期待した結果を得ている。例えば ​​'(run-program"/bin/sh "(" cat "" 'hello'> "test1.txt"):output t) 'は私が理解できる限りtest1.txtというファイルを書きます。 – DJJ

関連する問題