本記事ですが、
私が以前投稿しました「ターミナルを用いてSwiftのプログラムを実行する方法」についての発展的内容となります。
前回の説明にて触れたとおりMavericksでは、
swiftコマンドとswiftcコマンドがシステムに標準ではインストールされていない関係上、これらをターミナルから呼び出す際は非常に長いパスを入力する必要があります。
「/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift」
「xcrun --sdk macosx10.10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc」
今回紹介するテクニックを用いるとYosemite同様、「swift」または「swiftc」とのみ入力するだけでこれらのコマンドを実行することが可能になります。
その際の具体的な挙動としましては、
エンターキーを押してswiftまたはswiftcを実行した瞬間、実際には上で紹介した非常に長いパスでのコマンドにそれぞれ解釈されて実行されることになります。
これから紹介する方法では、
前者のswiftにて「シンボリックリンク」、後者のswiftcにて「エイリアス」と呼ばれるシステムを用いることで、
今回のようなコマンド入力量の短縮を可能にします。
↑
Before
After
↓
シンボリックリンク編
・まずは実際に設定してみよう!
ではまず、swiftコマンドから設定してみましょう。
まず「そもそもシンボリックリンクって何だ?」と言う前に、
下記のコマンドをそのままターミナルにコピペして実行してみてください。
手っ取り早く言えば、
このコマンドを実行するだけでswiftコマンドについては設定完了です!
「sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift /usr/bin」
コマンドの頭にsudoが付いているため、本コマンドの実行時に正しいパスワードの入力を求められます。(/usr/binディレクトリには、一般ユーザの権限では書き込めないので一時的に管理者権限を使います)
それが終わった後、今度は「swift」とのみ入力してエンターキーを叩いてみてください。いかがでしょうか?
上のスクリーンショットのように、
以前はコマンドが見つからないと怒られていたのに対し、今回はswiftコマンドの実行に成功するはずです。
・シンボリックリンクのカラクリ
本目的をもう既に半分果たしましたところで、後回しにしていたシンボリックリンク自体の説明を始めたいと思います。
シンボリックリンクはその性質上、Windowsで言う「ショートカット」と似ています。
シンボリックリンクは厳密に言えばショートカットとは違うのですが、
今回の説明では「シンボリックリンク=ショートカット」と解釈して頂いて構いません。
実際に本投稿でも、以後はショートカットと解釈することを前提に説明します。
(具体的には「対象とするファイルおよびディレクトリ(フォルダ)を、実体 として扱えるかどうか」について決定的な差異があります。
これについて詳しく知りたい方は、「シンボリックリンク」で検索してみてください。)
ではシンボリックリンクのカラクリを知るため、
今回作成したシンボリックリンクである「/usr/bin/swift」の実態を確認してみましょう。
先ほどと同じく、今度は「ls -l /usr/bin/swift」というコマンドをターミナルにコピペして実行してみてください。
実行結果をご覧になりまして、いかがでしょうか?
左のコマンドが右のコマンドを矢印(->)で指し示している通り、
今回作成した「/usr/bin/swift」というシンボリックリンクが、実際にはXcode.app内に存在するswiftコマンドの役割を果たしていることが分かります。
このような役割のおかげで、私達は今回のような長いコマンドをある程度短縮した形で実行することができるのです。
・環境変数「PATH」の役割
ではなぜ、/usr/binディレクトリにswiftコマンドのシンボリックリンクを作成したのかについて説明します。
以前の投稿でも触れたのですが、
OS X Yosemiteではswiftコマンドとswiftcコマンドの2つは、Xcodeをインストールしなくても最初から標準でインストールされています。
これらのインストール先となっているディレクトリは、それぞれのコマンドに対し「which」コマンドを実行することで確認することが出来ました。
swiftコマンドとswiftcコマンドが、一体どこにインストールされていたか思い出していただけましたでしょうか?
その場所こそ、今回正にswiftコマンドのシンボリックリンクを作成した/usr/binディレクトリなのです!
従って、「/usr/binディレクトリの配下にあるコマンドは、ディレクトリのパス(/usr/bin/)を入力せずにコマンド名だけを入力するだけでターミナルから呼び出すことができる」と言えます。
この事実が分かったところで、さらにもう一段階だけ話が飛躍します。
では、このような「コマンド名を入力するだけで、該当するコマンドが格納されているディレクトリのパスを補完してくれる仕組み」は、何の働きによって成り立っているのでしょうか?
先に結論を言ってしまうと、
この仕組みは本セクションのタイトルである「PATH」(パス)という環境変数の働きにより成り立っています。
プログラミングの嗜みがある方は御存知であると思いますが、
このPATHは環境変数と呼ばれている所以の通り、変数である以上何らかの値が設定されています。
その値は「echo $PATH」というコマンドを実行することで確認できます。
皆様も私に続き、お使いのMacに設定されている環境変数であるPATHの内容を確認してみてください。
(環境変数とは、お使いのOSのあらゆる設定が格納されている変数であり、
今回紹介したPATHの他にも様々な環境変数が存在します。
OS Xにおいて環境変数の中身を知るためには、
echoコマンドの引数に対し、該当の変数名の頭に「$」を付けた状態で渡します。)
この実行結果では、
環境変数PATHに登録されているディレクトリのパスが「:」(コロン)で区切られて列挙されています。
私の環境にて登録されているディレクトリを、左から並んでいる順に例として記しました。
・/usr/bin
・/bin
・/usr/sbin
・/sbin
・usr/local/bin
皆様、お気づきになりましたでしょうか?
具体的には一番最初に登場しているパスにご注目ください。
この「/usr/bin」というディレクトリですが、
実を言うと私達が何も設定しなくてもPATHという環境変数にデフォルトで登録されているのです。
つまり、
今回の目的である「Mavericksにおいて、swiftコマンドをディレクトリのパスを省いたコマンド名だけで実行する環境を整える」を達成するには、
Yosemiteにてswiftコマンドが標準でインストールされている「/usr/bin」ディレクトリに対し、同コマンドのシンボリックリンクを生成するだけで実現できる環境が最初から整っているのです。
※今回紹介した環境変数の扱い方は、ほんの一例です。環境変数は今回紹介したPATH以外にも多数存在し、OS Xの場合はターミナルから「set」とのみ入力し実行することで確認することが可能です。
ただ、これらの環境変数の働きはOS全体に及ぶものが少なくありません。
今回は私が十分に説明した上で操作するように指示致しましたが、操作を誤ると最悪の場合OS Xそのものが起動しなくなるような最悪の事態も起こり得ます。
これはOS Xのみならず、Windowsや他のUNIX系OSをお使いの方にも言えることです。
今回のように環境変数をユーザが自ら明示的に編集する行為は、
コマンドの入力量を短縮できるといったメリットもある反面、「働きを理解し実際に使いこなすには相応の知識と経験が要求される」という時間的なデメリットなども存在します。
そのため、何らかの必然的理由がない限りは環境変数の値を編集しないことを推奨します。
エイリアス編
では続いてswiftcコマンドの設定の方も解説します。
こちらは先ほどのswiftコマンドのように、コマンドを1つ実行するだけで設定完了とはいきません。
面倒ではあるのですが、コマンドの実行以外にも少々面倒な設定をこなす設定があります。
この設定についても、
swiftコマンドと同様に一つ一つ順を追って丁寧に説明いたしますので、皆様どうかお付き合いよろしくお願いします。
・設定が面倒である2つの理由
まず前者のswiftコマンドと比較して設定が面倒な理由ですが、
第一に「Mavericksからswiftcコマンドを実行するには、「xcrun --sdk macosx10.10」を頭に付けないと実行できない」という事実が挙げられます。
以前の投稿でも触れたこの事実が原因で、
今回の趣旨である「Mavericksからswiftcコマンドを実行する際に、コマンド名だけでターミナルからコマンド名だけで呼び出す」を達成するにあたり、
前述のswiftコマンドで利用したシンボリックリンクのシステムを活用することができないのです。
(仮に/usr/binディレクトリに対し、Xcode.app内に存在するswiftcコマンドのシンボリックリンクを生成したとしても、
それを呼び出して実行ファイルを生成する際は「xcrun --sdk macosx10.10 swiftc」とターミナルから入力しないといけないため、
結果的に「swiftc」とのみ入力して実行することは叶いません。)
第二の理由としては、
第一の理由を解決するために今回紹介するコマンドである「alias」(エイリアス)の仕組みが挙げられます。
具体的には以下にてその仕組みを説明しますが、
簡単に言うと「aliasコマンドは、ターミナルを終了するとその効力を失います」。
つまりは、「ターミナルを立ち上げる度にaliasコマンドが実行されるように設定しないといけない」ということになります。
この2つの理由により、
前述のswiftコマンドのように「コマンドを一度だけ実行するだけで設定が完了する」という状況にはならないのです。
前述のswiftコマンドのように「コマンドを一度だけ実行するだけで設定が完了する」という状況にはならないのです。
・aliasコマンドを使い、コマンドの入力量を短縮する
ではまず、上の第一の理由から解決しましょう。
aliasコマンドの働きについては後で解説しますので、まずは次のコマンドをコピペして実行してみてください。
「alias swiftc="xcrun --sdk macosx10.10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc"」
このコマンドを実行後、続いて「swiftc」とのみ入力してエンターキーを叩いてください。
するとどうでしょうか?
下のスクリーンショットのように、以前はコマンドが見つからないと警告されたswiftcが結果的にコマンド名だけで実行できるようになっていると思います。
aliasコマンドの役割については、ここまでの手順を通して既に大方理解できたのではないかと思います。
お察しの通り、このコマンドを使うことでエイリアスが意味する(コマンドの)「別名」を作り出すことが可能になるのです。
これは「alias 作りたい別名="別名の元となるコマンド"」と入力することで、
今回の場合は右辺の長いコマンドを、左辺の短いコマンドを入力することでも実行できるようになります。
大抵の場合、aliasコマンドはこのようにコマンドの入力量の短縮に活用されることが多いようです。
ただし、aliasコマンドには問題があります。
それは「ターミナルを終了すると効力を失うという」ということです。
これはaliasコマンドを実行後、再度ターミナルを立ち上げることで分かります。
今回の場合、せっかく設定した「swiftc」という名前のエイリアスが綺麗さっぱり使えなくなっていることが確認できると思います。
もちろん再度aliasコマンドを実行すれば設定した別名がまた使えるようになりますが、
これではターミナルの新しいウィンドウを立ち上げる度に「/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc」を、コマンドの一部として入力しなければならないことに変わりはありません。
しかし逆に言うと、
この仕組みさえ何とかすることができれば、swiftコマンドと同様に、ターミナルを立ち上げた瞬間からコマンド名を入力するだけで呼び出すことができそうです。
Macでは、ターミナルで新しいウィンドウを立ち上げる度に読み込まれる設定ファイルを作ることができ、これはユーザのホームディレクトリ(~/)に「.bash_profile」という隠しファイルを作ることで有効にすることができます。
ただし、
Macではピリオド(.)から始まるファイル名のファイルは、隠しファイルとして扱われる特性がありますので、このような隠しファイルを読み書きする際には少々コツが要ります。
今回はここまでターミナルをずっと活用してきていますので、私の方からは同じくターミナルを用いて操作する方法を紹介します。
ただし、お使いのMacの環境によっては既に「~/.bash_profile」が存在する場合があります。
プログラムやWeb系の開発をされない方であれば、おそらく存在しないことの方が多いと思いますが、
もしこの隠しファイルが既に存在する場合であれば新規に作成はせず、既存の~/.bash_profileに対し追記することで対処します。
具体的な記述内容としては、
上で紹介したエイリアスのコマンドである「alias swiftc="xcrun --sdk macosx10.10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc"」を、新たな一行としてそのまま記述します。
こうすることにより、
内部的にはターミナルで新しいウィンドウが立ち上がる度にaliasコマンドが実行されるため、
結果的に「最初からswiftcをコマンド名だけで呼び出せ、且つxcrunのオプションを頭に付けなくても自動的に補完してくれる」という環境を構築することができます。
では実際にこの設定を始めます。
まずは.bash_profileがお使いのMacでログインしているユーザのホームディレクトリに存在するかを見極めるため、
「cat ~/.bash_profile」というコマンドを、そのままコピペして実行してみてください。
これの実行結果により、設定内容は同じであるものの設定手順が変わります。
わざわざターミナルを立ち上げるたびにaliasコマンドを実行しなくても、swiftcのみの入力でSwiftのソースコードから実行ファイルを生成することが可能になります。
是非皆様の環境でも、実際にお確かめください。
【2014/10/22 追記開始】
~/.bash_profileの働きにより、ターミナルの起動時にaliasコマンドが自動的に実行されていることを確認する手順を記載し忘れていました。
これについて追記致します。
aliasコマンドですが、
実は「alias」または「alias -p」を実行することで、現在使っているターミナルのウィンドウにて有効なエイリアスを確認することができます。
このコマンドですが、
・終わりに
以上にて、「Mavericks環境においてswiftおよびswiftcをコマンド名のみの入力で実行する」という設定を果たすことが出来ました。
最後に、不要ではあるかもしれませんが、
今回行ったswiftおよびswiftcのコマンドの設定を無効化する方法についても紹介してます。
swiftコマンドについては、
/usr/binに生成したswiftという名前のシンボリックリンクを消去するだけで良いため、「sudo rm /usr/bin/swift」というコマンドを正しいパスワードを入力して実行するだけで完了です。
※間違ってもOS X Yosemiteでは実行しないでください!
シンボリックリンクではなく、コマンドそのものの実体が消えてしまいます!!
次にswiftcコマンドについてですが、
実行結果AとBにてやはり実行すべきコマンドが異なります。
まずAの場合についてですが、「rm ~/.bash_profile」を実行するだけでOKです。
今回紹介したaliasの一文のみが記述された~/.bash_profileが消去されますので、
その他の設定に影響が及ぶことはありません。
Bの場合は既存の~/.bash_profileを編集しましたので、
このファイルを削除するのではなく、同ファイルに追記したaliasの一文のみを部分的に削除する必要があります。
ただそう難しく考えることはなく、
私の設定例どおり操作した方については「cp ~/Desktop/bash_profile\ のコピー.txt ~/.bash_profile」などとすることで、バックアップの内容をそのまま~/.bash_profileとして戻せば同じ結果が得られるでしょう。
これにて本当に最後になります。
本日よりXcode 6.1がMac App Storeから配信されましたこともあり、SwiftをMacのコマンドラインから操作する目的においては開発者登録が要らなくなりましたので、
以前と比較してSwiftの動作環境を整える敷居が低くなったと言えるでしょう。
これに加え、今週よりSwiftの書籍が順々と発売になることもありますので、
ご興味のある方はこれを機に是非私と一緒にSwiftの学習を始めてみてはいかがでしょうか?
これの実行結果により、設定内容は同じであるものの設定手順が変わります。
実行結果例A:~/.bash_profileが存在しない場合
実行結果に「No such file or diretory」と表示される場合は、隠しファイル「~/.bash_profile」が存在しません。
この場合は、
「alias swiftc="xcrun --sdk macosx10.10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc"」とのみ記述されたテキストファイルを、.bash_profileという名前でユーザのホームディレクトリに保存するだけでOKです。
具体的な作業手順の例としましては、
使い慣れたテキストエディタから上の一文のみを記述したファイルを「bash_profile.txt」としてデスクトップに保存し、
その次にターミナルから「mv ~/Desktop/bash_profile.txt ~/.bash_profile」を実行します。
実行結果例B:~/.bash_profileが存在する場合
実行結果が「No such file or diretory」以外の場合、
~/.bash_profileが存在しますのでそのファイルの内容が表示されます。
私の場合、
プレイベートで使っているMac環境にNVIDIA社のCUDAをインストールしていることから、ホームディレクトリに対し.bash_profileが存在するようです。
この場合、
上の実行結果例Aのように新規作成したものをユーザのホームディレクトリに保存してしまうと上書きされてしまうため、既存の.bash_profileによる設定が損なわれてしまいます。
これを防ぎ同時にswiftcコマンドについての設定も適用させるため、
私のような場合は既存の~/.bash_profileを編集します。
それでは実際に、このような場合の設定例を紹介します。
その前に念のため、
「cp ~/.bash_profile ~/Desktop/bash_profile.txt」と実行し、その後デスクトップに生成されるbash_profile.txtのコピーを作っておきましょう。
これにより、
何らかの理由で既存の~/.bash_profileの内容に戻したくなった時、または参照したくなった時のためのバックアップの役割を果たせます。
今回のみならず、何らかの設定を変える際は変更前のバックアップを取っておく方が一般的にも安心できると思います。
↑
デスクトップに生成されたbash_profile.txtは隠しファイルではありませんので、
右クリック, コピー, 貼り付けの順で、簡単にバックアップが作れます。
ではバックアップが済んだところで、
本題であるswiftcコマンドの設定を行いましょう。
私の場合はデスクトップにあるbash_profile.txtを開き、次のようにaliasコマンドの一文をファイルの末尾に追記しました。
※もちろん皆様の場合は、私の環境の~/.bash_profileと比較してファイルの内容が異なるかもしれませんので、
下の内容をまるまる引用するのではなく、お使いのMac環境での既存の内容に対し追記するようにお願いします。
このようにaliasコマンドの一文を追記して忘れずに保存もでき次第、
次はこのbash_profile.txtをホームディレクトリに移動させます。
その際はファイル名を変え(元に戻し)、隠しファイルとして移動させなければ設定が適用されないため、次のコマンドをターミナルから実行します。
「mv ~/Desktop/bash_profile.txt ~/.bash_profile」
このコマンドが実行できましたら再度「cat ~/.bash_profile」を実行し、正しく設定できているかを確認しましょう。
下のスクリーンショットのように、既存の内容と新たに追記したaliasの一文が同時に確認できれば大丈夫です。
※ちなみに、ターミナルを使わずにファイル名の先頭に「.」を付けて隠しファイルとして保存しようとすると、
Macでは下記のエラーが表示されるようになっています。
C:~/.bash_profileの設定を適用させる
AまたはBのどちらかの手順を通し、~/.bash_profileにaliasコマンドを記述できましたでしょうか?
このファイルの内容をターミナルに読み込ませ、swiftcコマンドの設定を完了させるのは簡単です。
既に説明しましたとおり、単に新しいターミナルのウィンドウを立ち上げるだけで~/.bash_profileの内容が自動的に適用された状態で起動します。
または「source ~/.bash_profile」というコマンドを実行すると、新しいターミナルのウィンドウを立ちあげなくても設定が適用されます。
この設定が完了してからは、わざわざターミナルを立ち上げるたびにaliasコマンドを実行しなくても、swiftcのみの入力でSwiftのソースコードから実行ファイルを生成することが可能になります。
是非皆様の環境でも、実際にお確かめください。
【2014/10/22 追記開始】
~/.bash_profileの働きにより、ターミナルの起動時にaliasコマンドが自動的に実行されていることを確認する手順を記載し忘れていました。
これについて追記致します。
aliasコマンドですが、
実は「alias」または「alias -p」を実行することで、現在使っているターミナルのウィンドウにて有効なエイリアスを確認することができます。
このように、ターミナルを立ち上げた直後に自動的に実行されるaliasコマンドを確認できます。
この場合、~/.bash_profileに記述したaliasコマンドが本当に実行されていることが分かります。
また「unalias」(アン・エイリアス)コマンドを使うことにより、
aliasコマンドとは逆に設定したエイリアスを無効化することが可能です。
具体的には、「unalias 無効にしたいエイリアス」という書式で実行します。
ターミナルの起動時に有効になる「swiftc」というエイリアスが、無効になっていることが確認できます。
ターミナルから直接手入力でaliasコマンドを実行するのであれば有用なものであると思いますが、今回はターミナルを立ち上げる度に~/.bash_profileに記述したエイリアスが有効になりますので、
あまり価値はないかもしれません。
とは言え、
aliasコマンドを紹介したことからその対となるunaliasコマンドについてもこの際に覚えてしまうのが良いと思い、紹介致しました。
【2014/10/22 追記開始】・終わりに
以上にて、「Mavericks環境においてswiftおよびswiftcをコマンド名のみの入力で実行する」という設定を果たすことが出来ました。
最後に、不要ではあるかもしれませんが、
今回行ったswiftおよびswiftcのコマンドの設定を無効化する方法についても紹介してます。
swiftコマンドについては、
/usr/binに生成したswiftという名前のシンボリックリンクを消去するだけで良いため、「sudo rm /usr/bin/swift」というコマンドを正しいパスワードを入力して実行するだけで完了です。
※間違ってもOS X Yosemiteでは実行しないでください!
シンボリックリンクではなく、コマンドそのものの実体が消えてしまいます!!
次にswiftcコマンドについてですが、
実行結果AとBにてやはり実行すべきコマンドが異なります。
まずAの場合についてですが、「rm ~/.bash_profile」を実行するだけでOKです。
今回紹介したaliasの一文のみが記述された~/.bash_profileが消去されますので、
その他の設定に影響が及ぶことはありません。
Bの場合は既存の~/.bash_profileを編集しましたので、
このファイルを削除するのではなく、同ファイルに追記したaliasの一文のみを部分的に削除する必要があります。
ただそう難しく考えることはなく、
私の設定例どおり操作した方については「cp ~/Desktop/bash_profile\ のコピー.txt ~/.bash_profile」などとすることで、バックアップの内容をそのまま~/.bash_profileとして戻せば同じ結果が得られるでしょう。
これにて本当に最後になります。
本日よりXcode 6.1がMac App Storeから配信されましたこともあり、SwiftをMacのコマンドラインから操作する目的においては開発者登録が要らなくなりましたので、
以前と比較してSwiftの動作環境を整える敷居が低くなったと言えるでしょう。
これに加え、今週よりSwiftの書籍が順々と発売になることもありますので、
ご興味のある方はこれを機に是非私と一緒にSwiftの学習を始めてみてはいかがでしょうか?
0 件のコメント:
コメントを投稿