On Sun, Jun 18, 2017 at 02:02:05PM -0700, L A Walsh wrote: [...] > int dpi=$(ord $(<"$pixels_path" 2>/dev/null)) > > This used to work but now works _unreliably_.
In what version does this used to work? I tested on a couple of versions, and the behavior you describe didn't work: dualbus@debian:~/src/gnu/bash-builds$ for b in bash-*/; do $b/bash -c 'echo $(< <(echo x)) $BASH_VERSION'; done x 3.2.57(1)-release x 4.2.0(1)-release x 4.2.53(1)-release x 4.3.30(1)-release dualbus@debian:~/src/gnu/bash-builds$ for b in bash-*/; do $b/bash -c 'echo $(< <(echo x) >/dev/stdout) $BASH_VERSION'; done 3.2.57(1)-release 4.2.0(1)-release 4.2.53(1)-release 4.3.30(1)-release And if you inspect the source code, you'll notice that this the command substitution "cat file" functionality is implemented in here: builtins/evalstring.c: 413 /* See if this is a candidate for $( <file ). */ 414 if (startup_state == 2 && 415 (subshell_environment & SUBSHELL_COMSUB) && 416 *bash_input.location.string == '\0' && 417 command->type == cm_simple && !command->redirects && 418 (command->flags & CMD_TIME_PIPELINE) == 0 && 419 command->value.Simple->words == 0 && 420 command->value.Simple->redirects && 421 command->value.Simple->redirects->next == 0 && 422 command->value.Simple->redirects->instruction == r_input_direction && 423 command->value.Simple->redirects->redirector.dest == 0) 424 { 425 int r; 426 r = cat_file (command->value.Simple->redirects); 427 last_result = (r < 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS; 428 } It's clear that the following conditions must be met: - The redirection must be performed inside a command substitution (ln. 415) - The command substitution must be a simple command (ln. 417) - The simple command must consist of a single input redirection (ln. 420), i.e. no words (ln. 419), no "next" redirection (ln. 421), input redirection (ln. 422), and the target being file descriptor 0 (ln. 423). So that means that `echo $(<X 2>Y)' is not a valid "cat file" command substitution. I think that you're looking for: $ bash -c 'printf "x\0y" > f; { a=$(<f); } 2>/dev/null; declare -p a' declare -- a="xy" Instead. -- Eduardo Bustamante https://dualbus.me/