The script_findスクリプト この付録には、第4章「複雑なスクリプト」で説明されているscript_findの全リストが 掲載されています。このスクリプトは、script_findscript_findの後にリストされているFind.stickyと呼ばれるという従属的な スクリプトを実行します。 メイン・スクリプト・ウィンドウの[ヘルプ]ボタンをクリックするとアクセスされるFind.helpと呼ばれるテキスト・フィールドもあります。 このスクリプトのより詳細な情報は、第4章を参照してください。 script_findのリスト #! /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 attempts 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 次のスクリプトFind.stickyFind.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 Find.helpは、メインのscript_findウィンドウの[ヘルプ]ボタンを クリックすると画面に表示されるテキスト・ファイルです。 This dialog presents a graphical interface to the UNIX `find' command. The only required field is the name of the directory to be searched; all other fields are optional. Once the fields have been set to the desired values, you can use the `Ok' or `Apply' button to initiate the find operation. The results of the find operation are displayed in a dtterm terminal window.