Hacker News new | ask | show | jobs
by monkellipse 952 days ago
Great idea! Also terrifying :) Given how often I accidentally commit the wrong text in vscode, I shudder to think of the damage I could do with this on my shell, hah! What safety measures are there/could there be?
3 comments

I don't know how painful it would be, but I think I could adapt to a short delay of maybe 50-100ms where the shell won't respond to Return presses, only after accepting a completion. Just long enough ideally to make me re-read what I entered.
A simple approach might be that if the resulting exit code is not 0 it won't be used to complete in the future.
That'd have the problem of tools like grep returning nothing, having an exit code of 1, but being a perfectly valid thing to suggest in the future.
When you're writing, building, and executing code, I would not expect a 0 exit code every time.
The fish approach
Generally, a destructive shell command prompts for approval. But I suppose overfumbly fingers could still cause grief.

Type/command aware tooling is a night and day difference.

Generally? Do you have examples in mind? The ones I think of are destroy first and ask questions only if told to do so: mv cp rm redirection tee
Yeah, you’re right. I was thinking of overly destructive commands eg. reformat etc.
I feel like I've trashed millions of files I shouldn't have with `rm` and trying to be clever with regular expressions.
Note: Normal shells use glob(7) expressions, not regular expressions.
You know I googled this immediately after I posted it, and you're absolutely right, but a good chunk of the syntax still kind of looks like regular expressions so I don't think I was too far off!
Regular expressions and glob(7) expressions look superficially similar, but it is mostly an illusion; they both use * and ? as common metacharacters, but both of those characters mean different things in the two systems. Only the [ and ] characters are used more similarly, but even those have their differences. The two syntaxes only have one common function which functions identically in the two systems, but it is invoked by different characters; specifically the ? (question mark) character in glob(7) exactly corresponds to the . (full stop) character in regular expressions.
To be pedantic: You're conflating the syntax of regular exprssions, with the (computer science) concept. Glob patterns are a kind of very resticted regular pexressions. Ksh extended the glob syntax so it has the full power of regular expressions in the computer science sense - though without all the extensions of modern regular expressions.
I've done this enough times I use `ls` first, then `rm`
As much as I can, I do a 'mv ... /tmp' instead of 'rm -rf'. It gets the files out of the way, and provides a way out if that's not what I wanted.

'/tmp' will eventually be cleaned by the OS so no (prolonged) space worries.

/tmp is a RAM disk on many systems so be careful with very large files
To add to this, I've been a happy user of the trash-cli for forever. Can recommend.
Yeah, I generally will use `find . -name "<my pattern"` nowadays, just so I can see all the potentially recursive files as well, and then when I'm 100% sure that what I'm doing is good, I will pipe that into xargs or parallel.

My point was that I don't feel like Unix really stops you from doing destructive scary stuff. It seems like it's perfectly happy to let you break your machine.

Exactly, which is why we check for ourselves instead of expecting it to hold our hand.

Unixy tools tend do what you tell them, nothing more and nothing less. No confirmations, no output if successful, no progress bars, etc.

That's a feature in my mind, but I can see how it is easy to have your day ruined if you're expecting it to ask you again.

I mostly agree, but sometimes I wish that `rm` would have default to "confirm before destroying", and add a flag like `-y` to not prompt, more or less like how `apt` works on Ubuntu.
Or just add ‘echo’ in front: echo rm ... . Especially when the command is in a loop of some sort.
I set up hourly borg backups instead. That resulted in me aliasing rm='rm -rf' without a worry in the world. So far, I made about ten recoveries and have never lost important data.
If you never rm’ed work you just did not captured by hourly backups, well, lucky you.
kind of the same deal with spooky SQL queries and verifying your where clause with a select first
At least with SQL you can just consistently wrap stuff in transactions, so if you break something you can always revert.
alias rm='rm -i'