about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2022-01-18 23:20:53 +0100
committerMikael Magnusson <mikachu@gmail.com>2022-01-30 18:14:54 +0100
commit8bf0f0cf45606971d1433b36ce21ab45f6226004 (patch)
treedaac95b637e6c878f0185dd25d029ca4649993ad
parent75c3664a62010dfae620d77930f8ea5aae78b602 (diff)
downloadzsh-8bf0f0cf45606971d1433b36ce21ab45f6226004.tar.gz
zsh-8bf0f0cf45606971d1433b36ce21ab45f6226004.tar.xz
zsh-8bf0f0cf45606971d1433b36ce21ab45f6226004.zip
49694 + doc: Allow using empty STTY= to freeze tty for a single command
Previously, doing this would just run stty with no arguments, which
normally causes it to print some terminal settings to stdout.
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/builtins.yo3
-rw-r--r--Doc/Zsh/params.yo5
-rw-r--r--Src/exec.c6
4 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 57c26fb38..98dd85274 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2022-01-30  Mikael Magnusson  <mikachu@gmail.com>
+
+	* 49694 + doc: Doc/Zsh/builtins.yo, Doc/Zsh/params.yo, Src/exec.c:
+	Allow using empty STTY= to freeze tty for a single command
+
 2022-01-29  Daniel Shahaf  <d.s@daniel.shahaf.name>
 
 	* unposted: Functions/VCS_Info/test-repo-git-rebase-apply,
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 733d8f185..c7de50fd6 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1885,7 +1885,8 @@ unfreezing the tty does not guarantee settings made on the
 command line are preserved.  Strings of commands run between
 editing the command line will see a consistent tty state.
 See also the shell variable tt(STTY) for a means of initialising
-the tty before running external commands.
+the tty before running external commands and/or freezing the tty
+around a single command.
 )
 findex(type)
 item(tt(type) [ tt(-wfpamsS) ] var(name) ...)(
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
index 6b52d3b1c..6d2d41b7a 100644
--- a/Doc/Zsh/params.yo
+++ b/Doc/Zsh/params.yo
@@ -1570,6 +1570,11 @@ if it is in the environment of the shell but not explicitly assigned to in
 the input line. This avoids running stty at every external command by
 accidentally exporting it. Also note that tt(STTY) should not be used for
 window size specifications; these will not be local to the command.
+
+If the parameter is set and empty, all of the above applies except
+that tt(stty) is not run. This can be useful as a way to freeze the tty
+around a single command, blocking its changes to tty settings,
+similar to the tt(ttyctl) builtin.
 )
 vindex(TERM)
 item(tt(TERM) <S>)(
diff --git a/Src/exec.c b/Src/exec.c
index 1860a10ed..f67074846 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -684,8 +684,10 @@ execute(LinkList args, int flags, int defpath)
 
     /* If the parameter STTY is set in the command's environment, *
      * we first run the stty command with the value of this       *
-     * parameter as it arguments.                                 */
-    if ((s = STTYval) && isatty(0) && (GETPGRP() == getpid())) {
+     * parameter as it arguments. If the parameter is empty, we   *
+     * do nothing, but this causes the terminal settings to be    *
+     * restored later which can be useful.                        */
+    if ((s = STTYval) && *s && isatty(0) && (GETPGRP() == getpid())) {
 	char *t = tricat("stty", " ", s);
 
 	STTYval = 0;	/* this prevents infinite recursion */