Respond to Prompt in Bash Script

By  on  

I work on a project that requires I frequently build and destroy a virtual machine.  I don't enjoy having to do so but virtual machines can be notoriously difficult to prop up, especially when you have a complex app living within it.

Manually typing the same commands over and over can be mind-numbing so I've create a bash script to handle all of the work for me.  One hiccup to the process is needing to confirm removal of an existing virtual machine; using a pipe and echo allows me to answer the prompt:

# ... some directives here

# Remove the machine, confirming "y" when asked by docker-machine
echo 'y' | docker-machine rm default

# ... more directives here

Using echo I pipe a y response to docker-machine's confirmation prompt, thus allowing the script to move forward with other tasks without the need for manual intervention.

I don't, however, know how to handle multiple prompts -- can you tell me and everyone else?

Recent Features

  • By
    Create Namespaced Classes with MooTools

    MooTools has always gotten a bit of grief for not inherently using and standardizing namespaced-based JavaScript classes like the Dojo Toolkit does.  Many developers create their classes as globals which is generally frowned up.  I mostly disagree with that stance, but each to their own.  In any event...

  • By
    I’m an Impostor

    This is the hardest thing I've ever had to write, much less admit to myself.  I've written resignation letters from jobs I've loved, I've ended relationships, I've failed at a host of tasks, and let myself down in my life.  All of those feelings were very...

Incredible Demos

  • By
    Dijit’s TabContainer Layout:  Easy Tabbed Content

    One of Dojo's major advantages over other JavaScript toolkits is its Dijit library.  Dijit is a UI framework comprised of JavaScript widget classes, CSS files, and HTML templates.  One very useful layout class is the TabContainer.  TabContainer allows you to quickly create a tabbed content...

  • By
    Digg-Style Dynamic Share Widget Using MooTools

    I've always seen Digg as a very progressive website. Digg uses experimental, ajaxified methods for comments and mission-critical functions. One nice touch Digg has added to their website is their hover share widget. Here's how to implement that functionality on your site...

Discussion

  1. As far as I know this is usually done with the yes command:

    yes | docker-foo bar

    This should also respond to multiple prompts.

    • Ah yes, I did experiment with that. But what if I know the multiple prompt responses should be “y”, “n”, “3”? That would be useful.

    • To expand on what Andreas said, you can build a canned file of responses, one per line (extra blanks for the equivalent of hitting enter) and sending that to your program:

      cat responses.txt | docker-foo bar
  2. MaxArti

    Can’t you stream a file in? Like in

    some-command < my-answers.txt
  3. Daniel

    Try a here string.

    while IFS= read -r; do
        echo "E- $REPLY"
    done <<<"y
    n
    3"
    

    Will print the three lines of responses. Assuming the docker prompt is similar to read it should work.

  4. Rohit

    The ‘expect’ utility can be installed on most Linux boxes.

    https://en.wikipedia.org/wiki/Expect

  5. Mike Wilson

    I agree about ‘expect’ as Rohit mentions, it’s usually what you resort to when piping doesn’t work for different reasons (such as passwords being read from physical terminal only, input being prematurely consumed by a loop, etc).
    The tool is {advanced|complicated} enough to maybe warrant a future post ;-)

  6. David Viklund

    In my team we use Vagrant and Ansible to do these kinds of things. They are very helpful tool for popping up a dev env with customized apps / configs.
    I have not tried Ansible for Docker but there is a page for it https://www.ansible.com/docker

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!