On 2/27/25 14:45, Bird, Tim wrote:
Hey Rob,

I indirectly reported this on a separate thread, but here's a more complete bug 
report,
with steps to reproduce.

If I define a shell function in bash, I can execute the function by putting its 
name
in a variable, and then retrieving the value of the variable at the shell 
interpreter prompt,
like so:

On my desktop machine, running the bash shell:
tbird@timdesk:~$ myfunc() {
echo "inside myfunc"
}
tbird@timdesk:~$ myfunc
inside myfunc
tbird@timdesk:~$ VAR="myfunc"
tbird@timdesk:~$ $VAR
inside myfunc

This doesn't work with the toybox shell.  I get "sh: <func_name>: No such file or 
directory"

When running a toybox shell under qemu, I get the following:
$ myfunc() {
echo "inside myfunc"
}
$ myfunc
inside myfunc
$ VAR="myfunc"
$ $VAR
sh: myfunc: No such file or directory
$

Note that executing an internal or external command from a variable reference 
works:
$ VAR="echo hello"
$ $VAR
hello
$ VAR="cat /etc/passwd"
$ $VAR
root:x:0:0:root:/root:/bin/sh
guest:x:500:500:guest:/home/guest:/bin/sh
nobody:x:65534:65534:nobody:/proc/self:/dev/null
$

Sigh, the sequencing there is fiddly. Aliases are parsed before variable expansion:

  $ alias xyz=potato
  $ XYZ=xyz
  $ $XYZ
  bash: xyz: command not found
  $ alias xyz='$XYZ'
  $ XYZ=potato
  $ xyz
  bash: potato: command not found

But function names are parsed afterwards. Ok...

Alias is still on my todo heap because I do NOT understand bash's escaping behavior for alias. Alias with no arguments and alias -p seem to produce identical output (fine), but:

  $ alias walrus=$'abc\'def'; alias
  alias walrus='abc'\''def'
  $ alias walrus=$'abc\\\'def'; alias
  alias walrus='abc\'\''def'
  $ walrus
  bash: abc'def: command not found
  $ echo $'abc\\\'def'
  abc\'def
  $ alias walrus=$'abc\\\\\'def'
  $ walrus
  > ^C
  $ alias
  alias walrus='abc\\'\''def'
  $ alias walrus=$'abc\\ndef'; alias$ alias -p
  alias walrus='abc\ndef'
  $ walrus
  bash: abcndef: command not found

It's _simultaneously_ treating backslash as special and as not special and I do NOT understand what it's doing and half the time I ask Chet he changes the behavior so my TEST_HOST tests don't behave consistently on old versions new bash and "what success looks like" disappears under version skew. (If my test doesn't pass against the reference version, what am I really testing?)

Also, -p means "print before assigning" which is just strange. Exact same output, not a different format, and:

  $ alias -p one=two
  alias walrus='abc\ndef'
  $ one
  bash: two: command not found

Ahem. Sorry. This is what cloning bash is like. When you poke at the corner cases, it's not so much designed as accumulated.

Anyway, I should fix up the function sequencing THEN tackle aliases...

Thanks,
  -- Tim

Thanks for the heads up,

Rob
_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to