シェルスクリプトって何?から始めるシェルスクリプト

| コメント(6) | トラックバック(0) Clip to Evernote

そもそも Mac に魅了されたのは忘れもしないン十年前、パソコンというのは何やらコマンドラインたらどうたらを入力してプログラムを実行すると思っていた時、目の前で展開された GUI に感嘆してしまったからだ。

なのに、何を今さらコマンドラインなんぞをと言うことなのだが、いや、どうもチラチラとウェブでの情報なんぞを見てみると、かなり便利そうなんじゃないかと思うようになったのだ。特に Quicksilver なんかに懲り出すと、これって GUI と コマンドラインの中間みたいなもんじゃないかと。

まず当面は何をやりたかったのかから。ターミナルでというか UNIX コマンドで Rsync を使い外付け HD にバックアップを取ること。

その辺は書籍を片手にターミナルに打込んでみたらなんとかなったようなのだ(過去記事:バックアップに Rsync を試してみたのだが 参照)。もちろん憶えてなんかいないですよ。もう一度やれったって書籍などを見ながらでないとできません。だけどここで不思議に思ったのだ。と言うのは、Mac の、いやパソコンのことだからこれをスクリプトとかに定型化できるだろうと。そこで【RsyncX】なるソフトなんかがそうなのかと思ったり。

確かに【RsyncX】というソフトはまさしくその通りのようなのだが、それ以前に UNIX コマンドを羅列してスクリプトにしたのがシェルスクリプトのことではないかいなと、やっとこさ気付いたのだ(表現が間違っているかもしれないけれど・・・)。

じゃあそのシェルスクリプトはどうやって記述して、何処に保存し、どうやって呼び出すのか?判っている人からすれば何を眠たいこと言ってるのかに違いない。しかしそれが判らなかった。時たまウェブで情報を漁ったりして、未だ不明なこともあるものの、ようやくこうじゃないのかというところまで辿り着いた。

どうやって記述するのか?テキストエディットで良し。但し UTF-8 のエンコードで改行を UNIX (LF) にすること。中身はまだまだ。試しに思いっきり単純な、書類を開く open なんかを記述してみたけど。

さて何処に保存するのか?こいつがどうももう一つ判らなかった。以前コメントをいただいた時に『何処でも』ということだったので、何処でも良いのだろう。しかし、たぶんこれが重要なことだと思うのだが、そのファイルに【パスを通す】ということが必要なようなのだ。たぶん。

そこで【Shiratsuki Public Blog】の【Mac OS X でシェルのパスを通す】を参考に ~/bin のディレクトリを作成し、サンプルで作った

#!/usr/bin/sh
open ~/Documents/memo.txt

というたった2行をテキストエディットで記入し、ファイル名及び拡張子を memoopen.sh として上記 ~/bin に保存し、上記サイトを参考に自動的にパスを通す設定で、いわゆるパスを通してみた。

さて最後にこれをどうやって呼び出すか?ターミナルからなんですね。他にも方法があるようなのだが、まずはターミナルから。

$ /bin/sh memoopen.sh

こうやって打込むと意図通り Document フォルダ内の memo.txt という書類を開けてくれた。ここで悩んだのがシェルスクリプトには #!/usr/bin/sh とあるからターミナルでも /usr/bin/sh と打つかと思ったらそれじゃあ駄目なんですね。これって、ひょっとしてあれかしら、つまりルート直下にある bin というディレクトリ内(これが不可視フォルダ)の sh というプログラムを起動しているということかしら。

まあいずれにしても辿り着いた。たぶんこれで中身のスクリプトなんぞをウェブを漁って参考にして記述すれば一応のことはできるんじゃないかと。間違っていることもあるかもしれないのであまり信用はしないで欲しいのだが、たぶん大丈夫だと思うんだけど。

あと、上記 memoopen.sh の拡張子を command に変更してそのファイルを開くアプリをターミナルにすれば、そのままダブルクリックでターミナルがそれを実行してくれるらしいのだが、

コマンドファイル“/Users/keizo/bin/memoopen.command”を開けませんでした。このファイルは実行可能ではありません。

などと出て上手く行かないんですよね。たぶん記述の仕方がおかしいんだろうと思う。でもまあ、ちょっとだけシェルスクリプトの理解が進んだような気にはなっている。

トラックバック(0)

トラックバックURL: http://www.sumainobaiten.com/blog/mt-tb.cgi/1412

コメント(6)

ちょうど以前いただいていたコメントに回答してたのをお伝えし忘れていました。
http://naotake.fs-output.com/2007/01/macbook_hd.html

記述そのものより、
http://hide-king.air-nifty.com/cider/2007/05/macosxbash_e008.html
このへんにも出てますが、改行コードとかダメなことってありがちなんで一度確認してみるのがおすすめです。

>naotake さん
コメントありがとうございます。ご紹介のサイトも参考にしました。改行コードも UNIX (LF) にしているので大丈夫かと思うのですが、また色々いじってみます。

はじめまして。

おそらくファイルに実行(アクセス)権がないのだと思います。
ターミナルから、
chmod a+x openmemo.command
とするとファイルに実行権を与えることができます。
これで、Finderから実行させることができると思います。

その場合、「#!/usr/bin/sh」は「#!/bin/sh」に変えておく必要があります。

>しーんさん
chmod a+x というのはターミナルからやるってことだったんですね。シェルスクリプトに記述するのかななんてやってました。納得です。おっしゃる通りにやるとダブルクリックでターミナルを開いて実行してくれました。

未だに「#!/usr/bin/sh」は「#!/bin/sh」の違いが【?】ですが、一歩一歩理解が進みつつあります。ありがとうございました。

実行権限の話はし〜んさんがされていますので、パスを通すってあたりでちょっとだけ。

前にrsyncコマンドについて試されていましたが、このrsyncコマンドをフルパスで指定すると
$/usr/bin/rsync
になります。これが、
$rsync
だけでうまくrsyncコマンドを実行してくれていた理由がパスを通すって辺りにあります。

上記のようにコマンド名だけ指定した場合、シェルはそのコマンドが実際にどこにいるのか調べてから実行します。
そして、調べるときに参考にするのが環境変数のPATHの値です。

【Mac OS X でシェルのパスを通す】というエントリで示されていた通り
$printenv PATH
で環境変数PATHの値を見る事が出来ます。
このPATHの値はコロン(:)で区切られたパスのあつまりです。
シェルは、前から順番にこのパスの直下に指定されたコマンドがないかを探し、なければ次のパスという感じに最後まで探します。
途中で見つかれば、そのコマンドを実行し、なければ"command not found"みたいなエラーメッセージをだします。

と、ここまで説明した所で話は戻って
$/bin/sh ?/bin/memoopen.sh
はフルパスでshコマンドを指定しているので、コマンド名だけ指定すると
$sh ?/bin/memoopen.sh
となり、これでも同じように実行してくれます。
これはシェルがshというコマンドをPATHの/binっていうディレクトリから見つけてくるからです。

また、?/binにパスが通してあるのなら
$memoopen.sh
だけでもうまくいくはずです。
が!!!
この場合はちょっと気をつけないと行けません。
このmemoopen.shはシェルスクリプトファイルです。
なので、shコマンドから実行するよ。っていうのをシェルに伝えてあげる必要があります。
そのために1行目に#! /bin/shっていうのを付け足してるわけです。

毎度の事ながら、長文失礼いたしました。

>chappue さん
ありがとうございます。また一つ理解が進みました。問題は usr/bin というディレクトリを users/bin と勘違いしていたのが大きなあやまりだったような気がします。この話し馬鹿バカしいけどエントリしちゃおうかと思います。

コメントする

track feed 感じ通信
あわせて読みたいブログパーツ
OpenID対応しています OpenIDについて
Powered by Movable Type 4.29

カレンダー

<   2007年5月   >
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

このブログ記事について

このページは、keizoが2007年5月27日 22:40に書いたブログ記事です。

ひとつ前のブログ記事は「TUAW の Journler Podcast」です。

次のブログ記事は「髪の毛一本ほど理解が進んだシェルスクリプト」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。