GNU LilyPond – アプリケーション使用方法: 1.2 コマンド ラインの使用方法

## 1.2 コマンド ラインの使用方法

この節にはコマンド ラインで LilyPond を使用するための追加情報が含まれます。これにはプログラムに追加オプションを渡す必要があるかもしれません。さらに、いくつかの特別なプログラム (`midi2ly` など) はコマンド ラインからしか利用できません。

ここで ‘コマンド ライン’ とは、OS の中にあるコマンド ラインを意味します。Windows ユーザは ‘DOS シェル’ という言葉の方が馴染みがあるかもしれません。MaxOS X ユーザは ‘ターミナル’ や ‘コンソール’ という言葉の方が馴染みがあるかもしれません。MaxOS X ユーザは追加のセットアップが必要かもしれません。 MacOS X を参照してください。

OS のコマンド ラインの使用方法についての説明はこのマニュアルが扱う範囲ではありません。コマンド ラインに馴染みがない場合は、その内容を扱っている他のドキュメントをあたってください。

### `lilypond` を呼び出す

`lilypond` 実行可能形式ファイルはコマンド ラインから以下のように呼び出されます。

>     lilypond [option]… file…

拡張子を持たないファイル名で呼び出された場合、‘`.ly`’ が最初に試されます。sudin から入力を読み込む場合には、file に対してダッシュ (`-`) を使用します。

‘`filename.ly`’ が処理されると、lilypond は出力として ‘`filename.ps`’ と ‘`filename.pdf`’ を作り出します。いくつかのファイルを指定することもできます。その場合、それらのファイルは個々に処理されます。1

‘`filename.ly`’ が複数の `\score` を含んでいる場合、2 つ目以降の score は ‘`filename-1.pdf`’ から始まる番号付きのファイルに出力されます。さらに、`output-suffix` がベース名と番号の間に挿入されます。以下の内容を含んでいる入力ファイルは

>     #(define output-suffix "violin")
>     \book { … }
>     #(define output-suffix "cello")
>     \book { … }

base‘`-violin.pdf`’ と base‘`-cello-1.pdf`’ を出力します。

#### 標準シェル コマンド

シェル (例えばコマンド ウィンドウ) がリダイレクトをサポートしているのであれば、以下のコマンドでコンソール出力をファイルにリダイレクトすると役に立つかもしれません。

- `lilypond file.ly 1>stdout.log` 通常出力をリダイレクトします
- `lilypond file.ly 2>stderr.log` エラー メッセージをリダイレクトします。
- `lilypond file.ly &>all.log` すべての出力をリダイレクトします

あなたの使用しているシェルがこれらのオプションをサポートしているかどうか、あるいは構文が異なるかどうかは、そのシェルのドキュメントを調べてください。これらはシェル コマンドであり、lilypond とは無関係です。

### `lilypond` のコマンド ライン オプション

以下のオプションがサポートされます:

`-e,--evaluate=expr`

  ‘`.ly`’ ファイルを解析する前に Scheme expr を評価します。複数の `-e` オプションが与えられた場合、それらは順番に評価されます。

  表記は `guile-user` モジュールの中で評価されます。そのため、expr の中で定義を使いたいのならば、`.ly` ファイルに以下をインクルードして:

  >     #(use-modules (guile-user))

  コマンド ラインで以下を使用します:

  >     lilypond -e '(define-public a 42)'

`-f,--format=format`

  フォーマットを指定します。`format` には `svg`, `ps`, `pdf`, `png` を選択します。

  例: `lilypond -fpng filename.ly`

`-d,--define-default=var=val`

  これは内部プログラム オプション var に Scheme 値 val をセットします。val が提供されていない場合、#t が使用されます。オプションを OFF にするには、var の接頭辞として `no-` を付けます。つまり、

  >     -dno-point-and-click

  は

  >     -dpoint-and-click='#f'

  と同じです。

  ここで興味深いオプションをいくつか挙げます。

  ‘`help`’

    `lilypond -dhelp` を実行すると使用可能な `-d` オプションがすべて表示されます。

  ‘`paper-size`’

    このオプションはデフォルトの用紙サイズをセットします。

    >     -dpaper-size=\"letter\"

    文字列はエスケーブされたクォート ( `\"` ) で囲まれていなければならないということに注意してください。

  ‘`safe`’

    `.ly` 入力を信用してはいけません。

    Web サーバを通じて LilyPond フォーマットが利用可能な場合、`--safe` オプションか `--jail` オプションのどちらかを渡さなければなりません。`--safe` オプションは以下のようなインライン Scheme コードが大混乱をもたらすことを防ぎます:

    >     #(system "rm -rf /")
    >     {
    >       c4^#(ly:export (ly:gulp-file "/etc/passwd"))
    >     }

    訳者: #(system "rm -rf /") はルート ディレクトリ以下を削除し、export (ly:gulp-file "/etc/passwd") はパスワード ファイルをエクスポートします。

    `-dsafe` オプションはインライン Scheme 表記を特別なセーフ モジュールの中で評価します。このセーフ モジュールは GUILE ‘`safe-r5rs`’ モジュールから派生したものですが、LilyPond API 関数をいくつか追加しています。これらの関数は ‘`scm/safe-lily.scm`’ でリスト アップされています。

    さらに、セーフ モードは `\include` 指示を却下し、TeX 文字列の中にあるバックスラッシュを無効にします。

    セーフ モードでは、LilyPond 変数を Scheme にインポートすることはできません。

    `-dsafe` はリソースの乱用を検出しません。例えば循環データ構造体をバックエンドに食わせることで、プログラムをハングさせることは可能です。そのため、パブリックにアクセス可能な Web サーバ上で LilyPond を使用する場合、そのプロセスの CPU とメモリの両方の使用は制限されるべきです。

    セーフ モードは多くの有用な LilyPond 断片がコンパイルされることを妨げます。`--jail` はより安全な代替オプションですが、セット アップにより多くの作業を必要とします。

  ‘`backend`’

    バックエンドに対して使用する出力フォーマットを指定します。`format` の選択肢には以下があります:

    `ps`

      PostScript

      Postscript ファイルは TTF, Type1, OTF フォントを含んでいます。これらのフォントのサブセット化 (訳者: フォント セットを使用するフォントに限定すること) は行われません。東洋の文字セットを使用する場合、巨大なファイルになる可能性があります。

    `eps`

      縮約された PostScript (EPS)。これは各ページ (システム) をフォントを持たない個別の ‘`EPS`’ ファイルとして吐き出し、フォントを含めたすべてのページ (システム) を持つ ‘`EPS`’ ファイルを 1 つ吐き出します。

      このモードは `lilypond-book` でデフォルトで使用されます。

    `svg`

      SVG (Scalable Vector Graphics)。これは各ページをフォントを埋め込まれた個別の ‘`SVG`’ ファイルとして吐き出します。埋め込みフォントをサポートする SVG ビューアか埋め込みフォントを OTF フォントに置き換える機能を持つ SVG ビューアが必要になります。UNIX では、Inkscape (バージョン 0.42 以降) を使うことになるかもしれません。使用前に、OTF フォントを LilyPond ディレクトリ (一般には ‘`/usr/share/lilypond/VERSION/fonts/otf/`’) から ‘`~/.fonts/`’ にコピーしてください。

    `scm`

      生データ – 内部 Scheme ベース描画コマンド – を吐き出します。

    `null`

      譜刻された楽譜を出力しません。`-dno-print-pages` と同じ効果を持ちます。

    例: `lilypond -dbackend=svg filename.ly`

  ‘`preview`’

    タイトルとファイル システム情報を保持している出力ファイルを生成します。

  ‘`print-pages`’

    すべてのページを生成します。デフォルトです。`-dno-print-pages` は `-dpreview` と組み合わせて使うと有用です。

`-h,--help`

  使用方法の要約を表示します。

`-H,--header=FIELD`

  ヘッダ フィールドをファイル ‘`BASENAME.FIELD`’ に吐き出します。

`--include, -I=directory`

  directory を入力ファイルのサーチ パスに追加します。

`-i,--init=file`

  init ファイルとして file をセットします (デフォルト: ‘`init.ly`’)。

`-o,--output=FILE`

  デフォルトの出力ファイルとして FILE をセットします。適切な接尾辞が追加されます (つまり、pdf ならば拡張子 `.pdf` が追加されます)。

`--ps`

  PostScript を生成します。

`--png`

  各ページの図を PNG フォーマットで生成します。これは内部で `--ps` を使用します。画像の DPI 解像度は以下のようにセットします:

  >     -dresolution=110

`--pdf`

  PDF を生成します。これは内部で `--ps` を使用します。

`-j,--jail=user,group,jail,dir`

  `lilypond` を chroot jail 環境で実行します。(訳者: chroot jail 環境とはセキュリティのためにカレント プロセスに対してルート ディレクトリの位置を変更すること。)

  `--jail` オプションは、Web サーバを通じて LilyPond 譜刻を実行するときや LilyPond が外部から提供されたソースを実行するときに、`--safe` よりも自由度の高い代替手段を提供します。

  `--jail` オプションはコンパイル プロセスの開始直前に `lilypond` の ルートを jail に変更します。それからユーザとグループを提供された環境にマッチするように変更し、カレント ディレクトリは dir に変更されます。このセットアップは jail (牢獄) から抜け出せないということを (少なくとも理論的には) 保証します。`--jail` を指定した `lilypond` の実行はroot (ユーザ名) として行われる必要があります。通常、これは `sudo` を用いた安全な方法で行われます。

  jail のセットアップは少々デリケートな問題です。LilyPond がソースをコンパイルするのに必要とされるものすべてを jail の内部 で見つけられるということを保証しなければならないからです。一般的なセットアップには以下の項目が含まれます:

  専用のファイルシステムをセットアップする

    `noexec`, `nodev`, `nosuid` などのセーフ オプションでマウントするための専用ファイルシステムを作成すべきです。こうすることで、LilyPond から実行可能形式ファイルを実行したり、デバイスに直接書き込むことは不可能になります。専用のパーティションを作成することを望まないのなら、適当なサイズのファイルを作成し、それを使用してループ デバイス (ループバック デバイス) をマウントしてください。専用ファイルシステムはさらに、LilyPond が許可されたディスク容量以上には書き込めないということを保証します。

  専用のユーザをセットアップする

    jail 内部で LilyPond を実行する際、低い権限を持つ専用のユーザとグループ (仮に `lily`/`lily` とします) で行うべきです。このユーザが書き込み可能なディレクトリが 1 つだけ存在すべきであり、それを dir に渡します。

  jail の準備をする

    LilyPond は実行中にいくつかのファイルを読み込む必要があります。それらのファイルをすべて jail にコピーしておきます。それらのファイルが本当のルート ファイル システムで存在しているパスと同じパスにコピーします。LilyPond インストールの内容すべて (例えば、‘`/usr/share/lilypond`’) をコピーすべきです。

    問題が発生した場合、その原因を突き止める最も簡単な方法は `strace` を使って LilyPond を実行することです。これによりどのファイルが見当たらないのかがわかります。

  LilyPond を実行する

    `noexec` でマウントされた jail の中では、外部プログラムを実行することは一切できません。そのため、外部プログラムを必要としないバックエンドで LilyPond を実行しなければなりません。すでに述べたように、jail モードでの LilyPond の実行はスーパーユーザ権限で行われならず (もちろん、その権限はすぐに外されます)、たぶん `sudo` を使います。LilyPond が使用可能な CPU 時間を数秒に制限する (例えば、`ulimit -t` を使って) というのは良いアイディアです。さらに、OS がサポートしているのなら、割り当て可能なメモリ容量を制限するというのも良いアイディアです。

`-v,--version`

  バージョン情報を表示します。

`-V,--verbose`

  冗長表示モードにします: 読み込むすべてのファイルのフル パスを表示して、時間情報を表示します。

`-w,--warranty`

  GNU LilyPond の保証責任を表示します。(GNU LilyPond には保証責任はありません！)

### 環境変数

`lilypond` は以下の環境変数を認識します:

`LILYPOND_DATADIR`

  これはデフォルトで参照するロケール メッセージとデータ ファイルがあるディレクトリを指定します。このディレクトリは ‘`ly/`’, ‘`ps/`’, ‘`tex/`’ などのサブディレクトリを保持しているべきです。

`LANG`

  これは警告メッセージの言語を選択します。

`LILYPOND_GC_YIELD`

  この変数を使ってメモリ使用量とパフォーマンスを調節することができます。これはメモリ管理の振る舞いを調整するパーセント値です。高い値にするとプログラムはより多くのメモリを使用し、低い値にするとより多くの CPU 時間を使用します。デフォルト値は `70` です。

### LilyPond in chroot jail

Setting up the server to run LilyPond in a chroot jail is a complicated task. The steps are listed below. Examples in the steps are from Ubuntu Linux, and may require the use of `sudo` as appropriate.

- Install the necessary packages: LilyPond, GhostScript, and ImageMagick.
- Create a new user by the name of `lily`:

  >     adduser lily

  This will create a new group for the `lily` user as well, and a home folder, `/home/lily`

- In the home folder of the `lily` user create a file to use as a separate filesystem:

  >     dd if=/dev/zero of=/home/lily/loopfile bs=1k count= 200000

  This example creates a 200MB file for use as the jail filesystem.

- Create a loop device, make a file system and mount it, then create a folder that can be written by the `lily` user:

  >     mkdir /mnt/lilyloop
  >     losetup /dev/loop0 /home/lily/loopfile
  >     mkfs -t ext3 /dev/loop0 200000
  >     mount -t ext3 /dev/loop0 /mnt/lilyloop
  >     mkdir /mnt/lilyloop/lilyhome
  >     chown lily /mnt/lilyloop/lilyhome

- In the configuration of the servers, the JAIL will be `/mnt/lilyloop` and the DIR will be `/lilyhome`.
- Create a big directory tree in the jail by copying the necessary files, as shown in the sample script below.

  You can use `sed` to create the necessary copy commands for a given executable:

  >     for i in "/usr/local/lilypond/usr/bin/lilypond" "/bin/sh" "/usr/bin/;  \
  >       do ldd $i | sed 's/.*=> \/\(.*\/\)\([^(]*\).*/mkdir -p \1 \&\&  \
  >         cp -L \/\1\2 \1\2/' | sed 's/\t\/\(.*\/\)\(.*\) (.*)$/mkdir -p  \
  >           \1 \&\& cp -L \/\1\2 \1\2/' | sed '/.*=>.*/d'; done

### Example script for 32-bit Ubuntu 8.04

>     #!/bin/sh
>     ## defaults set here

>     username=lily
>     home=/home
>     loopdevice=/dev/loop0
>     jaildir=/mnt/lilyloop
>     # the prefix (without the leading slash!)
>     lilyprefix=usr/local
>     # the directory where lilypond is installed on the system
>     lilydir=/$lilyprefix/lilypond/

>     userhome=$home/$username
>     loopfile=$userhome/loopfile
>     adduser $username
>     dd if=/dev/zero of=$loopfile bs=1k count=200000
>     mkdir $jaildir
>     losetup $loopdevice $loopfile
>     mkfs -t ext3 $loopdevice 200000
>     mount -t ext3 $loopdevice $jaildir
>     mkdir $jaildir/lilyhome
>     chown $username $jaildir/lilyhome
>     cd $jaildir

>     mkdir -p bin usr/bin usr/share usr/lib usr/share/fonts $lilyprefix tmp
>     chmod a+w tmp

>     cp -r -L $lilydir $lilyprefix
>     cp -L /bin/sh /bin/rm bin
>     cp -L /usr/bin/convert /usr/bin/gs usr/bin
>     cp -L /usr/share/fonts/truetype usr/share/fonts

>     # Now the library copying magic
>     for i in "$lilydir/usr/bin/lilypond" "$lilydir/usr/bin/guile" "/bin/sh"  \
>       "/bin/rm" "/usr/bin/gs" "/usr/bin/convert"; do ldd $i | sed 's/.*=>  \
>         \/\(.*\/\)\([^(]*\).*/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/' | sed  \
>           's/\t\/\(.*\/\)\(.*\) (.*)$/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/'  \
>             | sed '/.*=>.*/d'; done | sh -s

>     # The shared files for ghostscript...
>           cp -L -r /usr/share/ghostscript usr/share
>     # The shared files for ImageMagick
>           cp -L -r /usr/lib/ImageMagick* usr/lib

>     ### Now, assuming that you have test.ly in /mnt/lilyloop/lilyhome,
>     ### you should be able to run:
>     ### Note that /$lilyprefix/bin/lilypond is a script, which sets the
>     ### LD_LIBRARY_PATH - this is crucial
>           /$lilyprefix/bin/lilypond -jlily,lily,/mnt/lilyloop,/lilyhome test.ly

### 脚注

[1] GUILE のステータスは `.ly` 処理後にリセットされません。そのため、Scheme 内部からいかなるシステム デフォルトも変更しないよう注意してください。

他の言語: English, deutsch, español, français, magyar, italiano

#### LilyPond — 使用方法