2012-06-15

簡単なbashスクリプト: ユーティリティ・スクリプト

漸くBashの感じが掴めてきた。特に汎用性の高いファンクション群を纏めることで、再利用が効率的になると思った。

取り敢えず、次のスクリプト・ファイル、「$HOME/myBash/My_Utilities」を作成した。
#!/bin/bash

###################################################################
# 目的:このユーティリティ・ファイルに、小さな関数群を纏めておく。                     #
# 開始:   2012-06-14  (木) 10:00                                           #
###################################################################
#
#   要件: ~/.bashrcに、下記を追加する。
#            「. myBash/My_Utilities」
#            「myBash」は$HOMEの直下で$PATHが通っている。
#
#   使い方:
#           通常の関数としてコール
#           引数は個別の「利用」を参照。
#           作り終えたら、ClipMenu → my用語 →「関数説明の雛形」を用いて説明する。
#
###################################################################

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# My_Home #
#機能: show "Users home directory"
#利用:引数はなし。"$HOMO"と同じだった。;-P)
#       1) MyHome(ret)
#       2) cd `MyHome`
#
#効能: スクリプト中で「~」を使うと「/var/なんとか」に飛ばされるので。
#
#制作:
#   1) 開始 2012-06-14  (木) 10:42 by mNeji
#
#------------------------------------------------------------------------#
My_Home()
#------------------------------------------------------------------------#
{
    echo /Users/$( whoami )
}

#------------------------------------------------------------------------#


#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# My_LogTouch #
#機能:    $HOMEの下のディレクトリ;引数のDirectoryName(無ければ作り);の配下に、
#       現在のタイムスタンプ名の.logをtouchする。
#具体例:
#       $MyLogTouch abc
#       $cd ~/ab
#       $cd ~/abc
#       $ ll
#       total 0
#       -rw-r--r--  1 u1  staff  0  6 14 18:22 2012-06-14-182257.log
#:
#依存: My_Date2
#
#制作:
#   1) 開始 2012-06-14  (木) 19:08 by mNeji
#
#------------------------------------------------------------------------#
My_LogTouch()
#------------------------------------------------------------------------#
{
# Usage: MyLogTouch DirectoryName
#   touch YYYY-MM-dd-hhmmss.log
#
# DirectoryName: Relative to $HOME
    #set -x
    local dn="$HOME/$1"
    #
    # Check and Make Directory $dn
    #
    if [ -d "$dn" ]
    then
        #echo "alredy exist $dn"
        :
    else
        # echo "not exist $dn"
        mkdir $dn
    ls -l $HOME | grep $1
    fi
    #
    # fileN
    #
    local fileN=`My_Date2`.log
    echo $dn/$fileN
    touch $dn/$fileN
    echo "---> touchd `ls $dn/$fileN`"
}
#
#------------------------------------------------------------------------#


#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# My_Date #
#-----------------------------------
# 表示: "2012-06-15(金)15:48:03"
#
#-------------------------
#制作:
#   1) 2012-06-15(金)15:48:03 by mNeji
#
#------------------------------------------------------------------------#
My_Date()
#------------------------------------------------------------------------#
{
    date +'%Y-%m-%d(%a)%H:%M:%S'
}
#
#------------------------------------------------------------------------#


####################################################################
# My_Date2 #
#-----------------------------------
# 機能:# Output: "YYYY-MM-DD-hhmmss"
#
#-------------------------
#制作:
#   1) 2012-06-14  (木) 19:23 by mNeji
#
#------------------------------------------------------------------------#
My_Date2()
#------------------------------------------------------------------------#
{
    date +'%Y-%m-%d-%H%M%S'
}
#
#------------------------------------------------------------------------#


#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
# My_UtilsList #
#-----------------------------------
# 機能:
#       「~/myBash/MyUtilities」中の関数名だけの行をリストする。
##             関数名の定義として
##             行頭に、#,数字は無く
##             行尾に、()がついている 
#     
#------------------------
# 具体例:
#       $ MyUtilsList(ret)
#     
#

#-------------------------
#制作:
#   1) 開始 2012-06-15  (金) 00:38 by mNeji
#   2) 追加 2012-06-15  (金) 12:51 sort
#------------------------------------------------------------------------#
My_UtilsList()
#------------------------------------------------------------------------#
{
    cat $HOME/myBash/My_Utilities | grep \(\)$ | grep ^[^#] | sort
}
#
#------------------------------------------------------------------------#


#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#

# 次のスクリプト予定地

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Bashの立ち上げ表示スクリプト
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
# ターミナル.appが開く毎に、.bashrcから呼びさされる。
# 制作:2012-06-15(Fri)16:04:31
echo "`My_Date`  Functions are ready at 'My_Utilities';"
echo "--------------------------------------------------------------------"
echo $(My_UtilsList |sed 's/\(\)..$/, /')| sed 's/,$/./'
echo "--------------------------------------------------------------------"

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#




#MyHome
#MyDate2
#MyLogFile abc
#test() grep \(\)$
#test()
#1abc()
#xyz()
なお、「.bshrc」に次の行を追加した;
# Read the MyUtiliteis directory within current shell
. myBash/MyUtilities
新しいターミナルを開き、動作の確認をした;
Last login: Fri Jun 15 16:11:40 on ttys006
2012-06-15(Fri)16:13:01  Functions are ready at 'My_Utilities';
--------------------------------------------------------------------
My_Date, My_Date2, My_Home, My_LogTouch, My_UtilsList.
--------------------------------------------------------------------
u1@div-mmX74:~ $
u1@div-mmX74:~ $ My_Date
2012-06-15(金)16:13:17
u1@div-mmX74:~ $
u1@div-mmX74:~ $
u1@div-mmX74:~ $ My_Date2
2012-06-15-161332
u1@div-mmX74:~ $
u1@div-mmX74:~ $
u1@div-mmX74:~ $ My_Home
/Users/u1
u1@div-mmX74:~ $
u1@div-mmX74:~ $
u1@div-mmX74:~ $ My_LogTouch abc
/Users/u1/abc/2012-06-15-161415.log
---> touchd /Users/u1/abc/2012-06-15-161415.log
u1@div-mmX74:~ $
u1@div-mmX74:~ $
u1@div-mmX74:~ $ My_UtilsList
My_Date()
My_Date2()
My_Home()
My_LogTouch()
My_UtilsList()
u1@div-mmX74:~ $
u1@div-mmX74:~ $
u1@div-mmX74:~ $
今後、関数群を製作する毎に、「$HOME/myBash/My_Utilities」に追加して、「$ My_UtilsList」コマンドで関数群のリストを出せる訳だ。

これらのユーティリティを使って当面の課題である「Time Machine」の手動バックアップ・スクリプトは書けそうだ。でもbashに突き進むより、zshやPythonに移行するのが善いと思えるようになってきた。

いずれにしろ正規表現は本腰をいれて練習をせねば...。


ーーーー
このポストの履歴
  1. 開始: 2012-06-15-01:22(JST)
  2. 修正: 2012-06-15  (金) 16:23



2012-06-11

簡単なbashスクリプト: タイムスタンプをペースト・バッファに入れる

キーボード・ショートカットの検索中に、「ペースト」関連を探索する際に「pbcopy」なるコマンドに出会った。コマンドの出力をパイプで「pbcopy」に渡すだけらしい。以前から欲しかったコマンドなので、「dateClip」というのを作ってみました;
#!/bin/bash

# dateClip: put 'formated-date' to clip-board(paste board)-V
#
# usage: dateClip(ret)
#        「(command)-(V)」
#
# 2012-06-11(月)20:50:00 by mNeji
#

echo -n `date +'%Y-%m-%d(%a)%H:%M:%S'` | pbcopy
 今のところ、ターミナルで「dateClip(return)」と打、必要なところで「(command)-(V)」でペーストします。GUIから簡単に呼び出せれば、面白そうなのだが...。現状では「ClipMenuの.js」の方が、使い勝手は良い。

ーーーー
このポストの履歴
  1. 開始: 2012-06-11-23:00(JST)


2012-06-10

図書紹介#017:「bash Pocket Reference」

これまで「bash」の文法書を買った事がなかった。試しにポケット版のリファレンスを購入してみた;
  • 「bash Pocket Reference
    • Arnold Robbins・著
    • O'Reilly, 2010-05
    • ISBN-13: 978-1-449-38788-8
    • US $9.99, ¥898. アマゾン価格
この本はコンパクトながら、要領よく説明している。長らく数値計算が簡単に出来ないので「for」が苦手だったが、次の説明;
  • p77, 「for  --- Start an arithmetic loop.」
  • p36, 「$((expr)) --- Use the value of enclosed arithmetic expression.」
から、気楽に「整数の数値計算」ができるようになった;
#!/bin/bash

for ((x=1; x<=22; x+=2))
do
    # $((expr)) perform arithmetic expression
    echo $((${x}**2 + 1000))
done
今度は「OS X」に関する英語の解説書を探そうと思う。


ーーーー
このポストの履歴
  1. 開始: 2012-06-10-14:10(JST)




2012-06-09

図書紹介#016:「UNIX ショートカットキー ハンディブック」

最近、「Mac mini」につなげている「Wireless Kyeboard」で,「fn」を用いた「scroll to Top/Bottom:↖/↘」、「page up/down:⇞/⇟」、「return/enter:↩/⌤」、「delete/forward-delete:⌫/⌦」を知って喜んでいる;
  • ターミナルでのショートカット設定?
    • 今頃になって、 「Wireless Kyeboard」はノート系のキーボードと類似のあつかいであるのを知りました。そう判れば、検索も楽になるなぁ。
    • それにしても「Terminal.app」のキーボード・ショートカットの設定は不可思議だ。英語版の解説をボチボチ調べるしかなさそうだ。 
 特に、ブラウザやターミナルで「scroll, page」が重宝している。そこでショートカットを調べているうちに、大田区立洗足池図書館にあるので借りてみた;
  •  「UNIX ショートカットキー ハンディブック」 Linumx&FreeBSD&Mac OS X
    • 佐々木 宣文・著
    • 毎日コミュニケーションズ, 2007-10
    • ISBN-13: 978-4-8399-2593-2
この本は、網羅的・具体的に事例を紹介しているので、文章だけの説明をみてもピンとこなかった事が、便利であることに気づかされた。

「ターミナル編」と「シェル編」とが別々に記述されているのには感心した。ここら辺のバックグランドに興味がでてきた。

「ことえり」のショートカットは、一度完全に試して、覚えようと思った。


なお、「enter」は表計算の入力にも使えるのではないかと思っている。

今更ですが、Linux系の動作も興味深いと思うようになりました。


【追伸】

「forward delete」の文字「⌦」は意外と直ぐに見つかった。でも「delete」の文字「⌫」には梃摺った。其の出典は;



ーーーー
このポストの履歴
  1. 開始 2012-06-09-12:49(JST)
  2. 追伸 2012-06-09  (土) 17:19   「⌦」と「⌫」との出典。


2012-06-06

簡単なbashスクリプト: 簡易ストップウォッチ

二つの時刻の間隔を計る簡易ストップウォッチ・スクリプトをBashで作ってみました。計測の単位は「sec」だけです。

#!/bin/bash

# mySec: A Stopwatch script
#
# usage:    mySec 0 ←     Start-time in unit of sec.
#            mySec   ←     Time-interval from Start-time in unit of sec.
#           mySec now ←    Current Time in unit of sec.
#
# example:
#            $ mySec 0; sleep 3;mySec    # Check#
#            3sec
#            $ mySec 0     # Start the Stopwatch
#            ... Somothing done ...
#            $ mySec     # Stop the Stopwatch
#            81sec
#            $mySec now    # Curent Time in unit of sec.
#            1339041714
#
# 2012-06-06  (水) 20:07, by mNeji

#set -x

if [ "$1" = "now" ]
then
# for "mySec now" ------------------------------------------------
    echo `date +%s`
    exit 0
fi

if [ -z $1 ]
then
# for "mySec" -----------------------------------------------------
    Stop=`date +%s`
    Start=`cat ${0}.start`
    time_interval=`expr ${Stop} - ${Start} `
    echo "${time_interval}sec"
    rm -f ${0}.start   
else
# for "mySec 0" --------------------------------------------------
    # echo `date +%s` | tee ${0}.start
    date +%s > ${0}.start
fi


【関連記事】
  1. 簡単なbashスクリプト 
  2. 外付けHDDの特定パーティションのマウント/アンマウント・スクリプト
  3. bashとpythonとの連携スクリプトで「du」を観易くする


ーーーー
このポストの履歴
  1. 開始: 2012-06-06-20:30(JST)
  2. 修正: 2012-06-07  (木) 13:06


2012-06-04

外付けHDDの特定パーティションのマウント/アンマウント・スクリプト

切っ掛けはアップルのサポートコミュニティ、Mac OS X v10.7 Lionでの論議;
で、「timeutil」コマンドを使えば、GUIの「Time Machine」の「今すぐバックアップを作成」を開ける事無く、CUIからのコマンドでバックアップを開始できると思えるようになった事だ。とりあえず最小のコマンド;
#! /bin/sh

# tmback: Manually execute "Time Machine Backup"
# 2012-05-04 by mNeji

echo "+ Script($0) start at `myDate` ++++++++++++++"
tmVol=`tmutil machinedirectory`
#echo "tmVol: ${tmVol};"
noVol=""
#echo "noVol: ${noVol};"

if [ "$tmVol" = "$noVol" ]; then
    echo "Please wakeup External HDD for Time Machine Backup, Try again!"
else
    echo "+ Time Machine Backu Up for `tmutil machinedirectory` "
    #echo "+ sudo tmutil uniquesize \`tmutil listbackups\` ---------------------"
    #sudo tmutil uniquesize `tmutil listbackups`
    echo "+ sudo tmutil startbackup --block  ---------------------------"
    sudo tmutil startbackup --block
    echo "+ sudo tmutil uniquesize \`tmutil listbackups\` ---------------------"
    sudo tmutil uniquesize `tmutil listbackups`
fi   
echo "+ Script($0) finish at `myDate` +++++++++++++"
echo
 で保存するようになった。かれこれ1ヶ月ほど安定的にバックアップがとれている。

問題は、手動でFinderを経由して外付けHDDの内の「Time Machine」のパーシションを起動する必要がある事だ。そこで、今回は『必要なパティション、$tmVol、をマウント/アンマウントするスクリプト』を作ろうと考えた。


手元の資料としては
であった。svensonさんの記事では「/Volumes/」でのパーティション名(partition name)もしくはヴォリューム名(volume name)とディバイス名(/dev/diskNsM)とを必要と読める。

でもユーザがFinderで認識してしているのは、あくまで「パーティション名(partition name)」なのだからと思い、「diskutil」を弄り回した。その結果;
  • 電源が入っている外付けのリストは「diskutil list」で確認できる。この中にパーティション名($NAME)があれば、次に進む。ここに無ければ電源の投入を注意する。
  • マウントの状況は「diskutil info $NAME」で判るが、直裁に「ls /Volumes」を取って、その中に$NAMEがあるかどうかで判定できる。
  • 具体的tmutilコマンドでは、パーティションはフルパス表現は不要の様子;
    • マウント: diskutil mount $NAME
    • アンマウント: diskutil umontDisk $NAME
      • 一部のアンマウントだけに止
      • めたければ、
      • 「umontDisk → umont」
とすれば善い事が判った。

そこでマウント用のHDDonと、アンマウント用のHDDoffとを作った;

マウント用のHDDon
#!/bin/bash

#
# usage: myHDDon Volume_Name
#              ↑ /Volues/に出てくるパーティション名(partition name)、ヴォリューム名(Volume name)。
#
#               引数なし(no argument)だと、get "diskutil list"
# 2012-06-03 by mNeji
#

# debug ################
# set -x

# Refered Information
# A bash script  to mount and unmount the Windows partition in Mac OS X
# http://forums.macrumors.com/showthread.php?t=195891

# Volume Name of the Partition
NAME=$1

# 無引数(no argument) ######################################
if [ -z $NAME ] ; then
    diskutil list
    exit 1
fi

# 引数(argument)=パーティション名(partition name in /Volumes/) ################

# /Volumes/中にパーティション$NAMEがあるかの判定
### p_name=`ls -1 /Volumes/ | grep ${NAME}`
### echo "p_name: '${p_name}'" # debugging output
if [ -z `ls -1 /Volumes/ | grep ${NAME}` ] ; then
    # パーティション$NAME が存在していない
    # check the $NAME in "'diskutil list'"
    ### echo "--> `basename $0`: Checking $NAME in "'diskutil list'" at `myDate`"
    if [ -z `diskutil list | grep " $NAME " | awk '{print $3}'` ] ; then
        # no $NAME in "diskutil list"
        echo "--> `basename $0`: Turn on POWER SW and Retry ----------------"
        diskutil list
        echo "--> `basename $0`: Turn on POWER SW and Retry ----------------"
        exit 1
    else
        # already Powerd the HDD, then mounting
        diskutil mount $NAME > /dev/null
        ### echo "--> `basename $0`: '${NAME}' mounted now."
        exit 0
    fi
else
    # already mounted the partition
    ### echo "--> `basename $0`: '${NAME}' mounted already."
    exit 0
fi


  アンマウント用のHDDoff
#!/bin/bash

#
# usage: myHDDoff Volume_Name
#              ↑ /Volues/に出てくるパーティション名。
#              そのVolune_Nameのmount/unmoutのトグル・スイッチ
#
#               引数なし(no argument)だと、get "diskutil list"
# 2012-06-03 by mNeji
#

# debug ################
### set -x

# Refered Information
# A bash script  to mount and unmount the Windows partition in Mac OS X
# http://forums.macrumors.com/showthread.php?t=195891

# Volume Name of the Partition
NAME=$1

# 無引数(no argument) ######################################
if [ -z $NAME ] ; then
    diskutil list
    exit 1
fi

# 引数(argument)=パーティション名(partition name in /Volumes/) ################
# p_name=`ls -1 /Volumes/ | grep ${NAME}` # for debugging
# echo "p_name='${p_name}'"

# Check existing of directory of /Volumes/$NAME ##############
partition_name=`ls -1 /Volumes/ | grep ${NAME}`
if [ -z ${partition_name} ] ; then
# there is no /Volumes/$NAME:
    # check the $NAME in "'diskutil list'"
    ### echo Checking $NAME in "'diskutil list'" at `myDate`
    if [ -z `diskutil list | grep " $NAME " | awk '{print $3}'` ] ; then
        # no $NAME in "diskutil list"
        echo "--> `basename $0`: Confirm Volume(Partition)-name! ----------------"
        diskutil list
        echo "--> `basename $0`: Confirm Volume(Partition)-name! ----------------"
        exit 1
    fi     
else
# there is /Volumes/$NAME:
    # unmounting the its all Disk
    diskutil unmountDisk $NAME >/dev/null
    ##### echo "--> `basename $0`: '${NAME}' unmounted Disk now."
    exit 0
fi
なお、判定文の”[  -n $string ]"は上手く動かなかったので、仕方なく”[  -z $string ]"のタイプに統一しました。

ーーーー
  1. 開始 2012-06-04  (月) 12:53 
  2. 修正 2012-06-05  (火) 13:38  「HDDoff: partition_name」←「binary operator expected」対策

注目の投稿

Terminalでの、なんちゃってViモドキ

近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。 『概要』 「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これ...