[HN Gopher] Atuin replaces your existing shell history with a SQ...
       ___________________________________________________________________
        
       Atuin replaces your existing shell history with a SQLite database
        
       Author : thunderbong
       Score  : 441 points
       Date   : 2023-05-06 08:50 UTC (14 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | whitepaint wrote:
       | How can I import my previous history into atuin?
        
         | ellieh wrote:
         | You can use "atuin import"
         | 
         | The docs need updating as we support far more data sources now!
         | 
         | https://atuin.sh/docs/commands/import
        
       | Dowwie wrote:
       | I found atuin introduced friction where there wasn't any before,
       | so I stopped using it and reverted to ripgrepping zsh_history.
        
         | conradludgate wrote:
         | Do you remember what that friction point was?
        
           | jyxent wrote:
           | I'm not the parent commenter, but the friction point for me
           | is the slowness when typing the first few characters in an
           | interactive search (I have a large history). I think the
           | searches are synchronous with each keystroke, right? It would
           | feel a lot faster if each keystroke could cancel an in
           | progress search instead of waiting for it to finish.
           | 
           | In fzf, there is no noticeable lag when typing.
        
       | netherwolfe wrote:
       | I want this logo on a sticker.
        
         | conradludgate wrote:
         | We do have some stickers available!
         | https://notionforms.io/forms/user-stickers
        
       | zomglings wrote:
       | First of all, great name.
       | 
       | Second, I am in awe of how good your documentation is and how
       | well you communicate about atuin to the world at large.
       | 
       | Does Atuin offer any features to toggle the capture of commands
       | into its DB? Being able to opt-in or opt-out of Atuin history on
       | a per-command basis would be pretty useful, especially because
       | there is also the atuin sync feature.
       | 
       | I usually work with sensitive information inside a tmux session
       | because, in the default bash configuration, most commands run in
       | tmux never make it into bash history (I believe the last pane to
       | exit is the only one that does make it). It seems I would have to
       | manually go in and drop rows from the DB if I set up Atuin.
       | 
       | One of my products, bugout, has a command called "bugout trap".
       | Not trying to push bugout here, but thought Atuin might benefit
       | from some of the lessons we learned:
       | 
       | 1. Because bugout trap is opt-in (you have to explicitly prefix
       | your command with "bugout trap --", it also allows users to
       | specify tags to make classifying commands easy. This is really
       | useful for search - e.g. you can use queries like "!#exit:0 #db
       | #migration #prod" to find all unsuccessful database migrations
       | you attempted in your production environment.
       | 
       | 2. bugout trap has a --env flag which gives users the option of
       | pushing their environment variables into their history. This is
       | really useful for programs that use a lot of environment
       | variables. The safest way to use this is to first trap commands
       | into your personal knowledge base with --env, then remove or
       | redact any sensitive information, and only then share (in case
       | you want to share with a team).
       | 
       | 3. We thought that sharing would be useful for teams to build
       | documentation on top of. Even we ourselves have very little
       | adoption of that use case internally. We use it to keep a record
       | of programs we run in our production environment (especially
       | database migrations).
       | 
       | 4. bugout trap also stores data that a program returns from
       | stdout and stderr - this has been INCREDIBLY useful. I do want to
       | add a mode that makes the capture of output optional, though, as
       | currently bugout trap is unusable with things like server start
       | commands which run continuously.
       | 
       | 5. In general, I have found that command line history is very
       | personal and private for developers so collaborative features are
       | going to rightly be seen with skepticism.
       | 
       | Hope that helps anyone building similar tools.
       | $ bugout trap --help         Wraps a command, waits for it to
       | complete, and then adds the result to a Bugout journal.
       | Specify the wrapped command using "--" followed by the command:
       | bugout trap [flags] -- <command>              Usage:
       | bugout trap [flags]              Flags:         -e, --env
       | Set this flag to dump the values of your current environment
       | variables         -h, --help             help for trap
       | -j, --journal string   ID of journal             --tags strings
       | Tags to apply to the new entry (as a comma-separated list of
       | strings)         -T, --title string     Title of new entry
       | -t, --token string     Bugout access token to use for the request
        
       | arthurcolle wrote:
       | But at what cost?
        
         | shawabawa3 wrote:
         | It's FOSS, with optional free service to host your history
         | (encrypted with local key), I think there's a paid option above
         | a free tier
         | 
         | You can also host your own backend
        
           | conradludgate wrote:
           | There's currently no paid option. Obviously one should assume
           | such a free service can't be sustainable so you'd be correct
           | to think we should have one.
           | 
           | Currently we rely on Github sponsors as well as our own
           | additional funding
        
             | justinclift wrote:
             | With the server, is it primarily a gateway to the hosted
             | SQLite databases?
             | 
             | eg receives incoming shell history to store in the backend,
             | and maybe do some searches/retrievals of shell history to
             | pass back? eg for shell completion, etc
             | 
             | If that's the case, then I'm wondering if it could work in
             | with online data stores (eg https://api.dbhub.io <-- my
             | project) that do remote SQLite storage, remote querying,
             | etc.
        
               | conradludgate wrote:
               | We currently use postgres. The server is very dumb,
               | verifies user authentication and allows paging through
               | the encrypted entries.
               | 
               | There's a PoC that allows it to work with SQLite too for
               | single user setups - and we are thinking of switching to
               | a distributed object store for our public server since we
               | don't need any relational behaviour.
        
               | justinclift wrote:
               | Interesting. Yeah, we use PostgreSQL as our main data
               | store too. The SQLite databases are just objects that get
               | stored / opened / updated / queried (etc) as their own
               | individual things. :)
               | 
               | One of our developer members mentioned they're learning
               | Rust. I'll point them at your project and see if they
               | want to have a go at trying to integrate stuff.
               | 
               | At the very least, it might result in a Rust based
               | library for our API getting created. :D
        
               | justinclift wrote:
               | > we are thinking of switching to a distributed object
               | store for our public server
               | 
               | As a data point, we're using Minio
               | (https://github.com/minio/minio) for the object store on
               | our backend. It's been very reliable, though we're not at
               | a point where we're pushing things very hard. :)
        
         | klibertp wrote:
         | What kind of cost? Obviously, backups on the author's server
         | are _not_ something I 'd ever do, but the "offline only mode"
         | is there, apparently.
         | 
         | TBH I was thinking about doing this for a while now. History of
         | my shell, which now is 3.8MB in size, is one of my competitive
         | advantages as a developer (and a very nice thing to have as a
         | power user). It accumulated steadily since ~2005, and with fzf
         | searching the history is much faster than having to google, as
         | long as I did what I want to do now even once in the distant
         | past. I even wrote a utility to merge history files across
         | multiple hosts[1], so I don't have to think "where did I last
         | use that command", as I have everything on every host. The
         | problem with this, however, is shell startup time. It started
         | being noticeable a few years ago and is slowly getting
         | irritating. The idea of converting the histfile into sqlite db
         | crossed my mind more than once due to this.
         | 
         | [1] https://github.com/piotrklibert/zsh-merge-hist
        
           | conradludgate wrote:
           | One such cost could be database size. I currently have 45k
           | history entries in my database and it sits at roughly 15MB in
           | size due to database indices along with the additional data
           | we store
        
             | klibertp wrote:
             | But it's a cost shared by all open shells, right? Well,
             | even if it was 15MB per shell session, it should still be
             | worth it if the startup and searching is faster.
             | 
             | For comparison: I use extended ZSH history format, which
             | records a timestamp and duration of the call (and nothing
             | else), and I have ~65k entries there, with history file
             | size, as mentioned, 3.8MB. It could be an order of
             | magnitude larger and I still wouldn't care, as long as it
             | loads faster than it takes ZSH to parse its history file.
        
               | conradludgate wrote:
               | Yes, this is 15MB on disk size for your whole machine. We
               | agree that the trade off is worth it for the utility and
               | speed improvements
        
         | cmm wrote:
         | there's this little gotcha you might want to be aware of:
         | https://github.com/ellie/atuin/issues/752#issuecomment-14518...
        
           | justinclift wrote:
           | It sounds serious, but there's not much info in that issue of
           | what's going wrong, why it's going wrong, etc. (?)
        
             | cmm wrote:
             | it's not serious for most people I guess, but if you rely
             | on bash's HISTIGNORE and don't disable bash's built-in
             | history mechanism when you adopt Atuin, then this is as
             | serious as you are paranoid
        
               | cmm wrote:
               | er, s/HISTIGNORE/HISTCONTROL/ above
        
       | mrAssHat wrote:
       | No one ever addresses the most important problem: how to separate
       | commands that one would like to retain (preferably indefinitely)
       | vs garbage commands (like cd, ls, cat, etc.) that should better
       | be wiped in a few days.
        
         | conradludgate wrote:
         | During search, we do remove duplicates. It's not a bad idea
         | though and I'll see how we can support it
        
           | mathfailure wrote:
           | This is also sub-optimal, as it causes another problem: some
           | of the commands are part of a bigger sequence (the most
           | import property here is that items inside sequences are
           | ordered, the order of commands matters!), so by blindly
           | deleting duplicates - you break sequences.
           | 
           | In SQL there are sessions and transactions. In shell history
           | - we don't have such entities and this sucks. One could
           | configure their bash/zsh to save history into separate files,
           | but you can't teach them later to source them properly
           | (retaining session awareness).
        
             | conradludgate wrote:
             | Oh, we don't actually delete anything - just deduplicate
             | for search.
             | 
             | Sequential context is something we're building very soon.
             | The idea: you search for "cd /project/dir", press TAB and
             | it opens up a new pane in the tui. This will show the
             | command +/- 10 commands. You can then navigate back in
             | time.
             | 
             | This could indeed be useful for managing that one setup
             | command you always have to run in this project dir but
             | never remember the name of
        
               | mathfailure wrote:
               | > Oh, we don't actually delete anything - just
               | deduplicate for search.
               | 
               | Good to hear, but the point stands: so you deduplicate
               | only for the view, not in the source, and thus the source
               | remains contaminated with duplicates (at very least they
               | cost some disk space and increase seek time).
               | 
               | As for the view: so, since you deduplicate the commands -
               | you can't lookup the context (commands executed before &
               | after)! Because each time the now deduplicated command
               | was executed in the past - it had its own context!
        
               | getpost wrote:
               | As the sqlite schema below indicates, each command has a
               | unique id and a timestamp. Whether you want duplicates
               | removed depends on what you want to know. It might be
               | nice for the UI to expose a time context, which would
               | retain duplicates. (Maybe it does! By coincidence, I just
               | installed this yesterday, and I hardly know anything.)
               | 
               | CREATE TABLE history ( id text primary key, timestamp
               | integer not null, duration integer not null, exit integer
               | not null, command text not null, cwd text not null,
               | session text not null, hostname text not null, deleted_at
               | integer,
               | 
               | unique(timestamp, cwd, command) ); CREATE INDEX
               | idx_history_timestamp on history(timestamp); CREATE INDEX
               | idx_history_command on history(command); CREATE INDEX
               | idx_history_command_timestamp on history( command,
               | timestamp );
        
         | williamvds wrote:
         | With bash's HISTIGNORE, I can consciously prefix my command
         | with a space to prevent it being added to history.
         | 
         | ls I usually don't care about, but there are directories I
         | regularly cd to, so it would be nice to have those in history.
         | 
         | I can think of a neat heuristic, which is that I often cd to an
         | absolute or home directory, so if the path starts with / or ~
         | I'll possibly want to cd there again in the future. Changing to
         | a relative path on the other hand, I tend to do more rarely and
         | while doing more ephemeral work.
        
           | alecco wrote:
           | * HISTCONTROL=ignoreboth
           | 
           | * prefix with space the commands you don't want to keep
           | 
           | * edit your existing .bash_history by prefixing all commands
           | with space (then reload with history -r)
           | 
           | * after session exit or on next login, edit the new commands
           | at the end (vi ~/.bash_history && history -r)
           | 
           | * use comments on the commands to make it easy to search (use
           | keywords)
           | 
           | * group command lines by category (e.g. package manager, git,
           | ssh, backup, find, dev)
        
           | mathfailure wrote:
           | 1. I don't always know beforehand if the command I am about
           | to execute is garbage I'd like not to save.
           | 
           | 2. I just don't want to be conscious about that every time I
           | write a command. I'd rather edit history after I've finished
           | some work. But that's just too tedious to do manually, I'd
           | like to have some pre-configured heuristics applied
           | automatically, like "never save cd/ls to history", but
           | provide a way to overrule that rule in rare situations.
           | 
           | 3. Absolute/partial/symlinked paths - are another separate
           | problem :'(
        
         | whartung wrote:
         | While that's certainly useful to cull trivial commands, it can
         | also behoove the user to remove commands done wrong.
         | 
         | Coming back several months later to be gifted with several,
         | very similar commands of which only one is right can be
         | frustrating. The history records the failed tries as well as
         | the successes.
         | 
         | Mind, the errors give a place to start, but if it's far enough
         | removed from the original event it may well be ambiguous enough
         | to send you to a search engine anyway, especially if you have
         | the memory of a goldfish like I do.
        
           | jefftk wrote:
           | _> Coming back several months later to be gifted with
           | several, very similar commands of which only one is right can
           | be frustrating. The history records the failed tries as well
           | as the successes._
           | 
           | The correct command is almost always the last one, so as long
           | as your search results are chronological this shouldn't be an
           | issue?
        
         | jefftk wrote:
         | Why put effort into removing them? They use a trivial amount of
         | disk space.
        
           | lelanthran wrote:
           | To improve the signal to noise ratio.
           | 
           | Maybe 3 in every 1k of my command lines is noise. Finding
           | anything useful in there takes effort, so I rarely use
           | anything older than a few days.
        
           | mathfailure wrote:
           | Disk space is the least of the problems garbage entries in
           | command history cause.
           | 
           | It's not just commands that are actual for the current
           | session (like ls/cd/cat), it's also incorrect commands or
           | just commands not worth retaining still being saved among
           | with the useful commands.
           | 
           | The most precious is user's time. And when you fzf part of
           | the command with the regularly saved history and would like
           | to re-execute something important - you'll first get a long
           | list that you'll first have to filter to find the command you
           | were seeking.
           | 
           | So to counter your question with another: why store garbage?
        
             | jefftk wrote:
             | A typical command I run is never going to be something I
             | look up again, so I would prefer to optimize for writing
             | instead of reading. Dumping every command to a file adds no
             | friction to my regular work, while attempting to categorize
             | garbage commands would add a lot of friction.
             | 
             | Also, when I do want to reference my deep history I often
             | find that seeing the full list of what I was doing is
             | helpful at getting myself back into the frame of mind I was
             | in when I ran the commands originally, which can be more
             | valuable than seeing exactly which commands I ran.
        
               | mathfailure wrote:
               | > A typical command I run is never going to be something
               | I look up again, so I would prefer to optimize for
               | writing instead of reading. Dumping every command to a
               | file adds no friction to my regular work
               | 
               | Then why write history at all? Just discard it.
        
               | jefftk wrote:
               | Because even with the friction of my history not having
               | been pruned or otherwise tidied it's still a really
               | valuable resource when I do need it!
        
       | jamesgill wrote:
       | I like it, if for no other reason than the Terry Pratchett
       | reference.
        
       | tonymet wrote:
       | Great idea I'd like to see more full text indexing of the home
       | directory. Shell commands, configs, code files all deserve to be
       | indexed.
       | 
       | Compared to Windows & MacOS - lack of cli and gui full text
       | indexing is a real setback for linux/unix
       | 
       | apropos , locatedb and this are solid domain-specific attempts.
       | Hopefully this expands to indexing a lot more content.
        
       | submeta wrote:
       | Are there ways to migrate existing shell histories with
       | timestamps into atuin?
        
         | shawabawa3 wrote:
         | yep they have docs on importing
         | https://atuin.sh/docs/commands/import
        
           | ellieh wrote:
           | Yep! We support a whole bunch more too (fish, resh, zsh-
           | histdb, etc), need to update the docs
        
             | klibertp wrote:
             | https://github.com/ellie/atuin/blob/main/atuin-
             | client/src/im...
             | 
             | > // we can skip past things like invalid utf8
             | 
             | No, you can't! Thanks to some bizarre escaping that happens
             | when ZSH (and BASH, I think) dumps commands to the history
             | file, any command with non-latin1 characters will break
             | here and won't be read, moreover - silently! The other
             | possibility is that you'll import wrong characters.
             | 
             | Grep the ZSH source for "unmetafy", you'll see; I have it
             | extracted here: https://github.com/piotrklibert/zsh-merge-
             | hist/blob/master/u...
        
       | inconceivable wrote:
       | cool tool. i think improvement in this area for non-shell-
       | specific solutions is always good.
       | 
       | one thing i haven't seen yet (correct me if i'm wrong...) is an
       | easy way to get all this stuff to magically appear on a new
       | machine you've ssh'd into for the first time. i've hacked up my
       | own in the past but that's got issues with tunneling and multi-
       | hops. anyone know a solution to this? maybe a feature request?
        
         | ellieh wrote:
         | Not 100% sure how that could work, but definitely very
         | interested in making it happen! I don't think there's an issue
         | for it yet, so feel free to open
        
       | vrglvrglvrgl wrote:
       | [dead]
        
       | submeta wrote:
       | Is there a way to highlight matches? Also, does someone know how
       | to change the date format to full? Instead of ,,5 days ago".
       | Finally, an observation: I cannot use my Emacs keybindings to
       | kill the line or a word (backwards), when I am in search.
        
       | adg33 wrote:
       | I'm interested in this - I've just installed.
       | 
       | Is there a way to import all my existing history from
       | `.zsh_history`? It's a real pain to have to start from scratch.
        
         | pmarreck wrote:
         | I'm trying to compare this to mcfly, which does that, and also
         | uses a sqlite db
         | 
         | https://github.com/cantino/mcfly
        
         | pmarreck wrote:
         | apparently it's `atuin import`
        
       | pmarreck wrote:
       | How does this compare to McFly?
       | 
       | https://github.com/cantino/mcfly
        
         | datadeft wrote:
         | I see two major differences:
         | 
         | - how active the development is[1]
         | 
         | - having a distributed option (McFly does not have one)
         | 
         | 1. Seeking co-maintainers: I don't have much time to maintain
         | this project these days. If someone would like to jump in and
         | become a co-maintainer, it would be appreciated!
        
       | scotty79 wrote:
       | At this point databases and filesystems should just merge to
       | offer complete functionality as a standard.
        
         | bradleybuda wrote:
         | https://en.wikipedia.org/wiki/WinFS
        
           | scotty79 wrote:
           | Probably came too early.
        
       | sureglymop wrote:
       | The problem I see is that if I ssh into 5 different remote hosts
       | in a day, most of the commands are not executed on my host and
       | thus not part of the local (or shared, distributed) history.
       | 
       | I suppose this could be solved with either:
       | 
       | - Some kind of modified ssh that sends back the commands to my
       | host
       | 
       | - Some kind of smart terminal that can analyze commands to build
       | up the history
       | 
       | Any ideas on how to practically solve this problem?
        
         | mrelectric wrote:
         | Every terminal has text input, but keylogger might be the
         | simplest solution.
        
           | kevin_thibedeau wrote:
           | A keylogger doesn't see the results of tab completion.
        
         | shawabawa3 wrote:
         | You could install atuin on all your remote hosts, but that's
         | not always practical
        
           | doubled112 wrote:
           | I guess we need a PostgreSQL backend.
        
       | tus666 wrote:
       | > English | Jian Ti Zhong Wen
       | 
       | > You may use either the server I host
       | 
       | Right. And isn't this what home dirs are for?
        
         | ellieh wrote:
         | Yeah you could totally sync your shell history if you're using
         | a NFS share or something, but that's going to affect way more
         | than just your .bash_history
         | 
         | Why is our localisation relevant/quoted?
        
           | shawabawa3 wrote:
           | I think the implication is that you're controlled by the
           | Chinese government because your software was translated to
           | Chinese?
        
             | conradludgate wrote:
             | Well, all the client side code is open source and
             | compilable, and all history is fully encrypted before being
             | uploaded.
             | 
             | So even if we were being controlled, you still can be
             | confident that we can't do anything with your data - all we
             | can see is how active you are, that is until someone finds
             | a way to quickly break xsalsa20poly1305.
        
       | amadeuspagel wrote:
       | I think _Magical shell history_ is a better title.
        
         | WJW wrote:
         | While sqlite is pretty cool technology, it doesn't quite
         | deserve the title of "magic".
        
           | ChrisMarshallNY wrote:
           | The joke was because of the Terry Pratchett reference.
           | 
           | https://discworld.fandom.com/wiki/Great_A%27Tuin
        
             | vidarh wrote:
             | It took me way too long to realise that's where the name
             | was from...
        
       | ThouYS wrote:
       | either I'm getting old, or there is a lot of energy being spent
       | on quasi-useless "improvements" these days
        
         | grammarxcore wrote:
         | Have you considered that you might not be the target audience?
         | Atuin's ability to sync across computers while being able to
         | separate the context the command was used in has been
         | incredibly useful to my team.
        
         | makeitdouble wrote:
         | On the getting old part, there's definitely a point where
         | someone has enough bagage thay most additional tools are
         | solving a problem they already worked around or solved a
         | different way. For someone new to the field, this tool is on
         | the same footing as the rest and could fit them better.
         | 
         | As an aside, the part I like the most about our field is the
         | ability for a single or two devs to build themselves the tools
         | they exactly need, and potentially share it to the community
         | with low friction.
        
         | conradludgate wrote:
         | It's always fair to be critical of these things. However the
         | energy we spend on this is our concern.
         | 
         | At the end of the day, Ellie and I work on this because these
         | features actually improve our workflows. The directory search
         | feature is probably my favourite, and the sync feature is the
         | key feature Ellie wanted to begin with.
        
         | datadeft wrote:
         | > being spent on quasi-useless "improvements"
         | 
         | i am not a new kid on the block either but I was looking for
         | such a tool for a very long time. I think distributed shell
         | history across all of my servers is a big win.
        
         | alehlopeh wrote:
         | You must be getting old because you're unable to see the irony
         | in spending the time and energy to make a comment decrying the
         | quasi-usefulness of how others choose to spend their energy.
        
       | IshKebab wrote:
       | There's also McFly which does the same thing.
       | 
       | https://github.com/cantino/mcfly
       | 
       | I've only used McFly and found it to be pretty great. My only
       | complaint is the default search mode is SQL strings, so you have
       | to use `%` for wildcards. I wish it was a more forgiving, less
       | exact search.
       | 
       | Has anyone used both and could compare them?
        
       | agumonkey wrote:
       | I always wondered if one could feed history into some abstract
       | parser (or nowadays, maybe a LLM) to extract the most frequent
       | "idioms":                   ls <dir> | grep <pat> | less
       | 
       | vs                   ls ~ | grep .bak | less         ls .config |
       | grep *rc | less
       | 
       | you get the idea
        
       | trurl wrote:
       | Excellent! I had been thinking of building something along the
       | same lines when I switched from `zsh` to `fish`, as I had been
       | missing `zsh_stats`. Now I don't have to and can focus on my
       | other side project!
        
       | bayesianbot wrote:
       | I made a script that uses atuin to get previous commands related
       | to your current command line - latest commands ran in the same
       | session, in the same directory, in other sessions, latest
       | commands for the same executable etc. then feeds it into GPT and
       | streams the replies to fzf so you can choose the best
       | autocompletion (or it can fix problems in the line you've written
       | already as well). On Wezterm and Kitty it can also get the
       | terminal screen contents error messages and so. Because of the
       | streaming reply the first autocomplete line is ready quite soon
       | after the keyboard shortcut is pressed.
       | 
       | Have been putting off pushing it to Github, think I'm gonna do
       | that today.
        
         | bayesianbot wrote:
         | Well it's published. Wasn't ready to publish and didn't have
         | time to clean it up but I'll get back to it in the coming days,
         | there's also some extra features on the way but disabled
         | currently. Works quite well for me though.
         | 
         | https://github.com/TIAcode/LLMShellAutoComplete
         | 
         | Forgot to add needs tiktoken, openai and fzf. If someone knows
         | how to do that command line query and replace on other than
         | fish/nushell, please let me know.
        
         | chefandy wrote:
         | Does it incorporate the return code of the commands to get an
         | approximate good/bad rating? I wonder what percentage of the
         | CLI mistakes I make return zero anyway because it's a valid
         | command that I simply misused.
        
           | bayesianbot wrote:
           | It doesn't, I think it should but not sure how to add it to
           | the prompt yet - I have a feeling that if I'll just add them
           | after or before the command line, GPT will at least
           | occasionally add hallucinated return codes to the
           | autocompletion. Maybe I'll just add the unsuccessful codes or
           | something, but it needs some testing.
        
             | chefandy wrote:
             | Cool. Neat tool idea.
        
           | codetrotter wrote:
           | For me one of the most common issues is when I write a regex
           | but I have some of the escapes the wrong way around etc. So
           | I'm giving a valid regex, but it's not matching what I tried
           | to match. And then I have to change it around a couple of
           | times before it works.
           | 
           | One reason for this is that different programs have different
           | rules for what should be escaped when, when you write a
           | regex. For example, I think grep is a bit different from vim
           | in this regard
        
             | chefandy wrote:
             | Hm... Now that I think about it, regex tools on the command
             | line haven't been a goto recently. I used sed, awk, perl
             | -e, et. al. constantly from the late 90s until maybe 2015
             | but since then I'm more likely to pop open a ipython repl
             | or whatever and avoid those weird inconsistencies
             | altogether. Also, developing on the old scp->LAMP stack
             | setup required more shell script glue than the more
             | automated contemporary setups I've been using.
             | 
             | I'd probably suck at it. No matter how frequently I use
             | regex in :ex commands, I always screw up the escapes,
             | substitutions, etc.
        
         | miller_joe wrote:
         | I've been using atuin for a while and have been thinking about
         | something like this. Please do post to GitHub!
        
         | alfons_foobar wrote:
         | Isn't that like... ultra slow?
        
           | bayesianbot wrote:
           | It's usually ~two seconds or so for the first line to come
           | out of OpenAI. You can see the example video in the github,
           | though I think that was little slow.
           | 
           | If you have big atuin file though, creating indexes for
           | session and cwd are good ideas so we can get the request out
           | quickly..
           | 
           | edit: but much faster than searching or asking LLM for
           | command line parameters instead
        
           | killthebuddha wrote:
           | Copilot is highly usable and I'm pretty sure it works the
           | same way.
        
         | mkurz wrote:
         | Please link, thanks!
        
         | samstave wrote:
         | > _"...then feeds it into GPT... "_
         | 
         | explain this please
        
           | bayesianbot wrote:
           | It feeds the information from atuin database as a prompt for
           | OpenAI, like: "Latest calls for the same
           | executable:\ncmd1\ncmd2" (I should work on my prompts,
           | doesn't actually look that optimal, oh well). Then at the end
           | gives the current command line and asks for few options how
           | to finish / replace the line, with some extra requests for
           | GPT (like don't write anything else except the command line
           | etc).
        
         | conradludgate wrote:
         | That sounds awesome! We've been meaning to set up a "community
         | showcase" section. I'd love to feature this! If you ever
         | publish it, post a discussion!
        
           | bayesianbot wrote:
           | Thanks! I'll do that after I've had more time to finish some
           | features and clean the code up in few days. But I've released
           | a crude version at
           | https://github.com/TIAcode/LLMShellAutoComplete
        
         | literalAardvark wrote:
         | That sounds awesome, if somewhat overengineered.
         | 
         | Though the idea of mistakenly putting credentials in the cli
         | and it ending up in GPT is bothering me a bit.
        
           | doubled112 wrote:
           | Probably paranoia, but I'd be uncomfortable feeding it a
           | bunch of domain and server names, along with any other more
           | interesting params that might sneak in.
        
       | ranting-moth wrote:
       | This is the feature I've been looking for:
       | 
       | "log exit code, cwd, hostname, session, command duration, etc"
        
         | conradludgate wrote:
         | There's a PR opened (that I still need to review...) that adds
         | even more fields such as shell type and opt-in environment
         | variables to this list.
         | 
         | One day, you could search for that AWS cli command run
         | specifically on AWS_ACCOUNT_ID=foo
        
         | okasaki wrote:
         | you can mostly do that in bash:                   export
         | PROMPT_COMMAND='if [ "$(id -u)" -ne 0 ]; then echo "$(date
         | "+%Y-%m-%d.%H:%M:%S") $(pwd) $(history 1)" >>
         | ~/stuff/logs/bash-history-$(date "+%Y-%m-%d").log; fi'
         | 
         | makes files like                   stuff/logs/bash-
         | history-2023-05-06.log
         | 
         | that contain                   2023-05-06.11:42:38 /home/dv
         | 3737  2023-05-06 11:42:38 cat .bashrc
         | 
         | then you can make some commands to grep through this
        
           | brasic wrote:
           | Or use the excellent bash-preexec plugin that atuin itself
           | relies on to achieve this in a cleaner way:
           | https://github.com/rcaloras/bash-preexec
        
         | pletnes wrote:
         | Xonsh has this. It's super cool after using it for a while.
        
       | notresidenter wrote:
       | I stopped using Atuin because you need one additional click to go
       | up the history, and the configuration didn't provide an easy way
       | to change that behavior.
       | 
       | Edit: apparently, they made it possible to disable that behavior
       | and the documentation is much better
        
         | shawabawa3 wrote:
         | I use atuin to replace cmd+r history but not up arrow history,
         | wasn't hard at all to configure
        
       | electromech wrote:
       | It sounds like it might not work as well for bash.
       | https://github.com/ellie/atuin/issues/909
        
       | outcoldman wrote:
       | I have been using sqlite database since 2017 [1], has over
       | 100,000 items in the database at this point. The database is
       | almost 0.5GB, but I also use Full-Text-Search capabilities of
       | sqlite. 2 years ago I have built a mac application [2], that
       | syncs items via iCloud, and it only works on the macOS.
       | 
       | I would highly recommend anyone who spend a lot of time in
       | terminal to improve their shell history by using atuin or similar
       | tools, cannot tell how many times it actually helped me to find
       | some important information there, about how I did one thing or
       | another.
       | 
       | -
       | 
       | - [1] https://www.outcoldman.com/en/archive/2017/07/19/dbhist/
       | 
       | - [2] https://loshadki.app/shellhistory/
        
         | jefftk wrote:
         | At 0.5GB that's 5k per entry -- what are you storing for each?
         | 
         | For comparison, my (non-work) history since 2012 (plain text)
         | is 181k entries, and takes 25MB. I store the command along with
         | when and where you ran it. (https://www.jefftk.com/p/logging-
         | shell-history-in-zsh)
        
           | tomxor wrote:
           | Not defending the idea of a db history but no db schema is
           | going to beat plain text's 1 byte 0x0A per line delimiter.
        
             | justinclift wrote:
             | *cough* compressed row data *cough*
        
               | tomxor wrote:
               | *cough* log rotate and gzip *cough* :D
        
           | akkartik wrote:
           | Ah, a fellow packrat! I have every command I ever typed into
           | a shell since around 2005, and my history weighs in at 1 CD
           | or 650MB (as of a couple of years ago)
           | 
           | I'm probably being wasteful of space because I store each
           | session in a separate file. I used to do a lot of data
           | analysis at the shell back in the day, and found it useful to
           | audit sequences of commands afterwards for mistakes, or to
           | turn them into scripts.
        
             | TedDoesntTalk wrote:
             | This is so insane that I love it. Do you also save your
             | belly button lint since 2005? Or nail clippings? :)
        
               | akkartik wrote:
               | I'm only a digital packrat. Bits are so much cheaper to
               | hoard, even deciding to throw something away is often
               | more work.
        
               | enriquto wrote:
               | This is more like saving your old notebooks and drafts,
               | only that they don't take any meaningful space. Or like
               | having a revision control system.
               | 
               | Do you rebase your git repos regularly to delete commits
               | older than 6 months?
        
             | trallnag wrote:
             | Do you regularly back up your history?
        
               | akkartik wrote:
               | Oh yes. It gets backed up along with everything else.
        
           | bastawhiz wrote:
           | Not the op, but I'd guess it's the full text search index.
        
             | jefftk wrote:
             | For 100k entries you can grep them instantaneously; there's
             | no need to maintain an index.
        
               | bastawhiz wrote:
               | Grep only works if you want an exact string match. If you
               | want to find words out of order or support features like
               | stemming, fts is necessary.
        
               | jefftk wrote:
               | With a small enough corpus, full text search does not
               | require an index to be instantaneous, and 100k entries is
               | easily small enough for that.
               | 
               | Additionally, everything you describe can be phrased as a
               | regular expression.
        
               | bastawhiz wrote:
               | Sometimes it's nice to not manually write a regexp to
               | find all of the variants of every word or deal with
               | arbitrary ordering of substrings. And if you're using
               | SQLite and fts5 is installed, why not just create a
               | virtual full text search table with one command and use
               | that? With a small enough corpus, it's a meaningless
               | distinction to bikeshed about the implementation: the
               | easiest solution to build is the best. 500MB of disk
               | space for a pet project that gives you convenience is a
               | terrifically small amount of storage. I have videos that
               | I recorded on my phone that take up more than double
               | that.
        
               | wpietri wrote:
               | Maybe I have some sort of disease, but while reading
               | "find words out of order or support features like
               | stemming" the regexs for that immediately flashed before
               | my eyes, so I think "necessary" is a little strong there.
        
               | jack_squat wrote:
               | FTS is not the same as regex.
        
               | wpietri wrote:
               | I don't think I said it was. I was addressing the
               | specific use cases mentioned. If there's another use case
               | you think is important in searching command line history,
               | feel free to describe it.
        
               | justinclift wrote:
               | > feel free to describe it
               | 
               | Didn't they already? eg stemming
        
               | epr wrote:
               | Most stemming use cases are trivially solved with a
               | regex. That's the point he was making. The difference
               | between a beginner and expert with regexes is quite a
               | lot.
        
         | SoftTalker wrote:
         | Wow so it looks like I'm in the minority in having shell
         | command history disabled? I have a small number of commands
         | (20) that go into the live history of login shells for
         | convenience, but nothing gets saved when I log out.
         | 
         | If there's something I do repeatedly, I make an alias or a
         | function for it.
        
           | maleldil wrote:
           | I think you have an unusual take on this. Why do you disable
           | history?
        
             | SoftTalker wrote:
             | People's history files are a great place to look for
             | passwords and other secrets, mainly. I suppose that risk
             | could be reduced by having the history file encrypted on
             | disk, but I don't know of any shell that does that (can't
             | honestly say I've really looked though).
        
       | IanCal wrote:
       | What's it like with many shells/panes in multiplexers open? I
       | often find my history from one or another either lost or not
       | available across different ones.
        
         | shawabawa3 wrote:
         | Syncs instantly between them
         | 
         | You can optionally filter by the current window session,
         | current machine, or commands across all machines you have atuin
         | installed on
        
         | wodenokoto wrote:
         | I believe it's a setting. You can choose to save history and
         | either merge history on session exit or immediately.
         | 
         | At least it is a setting for zsh
        
           | pletnes wrote:
           | You'd think this would be even more robust with a sqlish
           | storage backend than the usual text files used for history.
        
             | gkbrk wrote:
             | Appending to files should be atomic, so I don't think
             | you'll run into any corruption issues just by appending.
        
         | conradludgate wrote:
         | With atuin, it's available immediately on other local session
         | (panes, windows, tabs etc). There's also remote sync, so after
         | some configurable amount of time, it's even available on other
         | devices.
        
           | IanCal wrote:
           | Spectacular, thanks!
        
           | ellieh wrote:
           | + if you don't like this, you can have it filter by session
           | by default!
        
             | niels_bom wrote:
             | Thank you for this awesome tool!
        
         | brasic wrote:
         | Works great! To me the reliable instant history sync between
         | tmux panes is one of the best features of atuin. I tried many
         | things to get this working with vanilla bash and it always
         | seemed flaky.
        
         | Evidlo wrote:
         | You can get that with bash with this config:
         | # append to .bash_history and reread after each command
         | export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"         #
         | append to .bash_history instead of overwriting         shopt -s
         | histappend
        
           | ptspts wrote:
           | Except that this doesn't save commands which haven't finished
           | yet, and it never saves the current pending command when the
           | shell is killed (e.g. the user closes the terminal window or
           | logs out or the SSH connection is broken).
           | 
           | Sometimes the rare, long-running commands are the most
           | valuable.
           | 
           | If I set up history software, it should preserve _all_
           | history, and as early as possible.
        
       | v3ss0n wrote:
       | This one is much more simple and to the point , without needing
       | sqlite. https://github.com/curusarn/resh
        
       | user- wrote:
       | People may be interested in RESH, I use it and love it.
       | 
       | https://github.com/curusarn/resh
        
       | jbellis wrote:
       | For people who have tried this, how good is the latency from when
       | I press ctrl-r [first letter] to when I start seeing results? If
       | it's not instant it's just going to frustrate me.
        
         | quaintdev wrote:
         | Maybe ctrl+r stress uses history command.
        
         | conradludgate wrote:
         | I notice 0 latency (except when using the opt-in skim feature -
         | we haven't properly optimised that yet). Latency is very
         | important for us too. Granted, if you don't use an SSD, then
         | you might encounter some startup lag
        
       | chmaynard wrote:
       | I decided to implement this using bash. I have a working
       | prototype running on one machine. If anyone wants to help me
       | refine it, let me know and I'll post what I've done on GitHub.
        
       | oftenwrong wrote:
       | I have been using this, which is similar, for a few years:
       | 
       | https://github.com/larkery/zsh-histdb
        
       | didip wrote:
       | I always wondered why Linux devs didn't embrace SQLite wholesale
       | for every single tools. Except maybe the kernel because I don't
       | know anything about the kernel.
        
       | kazinator wrote:
       | > _Atuin replaces your existing shell history with a SQLite
       | database_
       | 
       | How can that work. Nobody is going to pay any ransom for just a
       | shell history, and there are ways to get it out of a SQLite
       | database. Wouldn't it be simpler just to encrypt the original
       | .bash_history?
        
         | atoav wrote:
         | I think the advantage of the sqlite database is that you retain
         | more context for any given command (e.g. what the current
         | working directory was, ...) in a structured way (it _is_ a
         | database after all).
         | 
         | That stored context can then be used to query the database
         | (e.g. filter the history to only show commands that were
         | executed in the cwd).
         | 
         | These queries are the point of using sqlite, not anything
         | security as far as I can tell.
        
           | kazinator wrote:
           | I just don't see how sqlite is up to this; the problem
           | clearly requires PostgreSQL.
        
       | cjbprime wrote:
       | Since we're setting up a database, has anyone seen a project to
       | store stdout/stderr in tables too?
       | 
       | Seems more useful in the GPT age, when it could provide an
       | opportunity for conversations about the whole task you worked on.
       | (As well as finding commands based on their output.)
        
       | [deleted]
        
       | iib wrote:
       | Has anybody seen any huge performance regressions using atuin?
       | 
       | I installed it and simple commands take noticeably longer. Is
       | there any way to make it faster?
        
         | conradludgate wrote:
         | We've heard some users using hard drives or networked FS and
         | having performance issues. sqlite relies on mmap and random
         | access of pages, which can suffer on higher latency drives
        
       | maleldil wrote:
       | It looks like it's not possible to export the history to a format
       | the shell can import[0], so if I wanted to try this out, my
       | commands would be locked there.
       | 
       | It looks interesting, so if I'm overlooking a way to do this with
       | fish, I'd experiment with it.
       | 
       | [0]: https://github.com/ellie/atuin/issues/816
        
         | jamespwilliams wrote:
         | It'd be pretty trivial to do this yourself though, shell
         | history files are very simple
        
         | codetrotter wrote:
         | If you just want to experiement with it for say a couple of
         | weeks, does it really matter that the commands from those few
         | weeks disappear if you decide not to continue using it?
         | 
         | Presumably you already have a long history of commands from
         | past years in the original format. And if your command line
         | usage is similar to mine, then most of the commands you will
         | use in the future will be covered by your existing history.
         | 
         | So if a few weeks of experimenting with atuin ends with you
         | deciding not to use atuin, then probably you will be fine going
         | back to the old history files that do not include those weeks
         | of activity.
        
         | ellieh wrote:
         | We'd like to be able to also export history, but atuin doesn't
         | actually stop your old shell history from functioning either
         | 
         | So you could uninstall it, and you won't have lost a thing
        
           | maleldil wrote:
           | Sounds good, thank you! I'll start playing with it.
        
         | getpost wrote:
         | You can use sqlite[0] to export the database, or if you want a
         | ui, use datasette[1]. On my mac, the database is stored at
         | ~/.local/share/atuin/history.db
         | 
         | [0] https://sqlite.org/cli.html#export_to_csv [1]
         | https://docs.datasette.io/en/stable/csv_export.html
        
       ___________________________________________________________________
       (page generated 2023-05-06 23:00 UTC)