Archive Redo Blog

DBエンジニアのあれこれ備忘録


テーマ:
Linux で DOS のバッチファイル的な簡単なスクリプトを作成するにはシェルスクリプトを使用します。

しかし、一口にシェルと言っても、B shell、C shell、bash などいろいろな種類があるんですね。

使用しているディストリビューションがサポートしているならどれでも使えるということなので、それぞれ特徴を考慮してどれを使うかを選択すればいいようです。

しかし、そう言われても特徴を意識しなければならないほど難しいことをしようと思っているわけでもないですし、どれを使うか戸惑ってしまいます。

Linux の標準は一応 bash らしいので、bash を使うことにしましたが、オープンソースの世界ならではの利点というか欠点というか...ビシッと統一してもらいたいというのが本音です。(せめて文法くらいはね^^;)

と、シェルの種類自体もいろいろあるのですが、その実行方法にもいろいろあるようです。

シェルスクリプトを直接実行する
シェルスクリプト名を記述するだけで実行できればそれが一番楽です。
しかし、この方法ではシェルスクリプト自身に実行権限がなければ実行できないのが難点です。

例えば、以下のように実行権限が与えられていないシェルスクリプトを実行しようとすると権限エラーになります。

$ ls -l
-rw-rw-r--    1 user      user          1238  1月 12 11:07 test.sh

$ ./test.sh
-bash: ./test.sh: 許可がありません

以下のように実行権限を付与すると、正常に実行できます。

$ chmod u+x test.sh
$ ls -l
-rwxrw-r--    1 user      user          1238  1月 12 11:07 test.sh

$ ./test.sh
test

ただ、カレントディレクトリ上にあるシェルスクリプトを実行する場合でも、パスの記述は必要なようで、単にシェルスクリプト名を記述しただけでは以下のようにエラーになってしまうようです。

$ test.sh
-bash: test.sh: command not found

ちょっとうっとおしいですね。

シェルの起動時に引数としてシェルスクリプトを指定する
シェルの起動時にシェルスクリプト名を指定する方法もあります。

$ bash test.sh
test

この方法だとシェルスクリプト自身に実行権限がなくても実行できます。

ドットコマンド(source コマンド)の引数としてシェルスクリプトを指定する
通常は上記のいずれかの方法でシェルスクリプトを実行するのが一般的なようですが、いずれの方法も、元のシェルから新たなシェルが起動されてシェルスクリプトが実行されるため、シェルスクリプト間で変数や関数を共有するができません。

シェルスクリプトの中から別のシェルスクリプトを呼び出して、両シェルスクリプト間で変数や関数を共有したい場合は、ドットコマンドを使用します。

test1.sh
#!/bin/bash
VAR1="test1"
. test2.sh
echo "VAR2=$VAR2"
test2.sh
#!/bin/bash
VAR2="test2"
echo "VAR1=$VAR1"

$ bash test1.sh
VAR1=test1
VAR2=test2

この方法でもシェルスクリプト自身に実行権限がなくても実行できます。



これらの実行方法もTPOに応じて適宜選択すればいいようですが、混乱を避ける意味でもある程度のポリシーは決めておいたほうがいいかもしれませんね。
AD
いいね!した人  |  コメント(0)  |  リブログ(0)

arbさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

      たくさんの芸能人・有名人が
      書いているAmebaブログを
      無料で簡単にはじめることができます。

      公式トップブロガーへ応募

      多くの方にご紹介したいブログを
      執筆する方を「公式トップブロガー」
      として認定しております。

      芸能人・有名人ブログを開設

      Amebaブログでは、芸能人・有名人ブログを
      ご希望される著名人の方/事務所様を
      随時募集しております。