On 6/25/25 08:09, enh wrote:
On Tue, Jun 24, 2025 at 7:03 PM Rob Landley <r...@landley.net> wrote:
Anybody have a strong opinion on this command? It's 5 minutes to add,
probably something vaguely like:
USE_SPONGE(NEWTOY(sponge, ">1", TOYFLAG_USR|TOYFLAG_BIN))
void sponge_main(void)
{
off_t len = 0;
char *blah = readfd(0, 0, &len);
xwrite(*toys.optargs?xopen(*toys.optargs, O_CREATE|O_BINARY:1, 700),
presumably O_TRUNC too?
blah, len);
}
https://linux.die.net/man/1/sponge
my opinion reading the coreutils thread was basically "i've never
heard of this in all my decades of unixing, and even now i'm
underwhelmed".
(the arguments about what exactly the semantics should be also leaned
me towards "this is not a convincingly good idea".)
Indeed. As far as I can tell, the reason it exits is because A) you
can't have embedded NUL bytes in a shell variable, B) there's no way to
tell bash NOT to eat trailing newlines:
$ X="$(echo $'abc\n\n\n')"; echo "$X" | hd
00000000 61 62 63 0a |abc.|
So the obvious "assign the output of a subshell to a variable" mangles
the data.
You'd think with bash syntax you could go:
sed <file.txt >|file.txt blah-blah-blah
And it would delete the old file before opening the new one like vi and
friends do (and the order of operations would open the old file before
writing the new one). But alas, that's not what >| does, it seems to be
a hack to work around a new "set -o noclobber" option that breaks stuff
and regularly needs an override to disable it.
If you're not bothered about memory efficiency, you could presumably do:
sponge() { X=$(base64); base64 -d <<<"$X" > $1;}
I tried to do > ${1:-&1} but bash created a file called "&1". I suppose
I could use /dev/stdin. And yes, maybe I should delete $1 before
recreating it, but then I'm not entirely sure what sponge is DEFINED to
do there. Does it break hardlinks? Will it write to a /dev node?
(Sigh, I should cc: this back to coreutils but... I do not have the spoons.)
Rob
_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net