Path: csiph.com!xmission!news.snarked.org!news.linkpendium.com!news.linkpendium.com!panix!usenet.stanford.edu!not-for-mail From: worley@alum.mit.edu (Dale R. Worley) Newsgroups: gnu.bash.bug Subject: An xtrace variant Date: Sun, 28 Jun 2020 15:19:27 -0400 Lines: 125 Approved: bug-bash@gnu.org Message-ID: References: <87h7uv0zi8.fsf@hobgoblin.ariadne.com> NNTP-Posting-Host: lists.gnu.org X-Trace: usenet.stanford.edu 1593371977 1749 209.51.188.17 (28 Jun 2020 19:19:37 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcastmailservice.net; s=20180828_2048; t=1593371969; bh=ebjv5oi5zPpbA1QqRXFB+ccmYXEBhnjJdmEl0lmJoEo=; h=Received:Received:Received:Received:Received:From:To:Subject:Date: Message-ID; b=Nf0IObBYgq0r03Ym/PKtA75bza3v8Jbi2FnRzbQd/gVAAtkRc7N2x1Q+HSXUgC2/A lcI0Cbp07wH9qEEHuwt+g1d5TDxtpkQTsAUiqwUonokdV5RNlWFff0a4k6gpifkxkN 8ifOvDQkU0WYzA6PQyNdAkjNBWGC0520smMrg7u/XqVqlX+GSNdGmxET7Atw3CoixP PGr1y0+ChF3Fc+RN5VmHF+WVT0EN7l8X8gNSJxV8fIN64zf9k0cqMvj5dep0QDjSWP /hG0Rfe/JN02K0PPx1nTGtK4m98+jS6t+GfiYqZcov5eBt/ZQvZrCTmNSlnUP1Eshw VkSazGO+jcGFA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcastmailservice.net; s=20180828_2048; t=1593371969; bh=ebjv5oi5zPpbA1QqRXFB+ccmYXEBhnjJdmEl0lmJoEo=; h=Received:Received:Received:Received:From:To:Subject:Date: Message-ID; b=In9XREMjwFlFy6TCgLyEWXdhWvC6v2kIOXSERwdBOqVnwF5/fqdQ2m+t1NgJ5mRHe DR/ulmigalcDTo7xOs8UOdZjH0DcvpOsJUu+EcFaHkIi7eK8qxupVtIXsdhoNdyrBS ssofoE67InoYUDe/jm6bSwYHhLmc3wL6oAjcUgpiuyoXeVirhbvrZiOq7/dybXnc0U 0Pszp3vnwZM7V2rwO8mAAlQTwSonnpnICNM9K3tLNTQkYkMnUC69Tp9MLQNWC8HgXY nNIxSvBgDNqMHmeQWiE0Pu8wVidUSyUqbL8VFFlS+sK1Pp6gcK7MlpCuBUq/suB4Y2 Eh2T1/NSuFZ8g== X-Xfinity-VMeta: sc=0.00;st=legit X-Authentication-Warning: hobgoblin.ariadne.com: worley set sender to worley@alum.mit.edu using -f Received-SPF: softfail client-ip=2001:558:fe21:29:69:252:207:81; envelope-from=worley@alum.mit.edu; helo=resdmta-ch2-01v.sys.comcast.net X-detected-operating-system: by eggs.gnu.org: First seen = 2020/06/28 15:19:29 X-ACL-Warn: Detected OS = ??? X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <87h7uv0zi8.fsf@hobgoblin.ariadne.com> Xref: csiph.com gnu.bash.bug:16472 When debugging a shell script, a useful command is: bash -x script-name The deficiency of this is that "-x" causes all simple commands in your startup files to be echoed as they are executed, and often this output is a lot longer than the output from the commands in the script. For a long time, I've wanted a variant of -x that only echoed the simple commands after bash is done executing the startup files. I finally did a test implementation, naming a new switch "-X". If it is set at the end of the execution of the startup files, then bash sets "-x", which causes subsequent simple commands to be echoed. I named the new option "-X" as a mnemonic variant of "-x". Its long name is "Xtrace", because I couldn't think of anything better. The code changes are quite simple really. Is this a useful idea? Is there a better way to get an effect like this? Dale diff --git a/builtins/set.def b/builtins/set.def index d2bba43..e71c58f 100644 --- a/builtins/set.def +++ b/builtins/set.def @@ -114,6 +114,7 @@ Options: vi use a vi-style line editing interface #endif /* READLINE */ xtrace same as -x + Xtrace same as -X -p Turned on whenever the real and effective user ids do not match. Disables processing of the $ENV file and importing of shell functions. Turning this option off causes the effective uid and @@ -122,6 +123,7 @@ Options: -u Treat unset variables as an error when substituting. -v Print shell input lines as they are read. -x Print commands and their arguments as they are executed. + -X Set -x after startup files are executed. #if defined (BRACE_EXPANSION) -B the shell will perform brace expansion #endif /* BRACE_EXPANSION */ @@ -231,6 +233,7 @@ const struct { { "vi", '\0', (int *)NULL, set_edit_mode, get_edit_mode }, #endif { "xtrace", 'x', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL }, + { "Xtrace", 'X', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL }, {(char *)NULL, 0 , (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL }, }; diff --git a/flags.c b/flags.c index 6e20841..0828f78 100644 --- a/flags.c +++ b/flags.c @@ -159,6 +159,9 @@ int error_trace_mode = 0; with a 0 status, the status of the pipeline is 0. */ int pipefail_opt = 0; +/* Non-zero means set -x after startup files are executed. */ +int echo_commands_after_startup = 0; + /* **************************************************************** */ /* */ /* The Flags ALIST. */ @@ -187,7 +190,7 @@ const struct flags_alist shell_flags[] = { { 't', &just_one_command }, { 'u', &unbound_vars_is_error }, { 'v', &verbose_flag }, - { 'x', &echo_command_at_execute }, + { 'x', &echo_command_at_execute }, /* New flags that control non-standard things. */ #if 0 @@ -204,6 +207,7 @@ const struct flags_alist shell_flags[] = { { 'I', &no_invisible_vars }, { 'P', &no_symbolic_links }, { 'T', &function_trace_mode }, + { 'X', &echo_commands_after_startup }, {0, (int *)NULL} }; diff --git a/flags.h b/flags.h index fdbf7f9..3b6fa8c 100644 --- a/flags.h +++ b/flags.h @@ -48,7 +48,8 @@ extern int echo_command_at_execute, no_invisible_vars, noclobber, hashing_enabled, forced_interactive, privileged_mode, jobs_m_flag, asynchronous_notification, interactive_comments, no_symbolic_links, - function_trace_mode, error_trace_mode, pipefail_opt; + function_trace_mode, error_trace_mode, pipefail_opt, + echo_commands_after_startup; /* -c, -s invocation options -- not really flags, but they show up in $- */ extern int want_pending_command, read_from_stdin; diff --git a/shell.c b/shell.c index a2b2a55..4c40cd4 100644 --- a/shell.c +++ b/shell.c @@ -731,6 +731,10 @@ main (argc, argv, env) start_debugger (); #if defined (ONESHOT) + if (echo_commands_after_startup) { + set_minus_o_option (FLAG_ON, "xtrace"); + set_shellopts (); + } executing = 1; run_one_command (command_execution_string); exit_shell (last_command_exit_value); @@ -791,6 +795,11 @@ main (argc, argv, env) read_and_execute: #endif /* !ONESHOT */ + if (echo_commands_after_startup) { + set_minus_o_option (FLAG_ON, "xtrace"); + set_shellopts (); + } + shell_initialized = 1; if (pretty_print_mode && interactive_shell)