Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -g -O2
uname output: Linux portercomp3 6.9.1 #1-NixOS SMP PREEMPT_DYNAMIC Fri
May 17 10:18:09 UTC 2024 x86_64 GNU/Linux
Machine Type: x86_64-pc-linux-gnu

Bash Version: 5.2
Patch Level: 26
Release Status: release

Description:
  The man page for printf says that for integer m, %m$ lets you
specify which argument that the conversion specification will use.
Similarly, using *m$ instead of * in a conversion specification lets
you specify which argument the * will pull from. This feature is
unimplemented in Bash. I am guessing that Bash is using either the ISO
C standard, or an older version of some mainstream compiler for printf
or some other standard, and therefore do not know where to find more
complete documentation for it.

Repeat-By:
The following program runs without warnings or errors in clang, and in
gcc only warns on -Wpedantic with "warning: ISO C does not support %n$
operand number formats [-Wformat=]":
#include <stdio.h>
int main(void) {
    printf("%2$*1$d", 10,100);
    return 0;
}

The following line of bash script errors in bash:
`printf '%2$*1$d' 10 100`
Outputting:
bash: printf: `$': invalid format character


Fix:
 Either update the documentation of what printf in bash actually does.
If printf is using a standard for printf other than "what the biggest
C compilers currently do", document which standard it's using or
update it to the newest standard used by gcc and clang. If it really
is just this one feature that's missing, add it in or document its
absence.

Reply via email to