Honestly I had no idea what ctrl+d even did, I just knew it was a convenient way for me to close all the REPL programs I use. The fact that it is similar to pressing enter really surprised me, so I wanted to share this knowledge with you :)

  • CasualTee@beehaw.org
    link
    fedilink
    arrow-up
    8
    ·
    2 days ago

    When running cat this way, you are in “cooked mode”. A ctrl-d does nothing on a non-empty line.

    The shell usually runs in non-cokked, or raw, mode as well as nonblocking mode. Where it sees (nearly) every key you press as you press them. Which is why it " sees" the ctrl-d even when you are not on an empty line.

    You can learn more here:

    • tuna@discuss.tchncs.deOP
      link
      fedilink
      arrow-up
      1
      ·
      6 hours ago

      Interesting, I have not heard of these terms before. Thanks for sharing!

      I think this adds the bit of nuance that was bugging me: using something like ncurses or vim, presumably when you press a key like ctrl-z or ctrl-d it actually sends the character to the app. It would feel a bit silly if the terminal intercepted the ctrl-d, flushed some buffer, and the program had to reverse engineer whether you pressed ctrl-d or enter or something.

      For raw mode, I assume the app asks the tty to please forward some characters to the app. Otherwise, in the default cooked mode, the tty intercepts those control characters to call certain functions. I suppose some REPLs may choose to emulate a cooked mode on top of raw mode, and so they have to handle the \x04 in the same way a tty would to keep it functioning like the user expects. I believe readline does something like this, which is why you had to use bash --noediting for ctrl-d to run the command. Good food for thought :)

      I also have to say, naming it “cooked mode” is extremely funny as gen z. I love that

    • Arthur Besse@lemmy.mlM
      link
      fedilink
      English
      arrow-up
      2
      ·
      1 day ago

      A ctrl-d does nothing on a non-empty line.

      ctrl-d actually is flushing the buffer regardless of if the line is empty or not.

      See my other comment for how you can observe it.