bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Odd Behavior: $SHLVL decreases in some situations with a pipe


From: H. Thiele
Subject: Odd Behavior: $SHLVL decreases in some situations with a pipe
Date: Mon, 27 Jun 2022 14:02:36 +0200 (CEST)
User-agent: ALL-INKL Webmail 2.11

From: H. Thiele
To: bug-bash@gnu.org
Subject: Odd Behavior: $SHLVL decreases in some situations with a pipe

Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: darwin14.5.0
Compiler: gcc
Compilation CFLAGS: -DSSH_SOURCE_BASHRC
uname output: Darwin ***REDACTED***.local 14.5.0 Darwin Kernel Version 14.5.0: 
Sun
Jun 4 21:40:08 PDT 2017; root:xnu-2782.70.3~1/RELEASE_X86_64 x86_64
Machine Type: x86_64-apple-darwin14.5.0

Bash Version: 5.1
Patch Level: 16
Release Status: release

Description:
In some situations (see Repeat-By) the value of the $SHLVL (Shell Level) 
variable may
unexpectedly decrease by 1, e.g. when the stdout output of "printenv" is 
redirected to
via a pipe.

While I noticed the behavior first when I installed the latest bash on my rusty
Mac OS X I also was able to reproduce it with bash 5.x under Debian and Raspian 
on the
PI. On the other hand I don't see the effect with the old bash 3.x that came 
with
Mac OS X.



Repeat-By:
   $ printenv SHLVL
   1

   $ printf "%u\n" $SHLVL
   1

   $ printenv SHLVL | cat
   0

   $ printf "%u\n" $SHLVL | cat
   1


Note how the result is "0" instead "1" for the 3rd command. Some more 
experienced users
on Reddit (see: 
https://www.reddit.com/r/bash/comments/vlrkk1/odd_behavior_of_shlvl_environment_variable/)
suggest following steps which may provide further clarification for the problem 
with the
hint that it may has something to do with bash's "exec optimization", here is a 
workaround
variant (courtesy of Reddit user aioeu) that successfully forwards the correct 
information
to the next command by inserting a call to "true":

   $ printenv SHLVL | cat
   0
   $ { printenv SHLVL; true; } | cat
   1


Reddit user Electronic_Youth points out some other, perhaps related issue: if 
one sets
SHLVL to a value higher than 999 a warning is generated when a new shell is 
started, but
more interesting a warning is generated two times when printenv is used 
(perhaps suggesting
some code runs twice?) I reproduced that double warning like this:

   $ SHLVL=1001
   $ printenv SHLVL | cat
   bash: warning: shell level (1000) too high, resetting to 1
   bash: warning: shell level (1000) too high, resetting to 1
   1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]