とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

「入門bash 第3版」を読む(10)

Windows な私が Cygwin + bash をほげる記録。

進捗

144/348

タスク5-5

task5-5
selectd()
{
    PS3='directory? '
    dirstack=" $DIR_STACK "
    select selection in $DIR_STACK;do
    if [ $selection ];then
	DIR_STACK="$selection${dirstack%% $selection *}"
	DIR_STACK="$DIR_STACK ${dirstack##* $selection }"
	DIR_STACK="${DIR_STACK% }"
	cd $selection
	break
    else
	echo 'invalid selection.'
    fi
    done
}
debug()
{
    echo PS3=\"$PS3\"
    echo dirstack=\"$dirstack\"
    echo selection=\"$selection\"
    echo DIR_STACK=\"$DIR_STACK\"
}
実行結果
~ $>DIR_STACK="/bin /usr /home"
~ $>. task5-5
~ $>debug
PS3=""
dirstack=""
selection=""
DIR_STACK="/bin /usr /home"
~ $>selectd
1) /bin
2) /usr
3) /home
directory? 2
/usr $>debug
PS3="directory? "
dirstack=" /bin /usr /home "
selection="/usr"
DIR_STACK="/usr /bin /home"
/usr $>

selectでインデントしてくれない。何で? >sh-mode
手打ちのデバッグがめんどくさいので関数書いた。
地味なスタックの書き換えアルゴリズムに感動した。

タスク5-6

task5-6
path=$PATH:
while [ "$path" ] ;do
    ls -ld "${path%%:*}"
    path="${path#*:}"
done
実行結果
~ $>echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/cygdrive/c/WINDOWS:/cygdrive/c/WIND
OWS/system32:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/doxygen
/bin:/usr/bin:/usr/lib/lapack
~ $>. task5-6
drwxrwx---+ 2 USER_______NAME Users 0 Apr 11  2007 /usr/local/bin
drwxrwx---+ 2 USER_______NAME Users 0 Nov 23 11:39 /usr/bin
drwxrwx---+ 2 USER_______NAME Users 0 Nov 23 11:39 /bin
drwxrwx---+ 2 USER_______NAME Users 0 Nov 23 11:39 /usr/X11R6/bin
drwxrwx---+ 87 Administrators SYSTEM 0 Nov 20 13:22 /cygdrive/c/WINDOWS
drwxrwx---+ 54 Administrators SYSTEM 0 Nov 28 10:19 /cygdrive/c/WINDOWS/system32
drwxrwx---+ 9 Administrators SYSTEM 0 Apr  9  2007 /cygdrive/c/WINDOWS/System32/
Wbem
drwx------+ 2 USER_______NAME なし 0 May  5  2007 /cygdrive/c/Program Files/doxy
gen/bin
drwxrwx---+ 2 USER_______NAME Users 0 Nov 23 11:39 /usr/bin
drwxrwx---+ 2 USER_______NAME Users 0 Sep 24 14:55 /usr/lib/lapack
~ $>

変数を""でクォーティングしないとスペースを含むパスで困るので改良。
自分のログイン名を毎回晒しそうになって困る。どうしよう…。

タスク5-7

task5-7
until cp $1 $2;do
    echo ' Attempt to copy failed. waiting...'
    sleep 5
done
実行結果
~ $>. task5-7 hoge.txt huge.txt
cp: cannot stat `hoge.txt': No such file or directory
 Attempt to copy failed. waiting...
cp: cannot stat `hoge.txt': No such file or directory
 Attempt to copy failed. waiting...
(C-c で強制終了)

本書によるとuntilは使えない子らしい。whileと文字数が同じだからゴルフでは使えそうだけど。実際のところどう?
って事で5章終了。