この付録は、第 4 章「複雑なスクリプト」で説明する script_find の全リストです。スクリプトは、script_find の後にリストされている Find.sticky という二次スクリプトを実行します。ユーザがメイン・スクリプト・ウィンドウの [ヘルプ] ボタンをクリックすると表示できる Find.help というテキスト・ファイルもあります。スクリプトの詳細は、第 4 章「複雑なスクリプト」を参照してください。
#! /usr/dt/bin/dtksh set -u . /usr/dt/lib/dtksh/DtFuncs.dtsh # # This sample shell script provides a graphical interface to the # `find' command. Each time it is executed, it will attempt to # restore the dialog to the last set of values entered by the user. # When the `find' command is initiated, the output will be displayed # in a dtterm window. # # # Post an# error dialog. The main application window is disabled # until the error dialog is unposted. The message to be displayed # in the # error dialog is passed in as $1 # PostErrorDialog() { DtDisplayErrorDialog "Find Error" "$1" ¥ DIALOG_PRIMARY_APPLICATION_MODAL } # # This is both the `Ok' and the `Apply' callback; in the case of the # `Ok' callback, it unposts the main application window, and then # exits, if the dialog contains valid information. For both `Ok' and # `Apply', the set of search directories is first validated; if any # of the paths are not valid, then an error dialog is posted. # Otherwise, the `find' process is started in a terminal window. # OkCallback() { RetrieveAndSaveCurrentValues if [ "$SD_VAL" = "" ] ; then PostErrorDialog "You must specify a directory to search" else for i in $SD_VAL ; do if [ ! -d $i ] ; then MSG="The following search directory does not exist: $i" PostErrorDialog "$MSG" return 1 fi done if [ $CB_WIDGET = $OK ] ; then XtPopdown $TOPLEVEL fi CMD="/bin/find $SD_VAL" if [ ! "$FNP_VAL" = "" ] ; then CMD=$CMD" -name $FNP_VAL" fi if ! $(XmToggleButtonGetState $T1); then CMD=$CMD" -xdev" fi if $(XmToggleButtonGetState $T3); then CMD=$CMD" -hidden" fi if $(XmToggleButtonGetState $T4); then CMD=$CMD" -follow" fi if $(XmToggleButtonGetState $T5); then CMD=$CMD" -depth" fi case $FSTYPE_VAL in $NFS) CMD=$CMD" -fsonly nfs" ;; $CDFS) CMD=$CMD" -fsonly cdfs" ;; $HFS) CMD=$CMD" -fsonly hfs" ;; *) ;; esac case $FILETYPE_VAL in $REGULAR) CMD=$CMD" -type f" ;; $DIRECTORY) CMD=$CMD" -type d" ;; $BLOCK) CMD=$CMD" -type b" ;; $CHAR) CMD=$CMD" -type c" ;; $FIFO) CMD=$CMD" -type p" ;; $SYMLINK) CMD=$CMD" -type l" ;; $SOCKET) CMD=$CMD" -type s" ;; $NET) CMD=$CMD" -type n" ;; $MOUNT) CMD=$CMD" -type M" ;; $HIDDEN) CMD=$CMD" -type H" ;; *) ;; esac if $(XmToggleButtonGetState $T2); then CMD=$CMD" -print" fi /usr/dt/bin/dtterm -title "Find A File" -e /usr/dt/bin/dtexec ¥ -open -1 $CMD & if [ $CB_WIDGET = $OK ] ; then exit 0 fi fi } # # This function attempt to load in the previous dialog values. # Each line read from the file is then interpreted as a ksh command. # LoadStickyValues() { if [ -r "./Find.sticky" ] ; then exec 6< "./Find.sticky" XtAddInput FID 6 "EvalCmd" fi } # # This function is invoked for each line in the `sticky' values file. # It will evalutate each line as a dtksh command. # EvalCmd() { if [ ${#INPUT_LINE} -gt 0 ]; then eval "$INPUT_LINE" fi if [ "$INPUT_EOF" = `true' ]; then XtRemoveInput $INPUT_ID eval exec $INPUT_SOURCE'<&-' fi } # # This function retrieves the current values, and then saves them # off into a file, so that they can be restored the next time the # dialog is displayed. It is called anytime the user selects either # the "Ok" or "Apply" buttons. # RetrieveAndSaveCurrentValues() { XmTextGetString SD_VAL $SD XmTextGetString FNP_VAL $FNP XtGetValues $FSTYPE menuHistory:FSTYPE_VAL XtGetValues $FILETYPE menuHistory:FILETYPE_VAL exec 3> "./Find.sticky" if [ ! "$SD_VAL" = ""] ; then print -u 3 "XmTextSetString ¥$SD ¥"$SD_VAL¥"" print -u 3 "XmTextFieldSetInsertionPosition ¥$SD ${#SD_VAL}" fi if [ ! "$FNP_VAL" = "" ] ; then print -u 3 "XmTextSetString ¥$FNP ¥"$FNP_VAL¥"" print -u 3 "XmTextFieldSetInsertionPosition ¥$FNP ${#FNP_VAL}" fi case $FSTYPE_VAL in $NFS) FST="¥$NFS" ;; $CDFS) FST="¥$CDFS" ;; $HFS) FST="¥$HFS" ;; *) FST="¥$NODIR" ;; esac print -u 3 "XtSetValues ¥$FSTYPE menuHistory:$FST" case $FILETYPE_VAL in $REGULAR) FT="¥$REGULAR" ;; $DIRECTORY) FT="¥$DIRECTORY" ;; $BLOCK) FT="¥$BLOCK" ;; $CHAR) FT="¥$CHAR" ;; $FIFO) FT="¥$FIFO" ;; $SYMLINK) FT="¥$SYMLINK" ;; $SOCKET) FT="¥$SOCKET" ;; $NET) FT="¥$NET" ;; $MOUNT) FT="¥$MOUNT" ;; $HIDDEN) FT="¥$HIDDEN" ;; *) FT="¥$NOTYPE" ;; esac print -u 3 "XtSetValues ¥$FILETYPE menuHistory:$FT" if $(XmToggleButtonGetState $T1); then print -u 3 "XmToggleButtonSetState ¥$T1 true false" fi if $(XmToggleButtonGetState $T2); then print -u 3 "XmToggleButtonSetState ¥$T2 true false" fi if $(XmToggleButtonGetState $T3); then print -u 3 "XmToggleButtonSetState ¥$T3 true false" fi if $(XmToggleButtonGetState $T4); then print -u 3 "XmToggleButtonSetState ¥$T4 true false" fi if $(XmToggleButtonGetState $T5); then print -u 3 "XmToggleButtonSetState ¥$T5 true false" fi exec 3<&- } ################ Create the Main UI #################### set -f XtInitialize TOPLEVEL find Dtksh $0 "${@:-}" XtSetValues $TOPLEVEL title:"Find Files" XtCreateManagedWidget FORM form XmForm $TOPLEVEL XtCreateManagedWidget SDLABEL sdlabel XmLabel $FORM ¥ labelString:"Search Directory:" ¥ $(DtkshAnchorTop 12) ¥ $(DtkshAnchorLeft 10) XtCreateManagedWidget SD sd XmText $FORM ¥ columns:30 ¥ value:"." ¥ $(DtkshAnchorTop 6) ¥ $(DtkshRightOf $SDLABEL 10) ¥ $(DtkshAnchorRight 10) ¥ navigationType:EXCLUSIVE_TAB_GROUP XmTextFieldSetInsertionPosition $SD 1 XtCreateManagedWidget FNPLABEL fnpabel XmLabel $FORM ¥ labelString:"Filename Pattern:" ¥ $(DtkshUnder $SDLABEL 24) ¥ $(DtkshAnchorLeft 10) XtCreateManagedWidget FNP fnp XmText $FORM ¥ columns:30 ¥ $(DtkshUnder $SD 8) ¥ $(DtkshRightOf $FNPLABEL 10) ¥ $(DtkshAnchorRight 10) ¥ navigationType:EXCLUSIVE_TAB_GROUP XtCreateManagedWidget SEP sep XmSeparator $FORM ¥ separatorType:SINGLE_DASHED_LINE ¥ $(DtkshUnder $FNP 10) ¥ $(DtkshSpanWidth) XtCreateManagedWidget RC rc XmRowColumn $FORM ¥ orientation:HORIZONTAL ¥ numColumns:3 ¥ packing:PACK_COLUMN ¥ $(DtkshUnder $SEP 10) ¥ $(DtkshSpanWidth 10 10) ¥ navigationType:EXCLUSIVE_TAB_GROUP DtkshAddButtons -w $RC XmToggleButtonGadget ¥ T1 "Cross Mount Points" ""¥ T2 "Print Matching Filenames" ""¥ T3 "Search Hidden Subdirectories" ""¥ T4 "Follow Symbolic Links" ""¥ T5 "Descend Subdirectories First" "" XtCreateManagedWidget SEP2 sep XmSeparator $FORM ¥ separatorType:SINGLE_DASHED_LINE ¥ $(DtkshUnder $RC 10) ¥ $(DtkshSpanWidth) XmCreatePulldownMenu PANE $FORM pane DtkshAddButtons -w $PANE XmPushButtonGadget ¥ NODIR "no restrictions" ""¥ NFS "nfs" ""¥ CDFS "cdfs" ""¥ HFS "hfs" "" XmCreateOptionMenu FSTYPE $FORM fstype ¥ labelString:"Restrict Search To File System Type:" ¥ menuHistory:$NODIR ¥ subMenuId:$PANE ¥ $(DtkshUnder $SEP2 20) ¥ $(DtkshSpanWidth 10 10) ¥ navigationType:EXCLUSIVE_TAB_GROUP XtManageChild $FSTYPE XmCreatePulldownMenu PANE2 $FORM pane2 DtkshAddButtons -w $PANE2 XmPushButtonGadget ¥ NOTYPE "no restrictions" ""¥ REGULAR "regular" ""¥ DIRECTORY "directory" ""¥ BLOCK "block special" ""¥ CHAR "character special" ""¥ FIFO "fifo" ""¥ SYMLINK "symbolic link" ""¥ SOCKET "socket" ""¥ NET "network special" ""¥ MOUNT "mount point" ""¥ HIDDEN "hidden directory" "" XmCreateOptionMenu FILETYPE $FORM filetype ¥ labelString:"Match Only Files Of Type:" ¥ menuHistory:$NOTYPE ¥ subMenuId:$PANE2 ¥ $(DtkshUnder $FSTYPE 10) ¥ $(DtkshSpanWidth 10 10) ¥ navigationType:EXCLUSIVE_TAB_GROUP XtManageChild $FILETYPE XtSetValues $FILETYPE spacing:90 XtCreateManagedWidget SEP3 sep3 XmSeparator $FORM ¥ $(DtkshUnder $FILETYPE 10) ¥ $(DtkshSpanWidth) XtCreateManagedWidget OK ok XmPushButton $FORM ¥ labelString:"Ok" ¥ $(DtkshUnder $SEP3 10) ¥ $(DtkshFloatLeft 4) ¥ $(DtkshFloatRight 24) ¥ $(DtkshAnchorBottom 10) XtAddCallback $OK activateCallback "OkCallback" XtCreateManagedWidget APPLY apply XmPushButton $FORM ¥ labelString:"Apply" ¥ $(DtkshUnder $SEP3 10) ¥ $(DtkshFloatLeft 28) ¥ $(DtkshFloatRight 48) ¥ $(DtkshAnchorBottom 10) XtAddCallback $APPLY activateCallback "OkCallback" XtCreateManagedWidget CLOSE close XmPushButton $FORM ¥ labelString:"Close" ¥ $(DtkshUnder $SEP3 10) ¥ $(DtkshFloatLeft 52) ¥ $(DtkshFloatRight 72) ¥ $(DtkshAnchorBottom 10) XtAddCallback $CLOSE activateCallback "exit 1" XtCreateManagedWidget HELP help XmPushButton $FORM ¥ labelString:"Help" ¥ $(DtkshUnder $SEP3 10) ¥ $(DtFloatLeft 76) ¥ $(DtkshFloatRight 96) ¥ $(DtkshAnchorBottom 10) XtAddCallback $HELP activateCallback ¥ "DtkshDisplayQuickHelpDialog `Using The Find Command' HELP_TYPE_FILE ¥ `./Find.help' " XtSetValues $FORM ¥ initialFocus:$SD ¥ defaultButton:$OK ¥ cancelButton:$CLOSE ¥ navigationType:EXCLUSIVE_TAB_GROUP DtkshSetReturnKeyControls $SD $FNP $FORM $OK LoadStickyValues XtRealizeWidget $TOPLEVEL XtMainLoop
次のスクリプト Find.sticky は script_find によって実行されます。Find.sticky は、最後に script_find を実行したときに使用したファイルとディレクトリの名前を記録します。
XmTextSetString $SD "/users/dlm" XmTextFieldSetInsertionPosition $SD 10 XmTextSetString $FNP "elmbug" XmTextFieldSetInsertionPosition $FNP 6 XtSetValues $FSTYPE menuHistory:$NODIR XtSetValues $FILETYPE menuHistory:$DIRECTORY XmToggleButtonSetState $T1 true false XmToggleButtonSetState $T2 true false
Find.help は、ユーザがメインの script_find ウィンドウの [ヘルプ] ボタンをクリックしたときに画面に表示されるテキスト・ファイルです。
このダイアログは UNIX の find コマンドのグラフィック・インタフェースを提供します。唯一必要とするフィールドは、検索するディレクトリ名です。他のフィールドは、オプションです。フィールドに希望する値を設定して、[了解] または [適用] を使用して find 処理を開始します。find 処理の結果は、dtterm の端末エミュレータに表示されます。