|  | #!/usr/bin/wish | 
|  |  | 
|  | # This file provides shell command procedures cmd_fnc and t_cmd_fnc. | 
|  |  | 
|  | my_source [list print.tcl] | 
|  |  | 
|  |  | 
|  | proc cmd_fnc { cmd_buf { quiet {} } { test_mode {} } { print_output {} }\ | 
|  | { show_err {} } { ignore_err {} } { acceptable_shell_rcs {} } } { | 
|  |  | 
|  | # Run the given command in a shell and return the shell return code and the | 
|  | # output as a 2 element list. | 
|  |  | 
|  | # Example usage: | 
|  | # set result [cmd_fnc "date"]. | 
|  |  | 
|  | # Example output: | 
|  |  | 
|  | # #(CST) 2018/01/17 16:23:28.951643 -    0.001086 - Issuing: date | 
|  | # Mon Feb 19 10:12:10 CST 2018 | 
|  | # result: | 
|  | #   result[0]:                                      0x00000000 | 
|  | #   result[1]:                                      Mon Feb 19 10:12:10 CST | 
|  | # 2018 | 
|  |  | 
|  | # Note: Because of the way this procedure processes parms, the user can | 
|  | # specify blank values as a way of skipping parms.  In the following | 
|  | # example, the caller is indicating that they wish to have quiet and | 
|  | # test_mode take their normal defaults but have print_output be 0.: | 
|  | # cmd_fnc "date" "" "" 0 | 
|  |  | 
|  | # Description of argument(s): | 
|  | # cmd_buf                         The command string to be run in a shell. | 
|  | # quiet                           Indicates whether this procedure should | 
|  | #                                 run the print_issuing() procedure which | 
|  | #                                 prints "Issuing: <cmd string>" to stdout. | 
|  | #                                 The default value is 0. | 
|  | # test_mode                       If test_mode is set, this procedure will | 
|  | #                                 not actually run the command.  If | 
|  | #                                 print_output is set, it will print | 
|  | #                                 "(test_mode) Issuing: <cmd string>" to | 
|  | #                                 stdout.  The default value is 0. | 
|  | # print_output                    If this is set, this procedure will print | 
|  | #                                 the stdout/stderr generated by the shell | 
|  | #                                 command.  The default value is 1. | 
|  | # show_err                        If show_err is set, this procedure will | 
|  | #                                 print a standardized error report if the | 
|  | #                                 shell command returns non-zero.  The | 
|  | #                                 default value is 1. | 
|  | # ignore_err                      If ignore_err is set, this procedure will | 
|  | #                                 not fail if the shell command fails. | 
|  | #                                 However, if ignore_err is not set, this | 
|  | #                                 procedure will exit 1 if the shell command | 
|  | #                                 fails.  The default value is 1. | 
|  | # acceptable_shell_rcs            A list of acceptable shell rcs.  If the | 
|  | #                                 shell return code is found in this list, | 
|  | #                                 the shell command is considered | 
|  | #                                 successful.  The default value is {0}. | 
|  |  | 
|  | # Set defaults. | 
|  | set_var_default quiet [get_stack_var quiet 0 2] | 
|  | set_var_default test_mode 0 | 
|  | set_var_default print_output 1 | 
|  | set_var_default show_err 1 | 
|  | set_var_default ignore_err 1 | 
|  | set_var_default acceptable_shell_rcs 0 | 
|  |  | 
|  | qpissuing $cmd_buf $test_mode | 
|  |  | 
|  | if { $test_mode } { return [list 0 ""] } | 
|  |  | 
|  | set shell_rc 0 | 
|  |  | 
|  | if { [ catch {set out_buf [eval exec bash -c {$cmd_buf}]} result ] } { | 
|  | set out_buf $result | 
|  | set shell_rc [lindex $::errorCode 2] | 
|  | } | 
|  |  | 
|  | if { $print_output } { puts "${out_buf}" } | 
|  |  | 
|  | # Check whether return code is acceptable. | 
|  | if { [lsearch -exact $acceptable_shell_rcs ${shell_rc}] == -1 } { | 
|  | # The command failed. | 
|  | append error_message "The prior shell command failed.\n" | 
|  | append error_message [sprint_var shell_rc "" "" 1] | 
|  | if { $acceptable_shell_rcs != 0 } { | 
|  | # acceptable_shell_rcs contains more than just a single element equal | 
|  | # to 0. | 
|  | append error_message "\n" | 
|  | append error_message [sprint_list acceptable_shell_rcs "" "" 1] | 
|  | } | 
|  | if { ! $print_output } { | 
|  | append error_message "out_buf:\n${out_buf}" | 
|  | } | 
|  | if { $show_err } { | 
|  | print_error_report $error_message | 
|  | } | 
|  |  | 
|  | if { ! $ignore_err } { | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | return [list $shell_rc $out_buf] | 
|  |  | 
|  | } | 
|  |  | 
|  |  | 
|  | proc t_cmd_fnc { args } { | 
|  |  | 
|  | # Call cmd_fnc with test_mode equal to the test_mode setting found by | 
|  | # searching up the call stack.  See cmd_fnc (above) for details for all | 
|  | # other arguments. | 
|  |  | 
|  | # We wish to obtain a value for test_mode by searching up the call stack. | 
|  | # This value will govern whether the command specified actually gets | 
|  | # executed. | 
|  | set_var_default test_mode [get_stack_var test_mode 0 2] | 
|  |  | 
|  | # Since we wish to manipulate the value of test_mode, which is the third | 
|  | # positional parm, we must make sure we have at least 3 parms.  We will now | 
|  | # append blank values to the args list as needed to ensure that we have the | 
|  | # minimum 3 parms. | 
|  | set min_args 3 | 
|  | for {set ix [llength $args]} {$ix < $min_args} {incr ix} { | 
|  | lappend args {} | 
|  | } | 
|  |  | 
|  | # Now replace the caller's test_mode value with the value obtained from the | 
|  | # call stack search.  It does not matter what value is specified by the | 
|  | # caller for test_mode.  It will be replaced.  The whole point of calling | 
|  | # t_cmd_fnc is to allow it to set the test_mode. | 
|  | set args [lreplace $args 2 2 $test_mode] | 
|  |  | 
|  | return [cmd_fnc {*}$args] | 
|  |  | 
|  | } |