Using shell's read command with live editing functionality (readline like)Is there a POSIX shell alternative to read -e?Read and process a string, char by char, yet allow user to simple line edit the inputarrow keys for line editing during zsh read builtinHow to read 'n' into variable with Bash's built-in command?measure amount of data read from /dev/randomUsing sed with herestring (<<<) and read -aUsing bind to read the current command lineHow can I setup a hybrid readline with emacs insert mode and vi command mode?readline: How do I change keymaps from `emacs` to `vi-command` with a binding?serial port via minicom: can minicom use line-editing (i.e. readline functionality)?Assignments are like commands with an exit status except when there's command substitution?Line editing (readline?) with virtual keysread command with ??? input

Tiptoe or tiphoof? Adjusting words to better fit fantasy races

Using parameter substitution on a Bash array

Cynical novel that describes an America ruled by the media, arms manufacturers, and ethnic figureheads

Why Were Madagascar and New Zealand Discovered So Late?

How does a character multiclassing into warlock get a focus?

How do I rename a LINUX host without needing to reboot for the rename to take effect?

Mapping a list into a phase plot

Should my PhD thesis be submitted under my legal name?

How does residential electricity work?

Can I convert a rim brake wheel to a disc brake wheel?

Irreducibility of a simple polynomial

Finding all intervals that match predicate in vector

Failed to fetch jessie backports repository

Will it be accepted, if there is no ''Main Character" stereotype?

Why are on-board computers allowed to change controls without notifying the pilots?

when is out of tune ok?

Is a roofing delivery truck likely to crack my driveway slab?

Is the destination of a commercial flight important for the pilot?

apt-get update is failing in debian

What is the opposite of 'gravitas'?

Displaying the order of the columns of a table

What's the purpose of "true" in bash "if sudo true; then"

Best way to store options for panels

Modify casing of marked letters



Using shell's read command with live editing functionality (readline like)


Is there a POSIX shell alternative to read -e?Read and process a string, char by char, yet allow user to simple line edit the inputarrow keys for line editing during zsh read builtinHow to read 'n' into variable with Bash's built-in command?measure amount of data read from /dev/randomUsing sed with herestring (<<<) and read -aUsing bind to read the current command lineHow can I setup a hybrid readline with emacs insert mode and vi command mode?readline: How do I change keymaps from `emacs` to `vi-command` with a binding?serial port via minicom: can minicom use line-editing (i.e. readline functionality)?Assignments are like commands with an exit status except when there's command substitution?Line editing (readline?) with virtual keysread command with ??? input













6















Is there a standard (POSIX) way of asking the user some data from within a shell script, with read for example, while allowing live edition of the text being typed (what readline does)?



I know bash has read -e varname that allows for the person launching the script to use keyboard arrows for exemple, to edit or correct what has just been typed without deleting the last entered characters with backspace.



However, read -e is bash specific. And still, it is pretty cumbersome to delete all that has been wrote if you realise you made a mistake at the beginning of your long sentence...










share|improve this question
























  • My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

    – samiam
    Feb 2 '14 at 3:18











  • Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

    – user58503
    Feb 3 '14 at 19:39















6















Is there a standard (POSIX) way of asking the user some data from within a shell script, with read for example, while allowing live edition of the text being typed (what readline does)?



I know bash has read -e varname that allows for the person launching the script to use keyboard arrows for exemple, to edit or correct what has just been typed without deleting the last entered characters with backspace.



However, read -e is bash specific. And still, it is pretty cumbersome to delete all that has been wrote if you realise you made a mistake at the beginning of your long sentence...










share|improve this question
























  • My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

    – samiam
    Feb 2 '14 at 3:18











  • Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

    – user58503
    Feb 3 '14 at 19:39













6












6








6


3






Is there a standard (POSIX) way of asking the user some data from within a shell script, with read for example, while allowing live edition of the text being typed (what readline does)?



I know bash has read -e varname that allows for the person launching the script to use keyboard arrows for exemple, to edit or correct what has just been typed without deleting the last entered characters with backspace.



However, read -e is bash specific. And still, it is pretty cumbersome to delete all that has been wrote if you realise you made a mistake at the beginning of your long sentence...










share|improve this question
















Is there a standard (POSIX) way of asking the user some data from within a shell script, with read for example, while allowing live edition of the text being typed (what readline does)?



I know bash has read -e varname that allows for the person launching the script to use keyboard arrows for exemple, to edit or correct what has just been typed without deleting the last entered characters with backspace.



However, read -e is bash specific. And still, it is pretty cumbersome to delete all that has been wrote if you realise you made a mistake at the beginning of your long sentence...







bash shell posix readline






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Feb 3 '14 at 18:04







Totor

















asked Feb 2 '14 at 3:09









TotorTotor

8,737135181




8,737135181












  • My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

    – samiam
    Feb 2 '14 at 3:18











  • Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

    – user58503
    Feb 3 '14 at 19:39

















  • My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

    – samiam
    Feb 2 '14 at 3:18











  • Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

    – user58503
    Feb 3 '14 at 19:39
















My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

– samiam
Feb 2 '14 at 3:18





My sense is that the best way to do this and be POSIX compliant is to implement a subset of readline using the curses interface. Here's a POSIX link: pubs.opengroup.org/onlinepubs/7990989775/xcurses/curses.h.html

– samiam
Feb 2 '14 at 3:18













Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

– user58503
Feb 3 '14 at 19:39





Similar question already discussed here: unix.stackexchange.com/questions/18334/…, esp. unix.stackexchange.com/a/24207.

– user58503
Feb 3 '14 at 19:39










1 Answer
1






active

oldest

votes


















5














The terminal driver does have line editing capabilities on most systems. You'll notice that you can use Backspace, Ctrl-U, sometimes Ctrl-W.



readline is a GNU library maintained alongside bash. There's nothing POSIX about it. POSIX defines an optional line editor (with vi key binding) for sh, but no provision to use it outside of sh.



The ksh93 shell uses that vi-style line editor (also supports emacs or gmacs-style) for its read builtin when both stdin and stderr are a terminal and the corresponding option has been set: set -o emacs; IFS= read -r var for instance for read to use an emacs-style line-editor.



POSIX does specify the vi editor though (optional), so you could invoke vi to edit the content of a temporary file.



The zsh equivalent of bash's read -e is vared (a lot more advanced as it's using zsh's zle (zsh line editor)).



In other shells, you can use some wrappers around readline or other line-editing libraries (like rlwrap), or you can invoke bash -c 'read -e...' or zsh -c 'vared...'.



What you could also do is give the opportunity to the user to launch an editor.



Like:



if ! IFS= read -r var; then
if [ -n "$var" ]; then
tmp=$(create_tempfile) # create_tempfile left as an exercise
printf '%sn' "$var" > "$tmp"
"$VISUAL:-$EDITOR:-vi" -- "$tmp"
var=$(cat < "$tmp")
rm -f -- "$tmp"
else
exit 1 # real EOF?
fi
fi


Then the user can press Ctrl-D twice to launch an editor on what he has already entered.



Otherwise, I once wrote that function that should work on most terminals on most Unices that implements a simple line editor.



LE() od -vAn -to1); do
while [ "$#" -gt 0 ]; do
LE_k=$1
shift
if [ "$LE_k" = 033 ]; then
case "$1$2$3" in
133103*


To be used as:



LE 'Prompt: '


Or:



LE 'Prompt: [....]bbbbb' 4 . DEF


if you want a maximum length and/or different filling character and/or an initial value.






share|improve this answer
























    Your Answer








    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "106"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f112109%2fusing-shells-read-command-with-live-editing-functionality-readline-like%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    5














    The terminal driver does have line editing capabilities on most systems. You'll notice that you can use Backspace, Ctrl-U, sometimes Ctrl-W.



    readline is a GNU library maintained alongside bash. There's nothing POSIX about it. POSIX defines an optional line editor (with vi key binding) for sh, but no provision to use it outside of sh.



    The ksh93 shell uses that vi-style line editor (also supports emacs or gmacs-style) for its read builtin when both stdin and stderr are a terminal and the corresponding option has been set: set -o emacs; IFS= read -r var for instance for read to use an emacs-style line-editor.



    POSIX does specify the vi editor though (optional), so you could invoke vi to edit the content of a temporary file.



    The zsh equivalent of bash's read -e is vared (a lot more advanced as it's using zsh's zle (zsh line editor)).



    In other shells, you can use some wrappers around readline or other line-editing libraries (like rlwrap), or you can invoke bash -c 'read -e...' or zsh -c 'vared...'.



    What you could also do is give the opportunity to the user to launch an editor.



    Like:



    if ! IFS= read -r var; then
    if [ -n "$var" ]; then
    tmp=$(create_tempfile) # create_tempfile left as an exercise
    printf '%sn' "$var" > "$tmp"
    "$VISUAL:-$EDITOR:-vi" -- "$tmp"
    var=$(cat < "$tmp")
    rm -f -- "$tmp"
    else
    exit 1 # real EOF?
    fi
    fi


    Then the user can press Ctrl-D twice to launch an editor on what he has already entered.



    Otherwise, I once wrote that function that should work on most terminals on most Unices that implements a simple line editor.



    LE() od -vAn -to1); do
    while [ "$#" -gt 0 ]; do
    LE_k=$1
    shift
    if [ "$LE_k" = 033 ]; then
    case "$1$2$3" in
    133103*


    To be used as:



    LE 'Prompt: '


    Or:



    LE 'Prompt: [....]bbbbb' 4 . DEF


    if you want a maximum length and/or different filling character and/or an initial value.






    share|improve this answer





























      5














      The terminal driver does have line editing capabilities on most systems. You'll notice that you can use Backspace, Ctrl-U, sometimes Ctrl-W.



      readline is a GNU library maintained alongside bash. There's nothing POSIX about it. POSIX defines an optional line editor (with vi key binding) for sh, but no provision to use it outside of sh.



      The ksh93 shell uses that vi-style line editor (also supports emacs or gmacs-style) for its read builtin when both stdin and stderr are a terminal and the corresponding option has been set: set -o emacs; IFS= read -r var for instance for read to use an emacs-style line-editor.



      POSIX does specify the vi editor though (optional), so you could invoke vi to edit the content of a temporary file.



      The zsh equivalent of bash's read -e is vared (a lot more advanced as it's using zsh's zle (zsh line editor)).



      In other shells, you can use some wrappers around readline or other line-editing libraries (like rlwrap), or you can invoke bash -c 'read -e...' or zsh -c 'vared...'.



      What you could also do is give the opportunity to the user to launch an editor.



      Like:



      if ! IFS= read -r var; then
      if [ -n "$var" ]; then
      tmp=$(create_tempfile) # create_tempfile left as an exercise
      printf '%sn' "$var" > "$tmp"
      "$VISUAL:-$EDITOR:-vi" -- "$tmp"
      var=$(cat < "$tmp")
      rm -f -- "$tmp"
      else
      exit 1 # real EOF?
      fi
      fi


      Then the user can press Ctrl-D twice to launch an editor on what he has already entered.



      Otherwise, I once wrote that function that should work on most terminals on most Unices that implements a simple line editor.



      LE() od -vAn -to1); do
      while [ "$#" -gt 0 ]; do
      LE_k=$1
      shift
      if [ "$LE_k" = 033 ]; then
      case "$1$2$3" in
      133103*


      To be used as:



      LE 'Prompt: '


      Or:



      LE 'Prompt: [....]bbbbb' 4 . DEF


      if you want a maximum length and/or different filling character and/or an initial value.






      share|improve this answer



























        5












        5








        5







        The terminal driver does have line editing capabilities on most systems. You'll notice that you can use Backspace, Ctrl-U, sometimes Ctrl-W.



        readline is a GNU library maintained alongside bash. There's nothing POSIX about it. POSIX defines an optional line editor (with vi key binding) for sh, but no provision to use it outside of sh.



        The ksh93 shell uses that vi-style line editor (also supports emacs or gmacs-style) for its read builtin when both stdin and stderr are a terminal and the corresponding option has been set: set -o emacs; IFS= read -r var for instance for read to use an emacs-style line-editor.



        POSIX does specify the vi editor though (optional), so you could invoke vi to edit the content of a temporary file.



        The zsh equivalent of bash's read -e is vared (a lot more advanced as it's using zsh's zle (zsh line editor)).



        In other shells, you can use some wrappers around readline or other line-editing libraries (like rlwrap), or you can invoke bash -c 'read -e...' or zsh -c 'vared...'.



        What you could also do is give the opportunity to the user to launch an editor.



        Like:



        if ! IFS= read -r var; then
        if [ -n "$var" ]; then
        tmp=$(create_tempfile) # create_tempfile left as an exercise
        printf '%sn' "$var" > "$tmp"
        "$VISUAL:-$EDITOR:-vi" -- "$tmp"
        var=$(cat < "$tmp")
        rm -f -- "$tmp"
        else
        exit 1 # real EOF?
        fi
        fi


        Then the user can press Ctrl-D twice to launch an editor on what he has already entered.



        Otherwise, I once wrote that function that should work on most terminals on most Unices that implements a simple line editor.



        LE() od -vAn -to1); do
        while [ "$#" -gt 0 ]; do
        LE_k=$1
        shift
        if [ "$LE_k" = 033 ]; then
        case "$1$2$3" in
        133103*


        To be used as:



        LE 'Prompt: '


        Or:



        LE 'Prompt: [....]bbbbb' 4 . DEF


        if you want a maximum length and/or different filling character and/or an initial value.






        share|improve this answer















        The terminal driver does have line editing capabilities on most systems. You'll notice that you can use Backspace, Ctrl-U, sometimes Ctrl-W.



        readline is a GNU library maintained alongside bash. There's nothing POSIX about it. POSIX defines an optional line editor (with vi key binding) for sh, but no provision to use it outside of sh.



        The ksh93 shell uses that vi-style line editor (also supports emacs or gmacs-style) for its read builtin when both stdin and stderr are a terminal and the corresponding option has been set: set -o emacs; IFS= read -r var for instance for read to use an emacs-style line-editor.



        POSIX does specify the vi editor though (optional), so you could invoke vi to edit the content of a temporary file.



        The zsh equivalent of bash's read -e is vared (a lot more advanced as it's using zsh's zle (zsh line editor)).



        In other shells, you can use some wrappers around readline or other line-editing libraries (like rlwrap), or you can invoke bash -c 'read -e...' or zsh -c 'vared...'.



        What you could also do is give the opportunity to the user to launch an editor.



        Like:



        if ! IFS= read -r var; then
        if [ -n "$var" ]; then
        tmp=$(create_tempfile) # create_tempfile left as an exercise
        printf '%sn' "$var" > "$tmp"
        "$VISUAL:-$EDITOR:-vi" -- "$tmp"
        var=$(cat < "$tmp")
        rm -f -- "$tmp"
        else
        exit 1 # real EOF?
        fi
        fi


        Then the user can press Ctrl-D twice to launch an editor on what he has already entered.



        Otherwise, I once wrote that function that should work on most terminals on most Unices that implements a simple line editor.



        LE() od -vAn -to1); do
        while [ "$#" -gt 0 ]; do
        LE_k=$1
        shift
        if [ "$LE_k" = 033 ]; then
        case "$1$2$3" in
        133103*


        To be used as:



        LE 'Prompt: '


        Or:



        LE 'Prompt: [....]bbbbb' 4 . DEF


        if you want a maximum length and/or different filling character and/or an initial value.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited yesterday

























        answered Feb 4 '14 at 11:57









        Stéphane ChazelasStéphane Chazelas

        311k57587945




        311k57587945



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f112109%2fusing-shells-read-command-with-live-editing-functionality-readline-like%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            -bash, posix, readline, shell

            Popular posts from this blog

            Creating 100m^2 grid automatically using QGIS?Creating grid constrained within polygon in QGIS?Createing polygon layer from point data using QGIS?Creating vector grid using QGIS?Creating grid polygons from coordinates using R or PythonCreating grid from spatio temporal point data?Creating fields in attributes table using other layers using QGISCreate .shp vector grid in QGISQGIS Creating 4km point grid within polygonsCreate a vector grid over a raster layerVector Grid Creates just one grid

            Nikolai Prilezhaev Bibliography References External links Navigation menuEarly Russian Organic Chemists and Their Legacy092774english translationRussian Biography

            Why is this plane circling around the Lucknow airport every day?Why do aircraft on Flight Radar 24 jump around randomly sometimes?What airport has this walkway over a taxiway?How does Chicago O'Hare's tower sequence aircraft at peak capacity?Which airport is featured in this Delta commercial?After a crash, for how long is the airport closed?Can a passenger plane stand still in the air, or hover at a fixed location above a ground?What are those trucks towing around, and why?What is this airport outside of Cairo, Egypt?Which US airport has the lowest circling MDH?What is this airport video?