[Top][All Lists]

[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  
-DSYS_BASHRC='/etc/bash/bashrc' -DSYS_BASH_LOGOUT='/etc/bash/bash_logout' 
-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.

reply via email to

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