[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
{varname} redirection for a command or group leaves the file open
From: |
Aldo Davide |
Subject: |
{varname} redirection for a command or group leaves the file open |
Date: |
Wed, 10 May 2017 19:07:38 +0200 |
Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: x86_64-pc-linux-gnu-gcc
Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64'
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu'
-DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL
-DHAVE_CONFIG_H -I. -I./include -I. -I./include -I./lib
-DDEFAULT_PATH_VALUE='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
-DSTANDARD_UTILS_PATH='/bin:/usr/bin:/sbin:/usr/sbin'
-DSYS_BASHRC='/etc/bash/bashrc' -DSYS_BASH_LOGOUT='/etc/bash/bash_logout'
-DNON_INTERACTIVE_LOGIN_SHELLS -DSSH_SOURCE_BASHRC -O2 -march=native -pipe
-Wno-parentheses -Wno-format-security
uname output: Linux mycomputer 4.9.24 #8 SMP PREEMPT Tue Apr 25 11:19:58 EEST
2017 x86_64 Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz GenuineIntel GNU/Linux
Machine Type: x86_64-pc-linux-gnu
Bash Version: 4.4
Patch Level: 12
Release Status: release
Suppose that you use a "varname" redirection when executing a simple
command, e.g.:
ls -lh /proc/self/fd {var}>/dev/null
I was surprised to discover that the file descriptor remains open after
the command has completed, as evidenced by issuing the following (works
on linux) immediately afterwards:
echo "var is $var"
ls -lh /proc/$$/fd
This is unlike what happens with standard redirections, e.g.:
ls -lh /proc/self/fd 57>/dev/null
ls -lh /proc/$$/fd
The same problem exists when braces are used to group (possibly)
multiple commands:
{ ls -lh /proc/self/fd; } {var}>/dev/null
echo "var is $var"
ls -lh /proc/$$/fd
On the other hand, everything works just fine with subshells:
(ls -lh /proc/self/fd) {var}>/dev/null
echo "var is $var"
ls -lh /proc/$$/fd
As a side-note, in the subshell example the variable var will be
undefined in the second line, but defined inside the subshell. With
groups it will remain defined after the group:
{ echo "inside the grouping: $var1"; } {var1}>/dev/null
echo "outside the grouping: $var1"
(echo "inside the subshell: $var2") {var2}>/dev/null
echo "outside the subshells: $var2"
So in summary, I would expect groups to work like subshells, both in
regards to closing the file descriptor but also in regards to the scope
of the variable.