-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 1/23/12 2:50 AM, Dan Douglas wrote:
> Hello, In the case of exported functions, Bash interprets a copy descriptor
> followed by an expansion as the >& synonym for &>, resulting in the output
> going to a file named as the value of the FD it's given. This only applies
> to
> ">&$var" and not "<&$var". I've tested various quoting, Is there some way
> around this?
Nope, it's a bug. The command printing code is a little aggressive about
translating >& to &>. I've attached a patch that should be enough to
get you by.
Chet
- --
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU [email protected] http://cnswww.cns.cwru.edu/~chet/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk8gbdQACgkQu1hp8GTqdKuy+wCgkdDB7H/C6gUj1X1q8u/UWang
AnYAn2SoWursp9ew88MBhY5dalLn1gSZ
=lgmc
-----END PGP SIGNATURE-----
*** ../bash-4.2-patched/print_cmd.c 2011-04-21 16:53:01.000000000 -0400
--- print_cmd.c 2012-01-25 15:55:49.000000000 -0500
***************
*** 114,117 ****
--- 114,120 ----
#define CHECK_XTRACE_FP xtrace_fp = (xtrace_fp ? xtrace_fp : stderr)
+ /* shell expansion characters: used in print_redirection_list */
+ #define EXPCHAR(c) ((c) == '{' || (c) == '~' || (c) == '$' || (c) == '`')
+
#define PRINT_DEFERRED_HEREDOCS(x) \
do { \
***************
*** 984,987 ****
--- 1000,1004 ----
{
REDIRECT *heredocs, *hdtail, *newredir;
+ char *rw;
heredocs = (REDIRECT *)NULL;
***************
*** 1005,1012 ****
hdtail = heredocs = newredir;
}
! else if (redirects->instruction == r_duplicating_output_word && redirects->redirector.dest == 1)
{
/* Temporarily translate it as the execution code does. */
! redirects->instruction = r_err_and_out;
print_redirection (redirects);
redirects->instruction = r_duplicating_output_word;
--- 1022,1031 ----
hdtail = heredocs = newredir;
}
! else if (redirects->instruction == r_duplicating_output_word && (redirects->flags & REDIR_VARASSIGN) == 0 && redirects->redirector.dest == 1)
{
/* Temporarily translate it as the execution code does. */
! rw = redirects->redirectee.filename->word;
! if (rw && *rw != '-' && DIGIT (*rw) == 0 && EXPCHAR (*rw) == 0)
! redirects->instruction = r_err_and_out;
print_redirection (redirects);
redirects->instruction = r_duplicating_output_word;