私はdebianストレッチを行い、安定したリポジトリからCMUCLをインストールします。次cmucl:実行プログラムの出力プロセスが終了しました
(run-program "sh" '("ls") :output T)
をしようとすると、私は期待される出力なし
#<process 2845 :EXITED>
を取得します。助けてください?
私はdebianストレッチを行い、安定したリポジトリからCMUCLをインストールします。次cmucl:実行プログラムの出力プロセスが終了しました
(run-program "sh" '("ls") :output T)
をしようとすると、私は期待される出力なし
#<process 2845 :EXITED>
を取得します。助けてください?
Read ls(1)およびdash(1) & bash(1)。 POSIX /bin/sh
は、多くの場合、その1つのシンボリックリンクです(多くの場合、dash
、時にはbash
)。 の役割にご注意ください(例:shells、execvp(3))。そして、system(3)はと-c
を使用しており、sh
(POSIXシェルであると仮定します)には、文字列をコマンドとして解釈するのに-c
が必要です。
あなたは
(run-program "/bin/ls" nil :output t)
または
(run-program "/bin/sh" '("-c" "ls") :output t)
を試みることができるあなたはおそらくあなたのworking directoryでls
を持っていない(ただし、どこかあなたの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を使用しました。
答えに感謝します。 'ls'はほんの一例でした。私は最終的にシェルで他のタスクを実行したいと思います。しかし、私は期待した結果を得ている。例えば '(run-program"/bin/sh "(" cat "" 'hello'> "test1.txt"):output t) 'は私が理解できる限りtest1.txtというファイルを書きます。 – DJJ
Debianにパッケージ化されている 'sbcl'を考慮する必要があります。 –
はい、sbclはよりアクティブで人気がありますが、他の実装を使用しないようにしてください。 Common Lispエコシステムは、複数のオープンソース実装を持つことが重要です。 – Svante