Busybox's ash built-in commands -e.g. echo, printf, cd- returns an error
if the stdout/stderr device is not available. In particular, I reached
this behavior while debugging a Debian initramfs, where ash built-in
commands are run during boot, before the console is available.

 POSIX mandates that these functions return a nonzero code when an error
occurs. This includes not being able to write to stdout. So the commands
are conforming, it's definitely not a bug.


_log_msg()
{
   if [ "${quiet?}" = "y" ]; then return; fi
   # shellcheck disable=SC2059
   printf "$@"
   return 0 # Prevents error carry over in case of unavailable console
}

 That is valid.
 Another way of proceeding is enforcing set +e at the beginning of
the script, and explicitly exiting on command failures that are deemed
fatal.


* As I'm not sure if this is really a bug or not, I'm sending this as an
RFC. So, the question of this RFC is: should this be considered a bug
and get fixed properly?

 Not a bug. What needs to be fixed is the scripts that assume cd, echo
and printf always succeed. Adding "||:" after a command that must always
succeed is easy enough - but hindsight is 20/20 :)


From Busybox ash source code, it can be seen that the *lone-dash* case
`cd -` tries to print to stdout. The other cd cases with the target
directory explicitly set don't fail as they don't try to open the output
device, which is unavailable at that point.

 Working as intended: "cd -" is specified to be equivalent to
'cd "$OLDPWD" && pwd', and it's the only case where cd writes to stdout.

 I'm afraid cd - >/dev/null is the best workaround you can get.
Shell scripting is fraught with peril, and stdout being unavailable is
a common pitfall.

 Good luck,

--
 Laurent

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to