質問: Arduino IDE バーション 1.5.x 以降から コマンドラインからのビルドに対応したようで試していたのですが、 上記ドキュメントを読んで ``` $ ln -s /Applications/Arduino.app/Contents/MacOS/Arduino /usr/local/bin/arduino ``` とシンボリックリンクを作って、コマンド実行したところ、 「MainClassNameRequired」とだけ表示されたウィンドウが現れ、 アプリが起動せずビルドできませんでした。 bashのPATHは通っていますし、権限も問題ないと思います。 いろいろ調べた結果シンボリックリンクではなく、`.bash_profile` に ``` alias arduino="/Applications/Arduino.app/Contents/MacOS/Arduino $*" ``` と記述し、同様にコマンド実行したら、アプリが起動しビルドが通りました。 実行したArduinoビルドコマンドは下記のような感じです。 ``` $ arduino analogpin_test/analogpin_test.ino --verify ``` CLIでのビルドは成功したのですが、 なぜシンボリックリンクを作成した場合は実行失敗するのかがわからず、 理由を知りたいです。 各コマンドは全てホームディレクトリから入力しています。 -- 例えば homebrew では、バイナリファイルのシンボリックリンクを作成して、 パスの通ったディレクトリ配下におくことでコマンドが実行できるようになりますが、 今回のケースでは何かが違ったのでしょうか?
回答: コマンドを起動して作られたプロセスには、コマンドの名前が渡されます。コマンドの実装によっては、その名前から依存するライブラリーやコマンド等の場所を見つけようとするものがあります。`Arduino` もそのように作られているのでしょう。 `/usr/local/bin/arduino` というシンボリックリンクを作り、その名前で起動すると、プロセスには自身の名前が `/usr/local/bin/arduino` であると伝えられ、`arduino` (`Arduino`) プロセスはその名前を起点に依存ライブラリーなどを探すが見つけられず、エラーになっているものと思われます。 `/usr/local/bin/arduino` というパスで `Arduino` を起動したいのであれば、シンボリックリンクでなく、次のような内容のシェルスクリプトを置きましょう。 ``` #!/bin/sh exec /Applications/Arduino.app/Contents/MacOS/Arduino "$@" ``` なお本題と関係ありませんが、提示されているコマンドエイリアス設定は以下が適切です。(`$*` が余計です) ``` alias arduino="/Applications/Arduino.app/Contents/MacOS/Arduino" ```