3

Common Lisp でユーティリティ プログラムを作成し、Clozure CL でビルドしています。プログラムでコマンドライン オプションを使用できるようにしたいのです-dが、何らかの理由でこの特定のオプションが(ccl::command-line-arguments). 最小限の例を次に示します。

(defun main ()
  (format t "~s~%" (ccl::command-line-arguments))
  (quit))

でコンパイルしました

(save-application "opts"
  :toplevel-function 'main
  :prepend-kernel t)

出力例を次に示します。

~/dev/scratch$ ./opts -c -a -e
("./opts" "-c" "-a" "-e")
~/dev/scratch$ ./opts -c -d -e
("./opts" "-c" "-e")
~/dev/scratch$ ./opts -b --frogs -c -d -e -f -g -h --eye --jay -k -l
("./opts" "--frogs" "-c" "-e" "-f" "-g" "-h" "--eye" "--jay" "-k" "-l")

とオプションが失われているようです-bのコマンドライン引数に関する-dドキュメントはあまり役に立ちません。たぶんそれ自体が引数として取るため、そのオプションは何らかの理由で食べられたのではないかと思いましたが、それかかりません(食べられます)、そしてかかりますが、かかりません。アプリケーションの保存については何も役に立たないようでした。cclccl-b-d-e-l

他のものがすべての引数を取得しているように見えるため、Clozure固有のものであると確信しています(たとえば、シェルがそれらを食べているわけではありません)。

#!/usr/bin/python
import sys
print sys.argv

収量

~/dev/scratch$ ./opts.py -a -b -c -d -e
['./opts.py', '-a', '-b', '-c', '-d', '-e']

#!/bin/bash
echo "$@"

与える

~/dev/scratch$ ./opts.sh -a -b -c -d -e
-a -b -c -d -e

これはすべて、シェルとしてlubuntu 15.10で行わbashれています。

なぜこれが起こっているのか、またはすべてのコマンドラインスイッチをどのようにして終わらせることができるのか、誰かが光を当てることができれば、私は感謝しています.

ありがとう。

4

1 に答える 1

2

1.11 リリースのソース コードによると、-b-dは、lisp カーネルで使用されるオプションです。

ライセンスの問題がよくわからないので、関連ファイルへのリンクを提供します: http://svn.clozure.com/publicsvn/openmcl/release/1.11/source/lisp-kernel/pmcl-kernel.c

コマンド ライン引数は関数process_optionsで処理されます。ここで、オプション-b( --batch) および-d( --debug) については、特に変数num_elideが 1 に設定されます。少し下に行くと、オプションが次の引数 ( argv[k] = argv[j];) で上書きされます。

コードは可能な修正も示しています:または--の前に引数として (2 つのダッシュ) を 1 回指定します。上記の関数が に遭遇すると、残りの引数の処理を停止します。そのため、それらは変更されずに残され、その後すぐに「lisp の世界」に取り込まれる可能性があります。-b-d--


これは以前にSOですでに解決されていることがわかりました: https://stackoverflow.com/a/5522169/1116364

于 2016-04-20T23:39:51.657 に答える