<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bash – Linux und Ich</title>
	<atom:link href="https://linuxundich.de/en/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxundich.de/en</link>
	<description>A German Linux blog, in English</description>
	<lastBuildDate>Fri, 13 Nov 2026 16:57:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Searching Your Bash History: hstr, fzf, Atuin and McFly Compared</title>
		<link>https://linuxundich.de/en/search-bash-history-hstr-fzf-atuin-mcfly/</link>
					<comments>https://linuxundich.de/en/search-bash-history-hstr-fzf-atuin-mcfly/#respond</comments>
		
		<dc:creator><![CDATA[Christoph Langner]]></dc:creator>
		<pubDate>Fri, 13 Nov 2026 16:57:22 +0000</pubDate>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Atuin]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[fzf]]></category>
		<category><![CDATA[hstr]]></category>
		<category><![CDATA[McFly]]></category>
		<category><![CDATA[Terminal]]></category>
		<guid isPermaLink="false">https://linuxundich.de/en/search-bash-history-hstr-fzf-atuin-mcfly/</guid>

					<description><![CDATA[hstr, fzf, Atuin and McFly replace the Ctrl+R search in Bash with a list of matches. What the four can do, what to watch out for with hstr on current kernels, and how Atuin's sync works.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Searching with <code>Ctrl</code>+<code>R</code> shows only one match at a time and leaves you guessing whether the command you want is still to come. Four tools replace it with a list of matches: hstr, fzf, Atuin and McFly. They differ in what they store on top of the command, how they sort, and whether they can sync your history between several machines.</p>



<p class="wp-block-paragraph">I introduced the <a href="https://linuxundich.de/gnu-linux/bash-history-suggest-box/">BASH History Suggest Box</a> (in German), today&#8217;s hstr, in 2014 on the blog and in <a href="https://www.linux-community.de/ausgaben/linuxuser/2014/06/mit-der-bash-history-suggest-box-shell-befehle-schneller-finden/">LinuxUser</a> (in German). Since then, the setup under current kernels has changed, and with Atuin and McFly there are tools that keep a database of their own. In my testing, all four ran under TUXEDO OS; the screenshots show the search for <code>apt</code> in the same demo history.</p>



<h2 class="wp-block-heading">Built-in tools for a start</h2>



<p class="wp-block-paragraph">Bash already ships something: <code>Ctrl</code>+<code>R</code> starts the reverse search, and every further press jumps to the next, older match. That works everywhere, even on a server over SSH. Debian and TUXEDO OS, however, only remember 1,000 commands in memory and 2,000 in <code>~/.bash_history</code>. You can raise the values <code>HISTSIZE</code> and <code>HISTFILESIZE</code> in <code>~/.bashrc</code>.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af7428784aa4&quot;}" data-wp-interactive="core/image" data-wp-key="6af7428784aa4" class="wp-block-image wp-lightbox-container"><img fetchpriority="high" decoding="async" height="720" sizes="(max-width: 781px) 100vw, 680px" srcset="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r-640x360.webp 640w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r-768x432.webp 768w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r-1280x720.webp 1280w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r-1536x864.webp 1536w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r.webp 1760w" width="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-01-bash-strg-r-1280x720.webp" alt="Konsole showing the most recent history commands and below them the classic Bash reverse-i-search, which shows just a single match for apt"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">The built-in search shows only one match: Ctrl+R jumps from entry to entry, there is no list.</figcaption></figure>



<p class="wp-block-paragraph">Two lines in <code>~/.inputrc</code> turn the arrow keys into a prefix search. If you then type <code>git</code> and press <code>Up</code>, the last command that starts with <code>git</code> appears. That is enough for many people. If you search for a word in the middle of a command, such as a server name, you need one of the following tools.</p>



<pre data-lui-lang="conf" data-lui-file="~/.inputrc" class="wp-block-code"><code>&quot;\e[A&quot;: history-search-backward
&quot;\e[B&quot;: history-search-forward</code></pre>



<h2 class="wp-block-heading">hstr: a match list with a delete function</h2>



<p class="wp-block-paragraph">hstr (short for HiSToRy) opens a list of all matches on <code>Ctrl</code>+<code>R</code>. Use <code>Up</code> and <code>Down</code> to choose, <code>Tab</code> copies the entry to the command line for editing, <code>Del</code> removes it from the history. That helps if you ever typed a password instead of a command. <code>Ctrl</code>+<code>F</code> marks favorites, <code>Ctrl</code>+<code>/</code> switches the view and <code>Ctrl</code>+<code>E</code> the search mode, for example to exact matches or regular expressions.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af7428784f0c&quot;}" data-wp-interactive="core/image" data-wp-key="6af7428784f0c" class="wp-block-image wp-lightbox-container"><img decoding="async" height="720" sizes="(max-width: 781px) 100vw, 680px" srcset="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr-640x360.webp 640w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr-768x432.webp 768w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr-1280x720.webp 1280w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr-1536x864.webp 1536w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr.webp 1760w" width="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-02-hstr-1280x720.webp" alt="Konsole with hstr 3.1, the list shows about 25 matches for apt with the search term highlighted in red"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">hstr shows all matches as a list, highlights the search term in color and sorts by rank by default.</figcaption></figure>



<p class="wp-block-paragraph">In Debian, Ubuntu and TUXEDO OS, hstr is in the repositories; on Arch Linux it is in the AUR. The program writes the matching settings into <code>~/.bashrc</code> itself. After that, <code>Ctrl</code>+<code>R</code> opens the list, and Bash syncs the history with the file after every command.</p>



<pre data-lui-lang="bash" class="wp-block-code"><code>sudo apt install hstr
hstr --show-configuration &gt;&gt; ~/.bashrc
source ~/.bashrc</code></pre>



<p class="wp-block-paragraph">Since version 3.0, hstr no longer uses the TIOCSTI system call, which current kernels mostly disable. In return, <code>Enter</code> only copies the command to the command line; a second press runs it. If you run <code>hstr --show-configuration</code> without a terminal, for example over SSH, an error message ends up in the output and thus in your <code>~/.bashrc</code>. Version 3.3 fixes that, while Debian still ships 3.1.</p>



<p class="wp-block-paragraph">On Arch Linux, the build of 3.3 failed at the checksum comparison. The tarball contains the same source code; only the folder name inside the archive differs, because upstream renamed the tag. Deleting the cached file fixes it, after which yay downloads the tarball again.</p>



<pre data-lui-lang="bash" class="wp-block-code"><code>rm ~/.cache/yay/hstr/hstr-3.3.tar.gz</code></pre>



<h2 class="wp-block-heading">fzf: fuzzy search for everything</h2>



<p class="wp-block-paragraph">fzf is a general-purpose fuzzy finder and ships a script for Bash. It takes over <code>Ctrl</code>+<code>R</code> for the history and <code>Ctrl</code>+<code>T</code> for files. The search is fuzzy: the letters you type only have to appear in that order in the command. That is why <code>apt</code> also returns <code>curl</code> and <code>tar</code>. A leading single quote searches for an exact match. The package is available in Debian, Ubuntu, TUXEDO OS and Arch Linux.</p>



<pre data-lui-lang="bash" class="wp-block-code"><code>sudo apt install fzf
echo 'eval &quot;$(fzf --bash)&quot;' &gt;&gt; ~/.bashrc</code></pre>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af74287855d3&quot;}" data-wp-interactive="core/image" data-wp-key="6af74287855d3" class="wp-block-image wp-lightbox-container"><img decoding="async" height="720" sizes="(max-width: 781px) 100vw, 680px" srcset="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf-640x360.webp 640w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf-768x432.webp 768w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf-1280x720.webp 1280w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf-1536x864.webp 1536w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf.webp 1760w" width="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-03-fzf-1280x720.webp" alt="Konsole with the fzf history search, the matches are numbered and the input field is at the top"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">fzf searches fuzzily: apt also pulls in curl and tar, because the letters can be found there.</figcaption></figure>



<p class="wp-block-paragraph">What fzf lacks compared to hstr is a way to delete an entry from the history, and favorites. If you already use fzf, you get a history search for free. If you want more, take a look at Atuin.</p>



<h2 class="wp-block-heading">Atuin: the history as a database</h2>



<p class="wp-block-paragraph">Atuin replaces the text file with an SQLite database and stores the time, duration, exit code and directory for every command. That lets you narrow the search to a project directory, a session or a machine. Inside the interface, <code>Ctrl</code>+<code>R</code> switches between the filters. Atuin is in the repositories of Debian, Ubuntu, TUXEDO OS and Arch Linux.</p>



<pre data-lui-lang="bash" class="wp-block-code"><code>sudo apt install atuin
atuin import bash
echo 'eval &quot;$(atuin init bash)&quot;' &gt;&gt; ~/.bashrc</code></pre>



<p class="wp-block-paragraph">The import takes over your existing history. The line in <code>~/.bashrc</code> puts Atuin on <code>Ctrl</code>+<code>R</code> and the <code>Up</code> key, which you can turn off. The interface fills the whole terminal; it gets more compact with <code>inline_height = 10</code> in the file <code>~/.config/atuin/config.toml</code>.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af7428785bd1&quot;}" data-wp-interactive="core/image" data-wp-key="6af7428785bd1" class="wp-block-image wp-lightbox-container"><img loading="lazy" decoding="async" height="720" sizes="auto, (max-width: 781px) 100vw, 680px" srcset="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin-640x360.webp 640w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin-768x432.webp 768w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin-1280x720.webp 1280w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin-1536x864.webp 1536w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin.webp 1760w" width="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-04-atuin-1280x720.webp" alt="Konsole with the Atuin interface, the matches show duration, time and command, with the search field and the GLOBAL filter below"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">Atuin stores the duration and time of every command and shows both in the list of matches.</figcaption></figure>



<p class="wp-block-paragraph">The strongest argument for Atuin is the sync. It can compare your history between machines, end-to-end encrypted, through the project&#8217;s service or through a server of your own. In my testing, a server of my own ran fine: the <code>atuin-server</code> package is enough, and SQLite is sufficient as the database. The server reads its settings from <code>~/.config/atuin/server.toml</code>, and the clients get its address in their <code>config.toml</code>.</p>



<pre data-lui-lang="toml" data-lui-file="~/.config/atuin/server.toml" class="wp-block-code"><code>host = &quot;0.0.0.0&quot;
port = 8888
open_registration = true
db_uri = &quot;sqlite:///home/user/atuin-server/atuin.db&quot;</code></pre>



<pre data-lui-lang="toml" data-lui-file="~/.config/atuin/config.toml" class="wp-block-code"><code>sync_address = &quot;http://server:8888&quot;</code></pre>



<p class="wp-block-paragraph">On the first machine, <code>atuin register</code> creates an account and <code>atuin key</code> shows the key. On the second one, <code>atuin login</code> signs in with that key, after which <code>atuin sync</code> does the comparison. In my testing, commands arrived in both directions, with the machine name in the list. In the server&#8217;s database, none of them showed up in plain text. Without TLS, the server belongs in your home network only; otherwise put it behind a reverse proxy.</p>



<p class="wp-block-paragraph">Fedora 44 ships Atuin 18.12.1, while the server and the other machine ran 18.23. The older client could not read their entries (“unknown history version v2”) and stayed empty. Only the current release 18.24.6 from GitHub synced. All your machines should therefore run the same, preferably recent, version.</p>



<p class="wp-block-paragraph">Atuin filters commands containing passwords through <code>secrets_filter</code>, but I would not rely on it. A space before the command is more reliable: according to the documentation, Atuin honors the <code>ignorespace</code> convention, and such commands do not end up in the database.</p>



<h2 class="wp-block-heading">McFly: sorting by directory</h2>



<p class="wp-block-paragraph">McFly replaces <code>Ctrl</code>+<code>R</code> as well and, according to the project page, sorts the matches with a small neural network that takes into account, among other things, the current directory and the commands run most recently. On Arch Linux it is in extra. It is missing from the TUXEDO OS repositories, but in my testing the finished archive from GitHub did the job. The single file goes to <code>~/.local/bin</code>, and you do not need root rights.</p>



<pre data-lui-lang="bash" class="wp-block-code"><code>tar -xzf mcfly-v0.9.4-x86_64-unknown-linux-musl.tar.gz
cp mcfly ~/.local/bin/
echo 'eval &quot;$(mcfly init bash)&quot;' &gt;&gt; ~/.bashrc</code></pre>



<p class="wp-block-paragraph">On first start, McFly takes over your <code>~/.bash_history</code>. A bar at the top lists the keys: <code>Esc</code> quits, <code>Enter</code> runs, <code>Tab</code> takes the match over for editing, <code>F1</code> switches the sort order, <code>F2</code> deletes an entry, <code>F3</code> shows matches from all directories. The <code>MCFLY_RESULTS</code> variable controls how long the list is.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6af74287860c8&quot;}" data-wp-interactive="core/image" data-wp-key="6af74287860c8" class="wp-block-image wp-lightbox-container"><img loading="lazy" decoding="async" height="720" sizes="auto, (max-width: 781px) 100vw, 680px" srcset="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly-640x360.webp 640w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly-768x432.webp 768w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly-1280x720.webp 1280w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly-1536x864.webp 1536w, https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly.webp 1760w" width="1280" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://linuxundich.de/wp-content/uploads/2026/11/hstr-alternativen-05-mcfly-1280x720.webp" alt="Konsole with McFly, a blue bar of key shortcuts at the top and the matches for apt with their age below"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">McFly shows the key shortcuts at the top and, next to each match, how long ago the command ran.</figcaption></figure>



<p class="wp-block-paragraph">The interface is clearer than Atuin&#8217;s. How well the sorting by directory works cannot be judged with a demo history; the network needs real habits for that. Unlike Atuin, McFly does not come with a sync service, according to its developers.</p>



<h2 class="wp-block-heading">Which tool for whom?</h2>



<p class="wp-block-paragraph">If the built-in tools with prefix search are enough for you, you do not have to install anything. hstr offers a simple list with a delete function and favorites, but its package versions differ between distributions (Debian 3.1, Arch 3.3). If you already use fzf, you get the history search along with it. McFly fits if you do not need sync and like sorting by directory.</p>



<p class="wp-block-paragraph">In my opinion, Atuin is mainly worth it once you look after more than one machine or want to know afterwards where you ran a command. In return, it is also the most extensive of the four tools. Import your old history and see after a week whether you still fall back on <code>Ctrl</code>+<code>R</code>.</p>



<p class="wp-block-paragraph">Which solution do you use for your Bash history? Is the search in Bash enough for you, or have you replaced hstr? Let me know in the comments.</p>
<hr><p>☕ <strong>Support Linux und Ich</strong><br>Thanks for reading <a href="https://linuxundich.de/en/">Linux und Ich</a>. If you enjoy the blog and would like to support my work, you will find more information on the <a href="https://linuxundich.de/en/support/">donation page</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://linuxundich.de/en/search-bash-history-hstr-fzf-atuin-mcfly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
