bashlib1
- shorthand library for bash -
bash シェルをスクリプトとして使うときに、必要となる機能を提供するライブラリです。
事前の状況チェックや、事後のエラーチェックが不要になり、コードがシンプルになります。
短いオプションや特殊記号を減らして、読めるだけでなく検索できるようになります。
エラーが発生したら停止して、その場所を表示します。(フェイル・セーフ)
許可したフォルダーの外のファイルを消そうとしたらエラーにします。(フール・プルーフ)
構造化例外処理ができるため、エラーのテストやエラー復帰ができます。
ステップ実行ができるため、不具合を早く修正できます。
#!/bin/bash -eE
function Main_func()
{
echo "Hello, world!"
Pause_func
}
#// bashlib include
sample.sh
bash シェルの画面
$ ./sample.sh
Hello, world!
続行するには Enter キーを押してください...
ダウンロード
for bash ver3以上 (Linux, MacOS X)
ライセンス
bashlib is provided under 3-clause BSD license.
Copyright (C) 2011 Sofrware Design Gallery "Sage Plaisir 21" All Rights Reserved.
参考
無料でお使いいただけますが、無保証です。
再頒布や加工もファイルに書かれた下記を削除しなければ自由にできます。
bashlib を参考にして作成したスクリプトやライブラリの著作権は、あなたにあります。
サポート先
2011/10/9
$
bashlib がベースとするシェルスクリプトの説明です
bashlib のマニュアル(本書)です
bashlib ヘルプ
画面で見るマニュアル
インストール
とりあえず動かしてみたいときは、
version 1
を開いてください。
この文書(HTML5)を見るときは、Chrome または Mac OS X の Safari をお使いください。
ファイルやシェルの基本的なコマンドの説明です。
上記リンク先は、
でのみ参照できます。
bashlib を使うと、ファイル操作やプログラムの起動などを行う、スクリプトの
作成(プログラミング)が簡単になり、いろいろなことが自動化できます。
そして、作成したスクリプトを、
スクリプトの発動が素早くできるようになります。
の形式にすれば、
複雑な処理を自動化
シェル・スクリプト
パソコン
解凍(コピー)するだけで、
+
scriptlib
bashlib で作られたスクリプトのインストールは、スクリプト・ファイル
と一緒に scriptlib フォルダーをコピーするだけです。 このとき、bashlib
パッケージをインストールしたり、パスを通したりする必要はありません。
bashlib パッケージのインストールは、ダウンロードした圧縮ファイルを解凍
bashlib の圧縮ファイルを解凍してできたフォルダーを削除してください。
scriptlib フォルダーを別の場所にコピーしていたら、それも削除してください。
するだけです(下記を参照)。とりあえず動かしてみたいときは、インストール
シェルから圧縮ファイルを解凍する
cd <bashlib フォルダーを格納するフォルダー>
tar xvf bashlib-1.0.0.tar.bz2
ダウンロードした bashlib-1.0.0.tar.bz2 圧縮ファイルをダブルクリックすると、
解凍されて、bashlib フォルダーができます。
参考
ダウンロードした bashlib-1.0.0.tar.bz2 圧縮ファイルを右クリックして、
[ ここに展開する ] を選ぶと、bashlib フォルダーができます。
関連
後、
開発方針
・100ページの説明をするより、1つでも典型的でシンプルな動くサンプルを提供すること
・結果が同じであれば、エラーにしないこと。 例:ファイルが無いパスを指定して削除したとき
・文書の大項目はユースケースであること。 レアケースである細かい仕様を主役にしないこと
・文書はユーザーが行う操作の順に書くこと。 「ただし、〜してあること」を無くすこと
・ユーザーから見ると意味が異なる、ボトムアップから定義された用語は使わないこと
・メインのコードの前提条件と、何を行っているのかについて、コメントを母国語で書くこと
・エラーが発生して復帰するまでは、次のエラーが発生しても、最初のエラーを表示すること
・シンボルの大文字と小文字のコーディング・ルールは Java に標準化すること。
・ユーザーの体験が、シンプル&ビジュアルであり、代償によって自由を奪わないこと。
参考
bashlib が提供する関数の末尾は、_func または _method に統一されています。
これにより、関数であるかコマンド(実行ファイル)であるかを識別できます。
関数の内容を知りたいときは、bashlib のドキュメントを検索するか、scriptlib フォルダー
の中を検索してください。 なお、
一部、デバッグ専用の関数は、その内容を理解している本人しか見ないコードであることと、
キーボードをタイプする量を減らすために、_func を付けていません。
関数のヘルプやソースコードを見る、またはコマンドのヘルプを見る
bash の特殊記号の意味を知る
Main_func 関数から読む。bashlib の起動順序を知る
bashlib を使ったシェル・スクリプト・ファイルを実行すると、その最後にある
を実行すると、
が呼ばれます。 Main_func 関数
が呼ばれたら、bashlib が提供する関数を使うことができます。
参考
動かしてみて、デバッグ用関数を使って、状況を知る
参考
他の人からシェル・スクリプトを入手したときに、その内容をソースコードから理解する
ときのコツを紹介します。
末尾が _method の関数の場合、*Class.*_method というオブジェクト指向を意識した
関数名になります。 ピリオドが含まれていますが、bash では特別な文法的意味はなく、
英文字と同じく関数名の一部です。
_func や _method が付いていない実行ファイルの仕様は、which や man を使って
調べてください。
からファイルの検索が
できます。
スクリプトが bashlib を使っていれば、デバッグ用関数を使って内部の状況を知ること
ができます
bashlib は、エラーが発生すると即時に中断(フェールセーフ)するため、終了ステータス
を毎回チェックする必要がありません。
しかし、一部のケースで、エラーを無視して続きを実行してしまうことがあります。
(これは、終了ステータスを毎回チェックするコーディングに戻しても発生します。)
この問題を避けるため、いくつかのコーディングの注意点があります。
bashlib は、エラーが発生したとき、trap した関数の中から break ジャンプをしていま
す。(関数名が見つからないなど、終了ステータスが 0 のままエラーが発生する場合に
も構造化例外処理に対応できるようにするため。)
正常時の break と区別するため、ループの終わりの done の直後に done_func を呼び
出すようにしてください。 そうしないと、エラーが発生しても、続きを実行してしまい
ます。
while true; do
CheckWritable_func "$PWD/out/a.txt"
break
done ; done_func $?
done_func $?
参考
local var=`FuncA_func`
local var ; var=`FuncA_func`
local 変数の宣言と関数を使った代入を同時に行うと、右辺からエラーが発生しても、
続きを実行してしまいます。 宣言と代入を別の文に分けてください。
(これは、代入文が、local コマンドの引数になっているためと思われます。)
var ; var
パイプを使うと、パイプの左(最も右以外)で終了ステータスが 0 以外でも(エラーが
発生しても)、続きを実行してしまいます。 これを避けるため、パイプを使った文の
直後に、CheckPipeStatus_func を呼び出す必要があります。
make V=1 2>&1 | tee make.log
CheckPipeStatus_func "${PIPESTATUS[@]}"
CheckPipeStatus_func "${PIPESTATUS[@]}"
参考
if [ "`gcc -dumpversion`" != "4.4.3" ];then
条件文の中から、関数呼び出しを行うと、関数内からエラーが発生しても、続きを実行
してしまいます。 一時的な変数に代入してから、条件文に渡してください。
(これは、条件文の前の [ が test コマンドの別名であるため、条件文の中は test コマ
ンドの引数になっているためと思われます。)
関数やコマンド(A_func とする)の引数の中に、関数(B_func とする)の呼び出しを
記述すると、B_func の中で発生したエラーを無視して、続きを実行してしまいます。
B_func の echo 出力を、一時的な変数に代入してから、引数に渡してください。
A_func "`B_func`"
local a1
a1=`B_func`
A_func "$a1"
bashlib を使った場合、終了ステータスが 0 以外になると(エラーが発生すると)、
フェールセーフのため、続きを実行しません。 まれに、エラーが発生しても、
続きのコードから終了ステータスの値を使った処理をしたいことがありますが、
そのときは、|| を使います。
local status=0
command || status=$?
local status=0
ls --unknown_option > /dev/null 2>&1 || status=$?
echo "$status"
サンプル
関連
NG
OK
参考
OK
NG
OK
NG
local a1
a1=`B_func`
if [ "$a1" != "4.4.3" ];then
a1=`B_func`
a1=`B_func`
… command からエラーが発生しても続きを実行する
構造化例外処理
Mac OS X のテキストエディットを使って、シェルスクリプト(テキストファイル)を
開こうとしたときに、「日本語には対応していません」というエラーが出るときは、
文字コードが自動判定になっているために、UTF-8 の文字コードを認識できない可能性が
あります。
[ テキストエディット | 環境設定 | 開く/保存 ] の [ ファイルを開くとき ] [ ファイルを
保存するとき ] を UTF-8 に設定してください。
メニューを開くと、ショートハンド・プロンプト(CUI)が表示され、そこにコマンドを入力すると、
用意されたスクリプトを素早く起動することができます。 ドキュメントにコマンド名が書かれて
いれば、専門家でなくてもコンピューターに処理させたい作業を実行することができるように
なります。
ショートハンド・プロンプトを起動する関数(開発者向け)
$ ./menu
-------------------------------------------------
1. 作業Aを行う [CommandA]
2. 作業Bを行う [CommandB]
3. 作業Cを行う [CommandC]
99. 終了
番号またはコマンド >2
-------------------------------------------------
ログ・ファイルのパス >~/log.txt
~/log.txt を出力しました。
bashlib が提供するツールのメニュー
~/log.txt
2
上記の黄色い部分が、ユーザーが入力する部分です。
プロンプト(InputCommand_func)には、シェルのコマンドも入力できます。
./menu
メニューを開くには、menu シェル・スクリプト・ファイルを実行します。
場合によっては、setup など別のファイル名になっている可能性もあります。
ただ、必ずしもシェルから起動する必要はありません。
つづき
関連
シェルからメニューを開く
cd bashlib
./menu
Mac OS X で bash シェルを開くには、Finder [ 移動 | アプリケーション | ユーティリティ
| ターミナル ] を Dock にドラッグ&ドロップして、できたアイコンをクリックします。
Ubuntu でシェルを開くには、[ アプリケーション | アクセサリ | 端末 ] を選びます。
menu ファイル(シェル・スクリプト・ファイル)をダブルクリックして、
「端末内で実行する」を選んでください。
menu ファイル(シェル・スクリプト・ファイル)をダブルクリックしてください。
参考
入力できる専用コマンドは、多くの場合、アプリケーションのマニュアルに書かれています。
自分がしたいことをマニュアルの目次から見つけたら、その本文から専用コマンドを探して
ください。
画面で見るマニュアルを見ているのなら、専用コマンドをコピー&ペーストできます。
ペーストするときは、右クリックして [ 貼り付け ] をクリックしてください。
よく使うコマンドは、付箋紙や Snap Note のノート・バーなどに一時的に貼り付けておくと
便利に使えます。
テンポラリ・フォルダーを開く
OpenTemp
画面で見るマニュアル
vbslib を使ったスクリプトを実行すると、その実行のために内部的に必要になる
ファイルが、テンポラリ・フォルダーに作られることがあります。
menu
1. 作業Aを行う [CommandA]
2. 作業Bを行う [CommandB]
3. 作業Cを行う [CommandC]
99. 終了
番号またはコマンド >2
-------------------------------------------------
ログ・ファイルのパス >~/log.txt
~/log.txt を出力しました。
~/log.txt
2
OS によっては、ファイルをプロンプトにドラッグ&ドロップすることで、パスを入力できます。
上記の黄色い部分が、ユーザーが入力する部分です。
コマンド名は、大文字と小文字を区別しません。 つまり、コマンド名の大文字の文字が小文字
になっていたとしても起動できます。
コマンドを入力した後、パラメーターやファイルへのパスの入力を求められることがあります。
使い勝手の悪い専門的なプログラムは、それを支援するスクリプトを作成して、アプリケー
ション・プロンプトの形にして、画面で見るマニュアル を用意すると、使いやすくなります。
画面で見るマニュアルから、専用コマンドをコピー&ペーストしたり、ショートカットから
起動することで、次々と魔術(スクリプト)を繰り出す速記原典(ショートハンド)のように、
次々と処理を発動させることができるようになります。
使いやすさは、CUI や GUI に関わらず、電子マニュアルの構成によって、大きく左右され
ます。 検索可能なユースケース・ベースのハイパーテキストでできたマニュアルを、Snap
Note などで作成するとよいでしょう。
テンポラリ・フォルダー
マニュアルを作成するときは、ユーザーがしたいこと(ユースケース)ごとの章と、コマンド
ごとの章(索引)の両方を用意するとよいでしょう。
参考
メニューに表示されていないコマンドを起動することもできます。
alias menu='$HOME/bashlib/menu'
起動するコマンドを短縮するには、たとえば、下記のようにエイリアスを作ってください。
~/bashlib/menu SearchFile ~/source "*.txt" ""
menu を起動するコマンドラインに、入力する内容を並べると、メニューを表示しないで、
すぐにコマンドを実行します。
* を含む入力をするときは、" " で囲んでください。
何も入力しない項目には、"" を指定してください。
bashlib が提供するサンプル・コマンドを起動するメニューです。
bashlib menu - shorthand prompt
1. ヘルプ(SVG形式)を開く (Google Chrome や Snap Note で見えます) [Help]
2. ファイルを検索する [SearchFile]
3. 新規作成する - bashlib が使えるシェル・スクリプト・ファイル [NewSh]
4. 新規作成する - ショートハンド・プロンプトのメニュー [NewMenu]
5. 圧縮ファイルを解凍する。ファイル名を一覧する [Extract]
6. 拡張子から実行属性を設定/解除する [chmod_x]
7. bashlib の自動テストを実行する [Test]
99. 終了
が表示されます。
メニューに表示されていないコマンドを起動することもできます。
メニューを開くと、入力を要求する
サンプル・コマンドのヘルプ
番号またはコマンド >SearchFile
((( SearchFile_sth_func )))
Enter のみ: /home/user1
検索するフォルダーのパス >~/bashlib
Enter のみ: すべてのファイル
ファイル名のフィルター 例 *.txt >*.txt
Enter のみ: 内容を検索しない
キーワード >
-------------------------------------------------------------------------------
Search in /home/user1/bashlib/*.txt
/home/user1/bashlib/README.txt
/home/user1/bashlib/はじめて使うときは.txt
~/bashlib
*.txt
SearchFile
ファイル名、またはファイルの内容を指定して、ファイルを検索します。
内部で、Linux の find コマンドと grep コマンドを使っています。
テスト
bashlib が使えるシェル・スクリプト・ファイルを新規作成します。
テスト
番号またはコマンド >NewSh
((( NewSh_sth_func )))
Enterのみ:カレントの a.sh
新しいファイルのパス >
/home/user1/a.sh を作成しました。
/home/user1/scriptlib フォルダーを作成しました。
NewSh
が参照できる場所でなければ、scriptlib フォルダーも作成して
すぐに実行できる状況にします。
が起動するシェル・スクリプト・ファイルを
テスト
番号またはコマンド >NewMenu
((( NewMenu_sth_func )))
Enterのみ:カレントの a.sh
新しいファイルのパス >
/home/user1/a.sh を作成しました。
/home/user1/scriptlib フォルダーを作成しました。
NewMenu
が参照できる場所でなければ、scriptlib フォルダーも作成して
すぐに実行できる状況にします。
新規作成します。
番号またはコマンド >Extract
((( Extract_sth_func )))
圧縮ファイルのパス >~/sample.tar.bz2
Enterのみ: ファイル名を一覧する
[Ctrl]+[C] : 中断
解凍先フォルダーのパス >~/sample
圧縮ファイル(*.tar.bz2, *.tar.gz, *.zip) の中のファイルを一覧して展開します。
テスト
関連
Extract
~/sample.tar.bz2
~/sample
番号またはコマンド >chmod_x
((( chmod_x_sth_func )))
Enterのみ:/home/user1/bashlib/test
処理を行うフォルダーのパス >
Enterのみ:*.sh
実行属性を設定するファイル("."=設定しない, CSV形式)>
Enterのみ:*.txt, *.html, *.svg
実行属性を解除するファイル("."=解除しない, CSV形式)>
複数のファイルの実行属性をまとめて設定または解除します。
chmod_x
テスト
関連
ユーザーインターフェース
実行するコマンドを表示しながら実行します。
EchoOn_func で表示するモードを、元に戻します。
シェルにメッセージを表示して、Enter キーを押すまで待ちます。
シェルにメッセージを表示して、ユーザーに入力を求めます。
水平線を表示します。
エスケープがあるテキストを表示します。 echo -e と同じです。
テキストに色を付ける。
キーボードを自動入力します。
ショートハンド・プロンプトを開きます。
ユーザーにファイルやフォルダーのパスの入力を求めます。