<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: bash</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/bash.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-02-14T02:40:11+00:00</updated><author><name>Simon Willison</name></author><entry><title>How to add a directory to your PATH</title><link href="https://simonwillison.net/2025/Feb/14/how-to-add-a-directory-to-your-path/#atom-tag" rel="alternate"/><published>2025-02-14T02:40:11+00:00</published><updated>2025-02-14T02:40:11+00:00</updated><id>https://simonwillison.net/2025/Feb/14/how-to-add-a-directory-to-your-path/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://jvns.ca/blog/2025/02/13/how-to-add-a-directory-to-your-path/"&gt;How to add a directory to your PATH&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;em&gt;Classic&lt;/em&gt; Julia Evans piece here, answering a question which you might assume is obvious but very much isn't.&lt;/p&gt;
&lt;p&gt;Plenty of useful tips in here, plus the best explanation I've ever seen of the three different Bash configuration options:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bash has three possible config files: &lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.bash_profile&lt;/code&gt;, and &lt;code&gt;~/.profile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you're not sure which one your system is set up to use, I'd recommend testing this way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;add &lt;code&gt;echo hi there&lt;/code&gt; to your &lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Restart your terminal&lt;/li&gt;
&lt;li&gt;If you see "hi there", that means &lt;code&gt;~/.bashrc&lt;/code&gt; is being used! Hooray!&lt;/li&gt;
&lt;li&gt;Otherwise remove it and try the same thing with &lt;code&gt;~/.bash_profile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can also try &lt;code&gt;~/.profile&lt;/code&gt; if the first two options don't work.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article also reminded me to &lt;a href="https://simonwillison.net/2024/Oct/15/path-tips-on-wizard-zines/"&gt;try which -a again&lt;/a&gt;, which gave me this confusing result for &lt;code&gt;datasette&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% which -a datasette
/opt/homebrew/Caskroom/miniconda/base/bin/datasette
/Users/simon/.local/bin/datasette
/Users/simon/.local/bin/datasette
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why is the second path in there twice? I figured out how to use &lt;code&gt;rg&lt;/code&gt; to search just the dot-files in my home directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rg local/bin -g '/.*' --max-depth 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And found that I have both a &lt;code&gt;.zshrc&lt;/code&gt; and &lt;code&gt;.zprofile&lt;/code&gt; file that are adding that to my path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.zshrc.backup
4:export PATH="$PATH:/Users/simon/.local/bin"

.zprofile
5:export PATH="$PATH:/Users/simon/.local/bin"

.zshrc
7:export PATH="$PATH:/Users/simon/.local/bin"
&lt;/code&gt;&lt;/pre&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/julia-evans"&gt;julia-evans&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ripgrep"&gt;ripgrep&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zsh"&gt;zsh&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="julia-evans"/><category term="ripgrep"/><category term="zsh"/></entry><entry><title>3 shell scripts to improve your writing, or "My Ph.D. advisor rewrote himself in bash."</title><link href="https://simonwillison.net/2024/Dec/14/improve-your-writing/#atom-tag" rel="alternate"/><published>2024-12-14T18:20:50+00:00</published><updated>2024-12-14T18:20:50+00:00</updated><id>https://simonwillison.net/2024/Dec/14/improve-your-writing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/"&gt;3 shell scripts to improve your writing, or &amp;quot;My Ph.D. advisor rewrote himself in bash.&amp;quot;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Matt Might in 2010:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The hardest part of advising Ph.D. students is teaching them how to write.&lt;/p&gt;
&lt;p&gt;Fortunately, I've seen patterns emerge over the past couple years.&lt;/p&gt;
&lt;p&gt;So, I've decided to replace myself with a shell script.&lt;/p&gt;
&lt;p&gt;In particular, I've created shell scripts for catching three problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;abuse of the passive voice,&lt;/li&gt;
&lt;li&gt;weasel words, and&lt;/li&gt;
&lt;li&gt;lexical illusions.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;"Lexical illusions" here refers to the thing where you accidentally repeat a word word twice without realizing, which is particularly hard to spot if the repetition spans a line break.&lt;/p&gt;
&lt;p&gt;Matt shares Bash scripts that he added to a LaTeX build system to identify these problems.&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://gist.github.com/simonw/e9902ed1cbda30f90db8d0d22caa06d2"&gt;pasted his entire article&lt;/a&gt; into Claude and asked it to build me an HTML+JavaScript artifact implementing the rules from those scripts. After a couple more iterations (I &lt;a href="https://gist.github.com/simonw/dc79f6adcdb189469890bc0a44331774"&gt;pasted in&lt;/a&gt; some &lt;a href="https://news.ycombinator.com/item?id=42407250#42417657"&gt;feedback comments&lt;/a&gt; from Hacker News) I now have an actually quite useful little web tool:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://tools.simonwillison.net/writing-style"&gt;tools.simonwillison.net/writing-style&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screnshot of the Writing Style Analyzer tool. I have pasted in the post you are reading now, it found a weasel word &amp;quot;quite&amp;quot; in: &amp;quot;actually quite useful little web tool&amp;quot; and duplicate word &amp;quot;word&amp;quot; in: &amp;quot;word word twice without realizing, which is&amp;quot;" src="https://static.simonwillison.net/static/2024/writing-style.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the &lt;a href="https://github.com/simonw/tools/blob/main/writing-style.html"&gt;source code&lt;/a&gt; and &lt;a href="https://github.com/simonw/tools/commits/main/writing-style.html"&gt;commit history&lt;/a&gt;.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/rupea8/3_shell_scripts_improve_your_writing_my_ph"&gt;lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tools"&gt;tools&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/writing"&gt;writing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-artifacts"&gt;claude-artifacts&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-to-app"&gt;prompt-to-app&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="tools"/><category term="writing"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="claude-artifacts"/><category term="prompt-to-app"/></entry><entry><title>Running prompts against images and PDFs with Google Gemini</title><link href="https://simonwillison.net/2024/Oct/23/prompt-gemini/#atom-tag" rel="alternate"/><published>2024-10-23T18:25:07+00:00</published><updated>2024-10-23T18:25:07+00:00</updated><id>https://simonwillison.net/2024/Oct/23/prompt-gemini/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://til.simonwillison.net/llms/prompt-gemini"&gt;Running prompts against images and PDFs with Google Gemini&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
New TIL. I've been experimenting with the Google Gemini APIs for running prompts against images and PDFs (in preparation for finally adding multi-modal support to &lt;a href="https://llm.datasette.io/"&gt;LLM&lt;/a&gt;) - here are my notes on how to send images or PDF files to their API using &lt;code&gt;curl&lt;/code&gt; and the &lt;code&gt;base64 -i&lt;/code&gt; macOS command.&lt;/p&gt;
&lt;p&gt;I figured out the &lt;code&gt;curl&lt;/code&gt; incantation first and then &lt;a href="https://gist.github.com/simonw/7cc2a9c3e612a8af502d733ff619e066"&gt;got Claude to build me&lt;/a&gt; a Bash script that I can execute like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;prompt-gemini 'extract text' example-handwriting.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/prompt-gemini-extract.gif" alt="Animated terminal demo. At the top of the screen is a example-handwriting.jpg with some rough handwriting. I run this command in a terminal: 
prompt-gemini 'extract text' example-handwriting.jpg It returns JSON showing 270 tokens used by gemini-1.5-flash-8b. Then I run the command again with -r on the end and it returns the text from the image: Example handwriting Let's try this out"&gt;&lt;/p&gt;
&lt;p&gt;Playing with this is &lt;em&gt;really fun&lt;/em&gt;. The Gemini models charge less than 1/10th of a cent per image, so it's really inexpensive to try them out.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ocr"&gt;ocr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm"&gt;llm&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gemini"&gt;gemini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vision-llms"&gt;vision-llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-pricing"&gt;llm-pricing&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="google"/><category term="ocr"/><category term="projects"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="llm"/><category term="gemini"/><category term="vision-llms"/><category term="llm-pricing"/></entry><entry><title>lsix</title><link href="https://simonwillison.net/2024/Jun/6/lsix/#atom-tag" rel="alternate"/><published>2024-06-06T22:07:35+00:00</published><updated>2024-06-06T22:07:35+00:00</updated><id>https://simonwillison.net/2024/Jun/6/lsix/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/hackerb9/lsix"&gt;lsix&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is pretty magic: an &lt;code&gt;ls&lt;/code&gt; style tool which shows actual thumbnails of every image in the current folder, implemented as a Bash script.&lt;/p&gt;
&lt;p&gt;To get this working on macOS I had to update to a more recent Bash (&lt;code&gt;brew install bash&lt;/code&gt;) and switch to &lt;a href="https://iterm2.com/"&gt;iTerm2&lt;/a&gt; due to the need for a &lt;a href="https://en.wikipedia.org/wiki/Sixel"&gt;Sixel&lt;/a&gt; compatible terminal.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=40598629"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/></entry><entry><title>Quoting tailscale.com/install.sh</title><link href="https://simonwillison.net/2024/Apr/29/tailscalecominstallsh/#atom-tag" rel="alternate"/><published>2024-04-29T21:00:27+00:00</published><updated>2024-04-29T21:00:27+00:00</updated><id>https://simonwillison.net/2024/Apr/29/tailscalecominstallsh/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://tailscale.com/install.sh"&gt;&lt;p&gt;&lt;code&gt;# All the code is wrapped in a main function that gets called at the bottom of the file, so that a truncated partial download doesn't end up executing half a script.&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://tailscale.com/install.sh"&gt;tailscale.com/install.sh&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tailscale"&gt;tailscale&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="tailscale"/></entry><entry><title>A tiny CI system</title><link href="https://simonwillison.net/2022/Apr/26/a-tiny-ci-system/#atom-tag" rel="alternate"/><published>2022-04-26T15:39:27+00:00</published><updated>2022-04-26T15:39:27+00:00</updated><id>https://simonwillison.net/2022/Apr/26/a-tiny-ci-system/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.0chris.com/tiny-ci-system.html"&gt;A tiny CI system&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Christian Ştefănescu shares a recipe for building a tiny self-hosted CI system using Git and Redis. A post-receive hook runs when a commit is pushed to the repo and uses redis-cli to push jobs to a list. Then a separate bash script runs a loop with a blocking “redis-cli blpop jobs” operation which waits for new jobs and then executes the CI job as a shell script.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/stchris_/status/1518977088723861505"&gt;@stchris_&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/continuous-integration"&gt;continuous-integration&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git"&gt;git&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="continuous-integration"/><category term="git"/><category term="redis"/></entry><entry><title>flk:  A LISP that runs wherever Bash is</title><link href="https://simonwillison.net/2019/Dec/4/flk-lisp-runs-wherever-bash/#atom-tag" rel="alternate"/><published>2019-12-04T05:19:25+00:00</published><updated>2019-12-04T05:19:25+00:00</updated><id>https://simonwillison.net/2019/Dec/4/flk-lisp-runs-wherever-bash/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/chr15m/flk"&gt;flk:  A LISP that runs wherever Bash is&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is a heck of a project: an implementation of LISP written entirely in Bash, meaning you can run it as a script on any machine that has a Bash installation.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=21662893"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lisp"&gt;lisp&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="lisp"/></entry><entry><title>direnv</title><link href="https://simonwillison.net/2017/Nov/5/direnvdirenv-unclutter-your-profile/#atom-tag" rel="alternate"/><published>2017-11-05T19:59:35+00:00</published><updated>2017-11-05T19:59:35+00:00</updated><id>https://simonwillison.net/2017/Nov/5/direnvdirenv-unclutter-your-profile/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/direnv/direnv"&gt;direnv&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A shell extension (for bash, zsh and others) which can automatically set and unset environment variables when you cd into specific directories. Useful for managing things like a project’s GOPATH or automatically activating Python virtual environments.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://speakerdeck.com/farslan/go-at-digitalocean?slide=32"&gt;Go at DigitalOcean&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shell"&gt;shell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zsh"&gt;zsh&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="shell"/><category term="zsh"/></entry><entry><title>What is a good programming language to learn after bash scripting?</title><link href="https://simonwillison.net/2012/Jan/13/what-is-a-good/#atom-tag" rel="alternate"/><published>2012-01-13T16:45:00+00:00</published><updated>2012-01-13T16:45:00+00:00</updated><id>https://simonwillison.net/2012/Jan/13/what-is-a-good/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-a-good-programming-language-to-learn-after-bash-scripting/answer/Simon-Willison"&gt;What is a good programming language to learn after bash scripting?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Python is a good natural progression from bash in my opinion. It has an interactive prompt which supports bash-style exploratory programming, and it has libraries that mean it can be applied to an enormous range of problems - everything from game development to scientific computing to web applications.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shell"&gt;shell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="bash"/><category term="programming"/><category term="shell"/><category term="quora"/></entry><entry><title>Using Bash's History Effectively</title><link href="https://simonwillison.net/2010/Feb/25/bash/#atom-tag" rel="alternate"/><published>2010-02-25T12:21:09+00:00</published><updated>2010-02-25T12:21:09+00:00</updated><id>https://simonwillison.net/2010/Feb/25/bash/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.talug.org/events/20030709/cmdline_history.html"&gt;Using Bash&amp;#x27;s History Effectively&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The HISTIGNORE environment variable is particularly useful, allowing you to suppress certain commands by specifying a pattern. This article has a tip for causing a command to be omitted from the history if you prefix it with a space.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/></entry><entry><title>shunit2</title><link href="https://simonwillison.net/2009/Sep/27/shunit/#atom-tag" rel="alternate"/><published>2009-09-27T19:34:03+00:00</published><updated>2009-09-27T19:34:03+00:00</updated><id>https://simonwillison.net/2009/Sep/27/shunit/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/shunit2/"&gt;shunit2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
xUnit style testing for shell scripts.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://delicious.com/jacobian/xunit+bash"&gt;Jacob Kaplan-Moss&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shell"&gt;shell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/shunit2"&gt;shunit2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/testing"&gt;testing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unix"&gt;unix&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xunit"&gt;xunit&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="shell"/><category term="shunit2"/><category term="testing"/><category term="unix"/><category term="xunit"/></entry><entry><title>BashReduce</title><link href="https://simonwillison.net/2009/Jun/28/bashreduce/#atom-tag" rel="alternate"/><published>2009-06-28T15:03:15+00:00</published><updated>2009-06-28T15:03:15+00:00</updated><id>https://simonwillison.net/2009/Jun/28/bashreduce/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://rcrowley.org/2009/06/27/bashreduce"&gt;BashReduce&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Map/Reduce in Bash is no longer a joke project (if it ever was)—Richard Crowley is extending it and using it for analysis at OpenDNS.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bashreduce"&gt;bashreduce&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mapreduce"&gt;mapreduce&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/opendns"&gt;opendns&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/richard-crowley"&gt;richard-crowley&lt;/a&gt;&lt;/p&gt;



</summary><category term="bash"/><category term="bashreduce"/><category term="mapreduce"/><category term="opendns"/><category term="richard-crowley"/></entry><entry><title>resty</title><link href="https://simonwillison.net/2009/May/18/resty/#atom-tag" rel="alternate"/><published>2009-05-18T13:07:09+00:00</published><updated>2009-05-18T13:07:09+00:00</updated><id>https://simonwillison.net/2009/May/18/resty/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/micha/resty"&gt;resty&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
58 lines of bash provides a better command-line interface to RESTful APIs, using curl under the hood. This should save me from running “man curl” several times a week.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bash"&gt;bash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cli"&gt;cli&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/curl"&gt;curl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rest"&gt;rest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/resty"&gt;resty&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="bash"/><category term="cli"/><category term="curl"/><category term="rest"/><category term="resty"/></entry></feed>