On 6/21/25 08:56, Marc Chantreux wrote:
On Fri, Jun 20, 2025 at 09:21:28AM -0400, Michael Stone wrote:
I agree with this, and question why the austin group is considering it at
all.

well. I shell almost every day for about 30 years now and I'm really
happy about this because sponge is so convenient.

Can't you just do:

  sponge() { local X=$(base64); base64<<<"$X" > $1; }

(Mostly you can do it with X=$(cat) instead and avoid doubling the memory but that can't handle embedded NUL bytes, and I know of no way to convince bash not to strip trailing newlines from $() invocations, so base64 is the data safe way.)

I asked for opinions about this on the toybox list and the Android base OS maintainer wasn't impressed either:

http://lists.landley.net/pipermail/toybox-landley.net/2025-June/030741.html

Beyond the "this really doesn't come up much" problem, sed -i and patch and friends can know if there was an error in processing and keep the old file. Sponge in a pipe doesn't know if the command piping into it failed, so unless you define "no input" as keeping the old file intact (which still doesn't catch a lot of error cases) it will replace the output file whether you want it to or not, it just delays doing it slightly so you can use the same input and output.

To be honest, every time I've needed something like this... isn't that what mktemp is for?

thingy <"$IN" > ${BLAH:=$(mktemp .blahxxxxx)} && mv -f $BLAH "$IN" ||
  { rm -rf $BLAH; return 1; }

Error checking and everything. You can even have a trap handler do the rm if you're feeling posh.

Rob

Reply via email to