[HN Gopher] CLI tool to insert spacers when command output stops
___________________________________________________________________
CLI tool to insert spacers when command output stops
Author : freetonik
Score : 239 points
Date : 2024-12-21 11:27 UTC (3 days ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| tetris11 wrote:
| pretty cool idea, wish I had thought of it.
| woodruffw wrote:
| Very nice! I'm one of those habitual return-pressers, and this
| tool accomplishes the exact same thing but better.
| mbreese wrote:
| Yeah, if I have a stuck output (that doesn't include a date),
| I'll sometimes hit return, and add `# 12/23/24 10:37` and hit
| return again. That way I know when I last looked at it.
|
| This tool might be nicer, but I'm not sure if know when I'd
| need to use it a priori.
| withinboredom wrote:
| At least in zsh, you can do `exec > >(spacer)` but it seems
| to break the tty by stripping control characters from input.
| imp0cat wrote:
| I like to pressing Enter - like an animal -, too! :) It puts
| spaces exactly wheere I want them.
| stavros wrote:
| I love it when someone has a problem I have very often, but they
| have the insight to actually _realize_ that it 's a problem, and
| then do something about it.
| thih9 wrote:
| Says the person who built a website listing games with fair
| pricing[1] and more. You're guilty of that yourself. Much
| appreciated too!
|
| [1]: https://nobsgames.stavros.io/
| stavros wrote:
| Haha, thanks! Yes, sometimes I do it too, but for this
| spacing thing I kept hitting enter and never realized this
| was an actual problem that I could do something about!
|
| Also, I have to say, getting a 3D printer has definitely done
| this for things around the house. Every small niggle that
| used to fly under the radar and tolerated now has a tiny
| plastic thing fixing it once and for all.
| Levitating wrote:
| I am disappointed I couldn't find any of the OPUS games by
| SIGONO on your website. Though I think some (or at least
| OPUS: The Day We Found Earth) were temporarily removed from
| the play store.
| stavros wrote:
| I am disappointed you didn't submit it!
| wruza wrote:
| Realizing is not the hardest part, imo. I avoid publishing my
| little subprojects/libs/funcs simply because of the burden of
| publishing maintenance, and that is before connecting with
| people about issues, frs and so on. Our packaging tradition
| feels more like a marketplace (with all quirks and procedures)
| rather than a place where you can just share code and let
| anyone use it.
| stavros wrote:
| I think that's you. I just dump all my code in the open,
| without feeling any obligation.
| westurner wrote:
| - In Python, Sarge has code to poll stdout and stderr
|
| - Years ago for timesheets, I created a "gap report" that finds
| when the gap between the last dated events exceeds a threshold.
|
| - The vscode terminal indicates which stdout, stderr are from
| which process with a circle .
|
| This says it's "Integrated > Shell Integration: Decorations
| Enabled" to configure the feature;
| https://stackoverflow.com/questions/73242939/vscode-remove-c...
|
| - Are there other shells that indicate which stdout and stderr
| are from which process? What should it do about e.g. reset ANSI
| shell escape sequences?
| Tsiklon wrote:
| As an aside I have foolishly never once thought that you could
| pipe both stdout and stderr to another program at the same time.
| You learn something new each day.
| pixelmonkey wrote:
| I knew you could do that, but never knew you could do it with
| "|&" as a shorthand. TIL!
|
| I found this comment in a bash documentation example to verify:
|
| # To send stderr through a pipe, "|&" was added to Bash 4 as an
| abbreviation for "2>&1 |".
| cmeacham98 wrote:
| Fair warning - this is a bash-ism, so if you're writing a
| script that needs to run on multiple shells and/or a more
| primitive shell, you should avoid it.
| zmw wrote:
| Related shameless plug: I have a small tool that prepends each
| output line with a timestamp (can be absolute, relative, or
| elapsed since last line), might be useful or pair well with this
| tool in similar scenarios (not needed when dealing with already
| timestamped logs, of course).
|
| https://github.com/zmwangx/ets
| fcoury wrote:
| Very useful, thanks for sharing.
| grandchild wrote:
| There is also `ts` from moreutils[0]. One of a few gems there.
| And moreutils is (probably) already in "your" distro.
|
| [0] https://joeyh.name/code/moreutils/
| ievans wrote:
| Looks like the `ets` readme has a direct comparison:
|
| > The purpose of ets is similar to that of moreutils ts(1),
| but ets differentiates itself from similar offerings by
| running commands directly within ptys, hence solving thorny
| issues like pipe buffering and commands disabling color and
| interactive features when detecting a pipe as output. (ets
| does provide a reading-from-stdin mode if you insist.) ets
| also recognizes carriage return as a line seperator, so it
| doesn't choke if your command prints a progress bar. A more
| detailed comparison of ets and ts can be found below.
| ErikBjare wrote:
| Yet another fantastic joeyh project in my toolkit, thanks!
| (git-annex is awesome)
| 3eb7988a1663 wrote:
| This seems great. Unfortunately, I will only recall it exists
| once I am into minute-unknown-but-way-too-long-for-comfort
| while waiting for a command to complete.
|
| Edit: Maybe you should highlight the trailing pipe example (eg
| `ping localhost | grep icmp | ets`)? That is way more
| convenient to use than the introductory samples indicate. Being
| able to slap it onto the end of a pipeline I am developing
| feels less invasive than potentially have to quote my command
| for the sake of a debugging tool.
| pksadiq wrote:
| I wrote a similar tool[0] a few days back because I wanted a
| bit more accuracy with timestamp (to measure CPU/idle time) and
| `ts` occasionally had a deviation of several 10ms. If I knew
| this, and is accurate enough for me, I might not have written
| one.
|
| [0] https://www.sadiqpk.org/projects/tis
| jaimehrubiks wrote:
| I like it! but it would be even better as a shell's plugin maybe?
| croemer wrote:
| When used with Python, it's important to add "PYTHONUNBUFFERED=1"
| env variable for this to work not just in the terminal but also
| when piping to files etc.
| Flimm wrote:
| The environment variable you're thinking of is
| `PYTHONUNBUFFERED`, not `UNBUFFERED` [0]. If you want a generic
| solution to this problem, try the `unbuffer` command [1].
|
| For anyone who's interested, I recommend reading Julia Evan's
| article [2] about this problem and its solutions.
|
| [0]: https://docs.python.org/3/using/cmdline.html#envvar-
| PYTHONUN...
|
| [1]:
| https://manpages.ubuntu.com/manpages/noble/man1/unbuffer.1.h...
|
| [2]: https://jvns.ca/blog/2024/11/29/why-pipes-get-stuck-
| bufferin...
| 3eb7988a1663 wrote:
| The Julia article was a good read. Probably something I run
| into once a year, but glad to have a better understanding of
| it.
| croemer wrote:
| Julia Evan's article is a great write-up indeed, I'll
| submit it as a main link.
|
| It's "Julia's article", not "The Julia article".
|
| Update: it is was on here just a month ago actually:
| https://news.ycombinator.com/item?id=42275033
| Y_Y wrote:
| It's Julia Evans' article, not Julia Evan's.
|
| I don't know if Julia Evan even has an article.
| teo_zero wrote:
| I was taught that the s is omitted after _plural_ nouns,
| not after nouns ending in s.
|
| Julia Evans's house, but the Evans' house.
| Y_Y wrote:
| FWIW, I'd accept either one. Some names don't take an
| extra s by convention, like Jesus, but otherwise it seems
| in practice that names that feel like plurals don't get
| it. I'd write "Jess's" but "Jenkins'".
|
| (I consider myself a follower of Lynne Truss's, and have
| deliberately not considered a grammar reference for this
| answer, as I'm sure this is within the interested
| reader's ability and shan't spoil these readers' fun.)
| croemer wrote:
| Thanks, I forgot about the PYTHON prefix, fixed it.
|
| On MacOS, can install via homebrew's `expect`:
| https://apple.stackexchange.com/a/193152/330523
|
| Apparently I knew about this 2.5 years ago as I commented on
| the accepted answer back then.
| overhead4075 wrote:
| A bit fancier than my awk version awk -W
| interactive 'BEGIN { t = systime(); } { u=systime(); if (u - t >
| 1) { printf("= %s %ds =========\n",strftime("%T"), u - t); };
| print $0; t = u; }'
|
| Or if you want to clear the screen too awk -W
| interactive 'BEGIN { t = systime(); } { u=systime(); if (u - t >
| 1) { printf("\033[2J\033[H= %s %ds =========\n",strftime("%T"), u
| - t); }; print $0; t = u; }'
| Poiesis wrote:
| Just to maybe save someone a couple of seconds of time: the '-W
| interactive' bit is a mawk-specific option (-W is for
| implementation-specific options). Not 100% certain but it looks
| like the gawk default does something similar so no additional
| option is needed, I think.
| renewiltord wrote:
| I also pipe to `ts` and successors since that gives me a running
| timer of when the last thing happened. It's in moreutils.
| hyperpape wrote:
| It really never ceases to amaze me how many basic affordances
| terminals lack, that we hack around with bash configuration or
| helper tools.
|
| Of course, I know it's a genuine hard area, and not one I've put
| any time into fixing, but it's also so high leverage--so many
| developers spend a ton of time in this environment.
| raron wrote:
| KDE's Konsole has a feature to highlight "newly printed lines",
| but no timestamps.
|
| https://askubuntu.com/questions/1467849/what-is-the-bar-on-t...
| wruza wrote:
| I find this bar annoying as hell, tbh, especially in
| interactive modes.
|
| Also Konsole messes up its ansi states all the time. It's the
| only terminal in which I can hit <up>, _sometimes_ see
| "~[[A;" or similar after my prompt, hit <enter> and it
| actually executes the previous command.
| Symbiote wrote:
| Since it's KDE, there's naturally a setting to disable it.
| dv_dt wrote:
| I would love a feature to scroll back to previous input lines,
| I don't think I ever found something that supports it (I
| haven't spent a lot of time searching for it admittedly)
| jandrese wrote:
| Are you asking about something different than up-arrow or the
| 'history' command?
| dv_dt wrote:
| Yes, say you start a command that outputs a long buffer of
| lines, and you want to go back to the early part of that
| output, even better if you could jump back multiple scroll
| buffer points
| jandrese wrote:
| That is generally the responsibility of the terminal, not
| the shell. If your terminal doesn't have a scrollbar try
| hitting "scroll lock" and then moving up and down with
| page up/page down. Some really dumb terminals have no
| scrollback, but most modern ones do.
| dv_dt wrote:
| I may be misunderstanding, I'm not talking about just the
| scrollback buffer (I don't think?), I want to not hunt
| for the line in the buffer and instead jump to the line
| of the last input command in the buffer. The "jumping
| between prompts" mentioned in the other comment is more
| or less that feature - but it seems for that
| implementation you need to customize the prompt with a
| special sequence and have an emulator that supports
| jumping to that seq. I wonder if something like tmux
| would do it w/o customization...
|
| oh maybe
| https://unix.stackexchange.com/questions/226731/jump-to-
| last... hmm - seems like the more searchable term is
| "prompt jumping"
| c-st wrote:
| If I understood you right, some terminal emulators support
| this:
|
| https://codeberg.org/dnkl/foot#jumping-between-prompts
| atombender wrote:
| iTerm on macOS does this. It calls them "marks", and you can
| set them anywhere, but by default it creates a mark for each
| prompt. You can then jump between them with cmd-arrow.
|
| iTerm also suppers showing the timestamp of each line, and it
| visualizes this in a nice way where lines emitted around the
| same time have their timestamps replaced with a vertical
| line.
| ku1ik wrote:
| VSCode terminal also does this I believe.
| cobbaut wrote:
| You mean like tmux or screen? EDIT: apparently not, sorry.
| wakawaka28 wrote:
| Maybe you want this:
| https://github.com/lambdaspace/ShellNotebook Or that prompt
| jumping thing. This isn't something I've looked for either but
| I guess I just got used to the way things are. If I'm running a
| command with long output I usually use a pager, and when I run
| something that takes a long time I usually save the output to a
| file. If it doesn't take long then you can run it again with a
| pager. Scrolling back is not super useful sometimes because
| output can change throughout a session. But it is useful enough
| to think about this problem, I suppose.
| saagarjha wrote:
| I think iTerm does this
| soraminazuki wrote:
| I get the exact opposite impression. The fact that you can
| simply press enter to mark the output is yet another sign of
| how malleable terminal interfaces are. You simply can't do that
| with GUI applications unless the developer created a button
| implementing that specific functionality.
| forrestthewoods wrote:
| It drives me batty that terminals don't have a trivial way to
| "scroll to last command".
| arusahni wrote:
| Some do! For example, I used Wezterm, and it offers that
| capability [1].
|
| [1]:
| https://wezfurlong.org/wezterm/config/lua/keyassignment/Scro...
| jdoss wrote:
| Woah! Thanks for pointing this feature out. This will be
| super handy to skip large amounts of output.
| abathur wrote:
| Terminal.app on macOS can do this with Command + up-arrow.
|
| (IIRC this is technically just a hotkey for navigating marks or
| bookmarks or something, and it (book)marks each command.
| meatmanek wrote:
| iTerm has this if you install the shell integration[1], which
| basically puts an escape code in your PS1 that tells iTerm
| where each command begins and ends.
|
| 1. https://iterm2.com/documentation-shell-integration.html
| oldetimeyunix wrote:
| I find it fascinating what new programmers prioritize. I've been
| developing on Unix and Unix like systems for 40 years and I've
| never needed a solution like this. But for some reason this
| appears to be a banger to some of you. Baffling but fascinating.
| IceDane wrote:
| What is a "need"? I'm sure you can imagine why this could be
| useful. Is this life-changing? Does anyone _need_ it? Probably
| not.
|
| Your comment just makes you come off as some narrow-minded,
| graybeard elitist, and possibly even a little bit dumb, given
| how obvious it is why this could be useful. "New programmers",
| etc. Why not just .. not comment instead? Literally the easiest
| thing in the world for you to do since it requires you to do
| nothing.
| wakawaka28 wrote:
| If he thinks it's silly then he's welcome to say that. If
| someone with a lot of seniority wonders why you think you
| need a tool, maybe that's a hint that it isn't as obviously
| useful as you think. In this case, I get it, but a simple awk
| script can more or less do this work as well IF you think you
| need it.
| quasarj wrote:
| You've never ran tail -f? Curious, what exactly do you do?
| dpc_01234 wrote:
| Next level: Make it a wrapper `spacers ... cmd ...`. This way you
| can allocate PTY, and make the app believe it is still talking to
| the terminal and the use colors and alter its output in more
| fancy ways.
|
| BTW. Somewhat similiar (better sometimes) result can be achieved
| simply with:
|
| (echo "first"; sleep 1; echo "second"; sleep 0.5; echo "third") |
| ts -i "%.S"
|
| 00.000004 first
|
| 00.987787 second
|
| 00.501363 third
| nerflad wrote:
| echo "printf '\n'" >>
| ~/.config/fish/functions/fish_right_prompt.fish....
| n144q wrote:
| I have a similar but different need, wonder if anyone has the
| same frustrations and knows a solution:
|
| I often press enter key a few times to produce a noticeable gap
| between different runs of the same command. Yes, in theory, the
| shell prompt is enough to separate the runs, and I could
| customize the color, font etc, but that's still not as good as a
| few (almost) blank lines.
|
| The workflow is like this: often I need to run a command that
| produces a decent amount of output and repeat that a few times.
| Not 3 lines, not 1k lines, but something like 40-100 lines -- not
| short enough that I can easily see both the beginning and the
| end, not long enough that I have to log it to a file. I want to
| be able to scroll to the top of the output and read it.
|
| The "multiple enter key" approach works well enough, but is a bit
| repetitive and sometimes I forget to do that (then can't find
| where the output begins). I could also append printf "\n\n\n" but
| apparently it's annoying. I wonder if there is something simpler
| and works well. The tool in this article doesn't exactly match my
| need, as it prints a spacer immediately after output pauses, not
| after a command finishes.
| ninkendo wrote:
| macOS's built-in Terminal.app has a feature I love for this,
| which I haven't seen anything else replicate, which is that
| pressing Cmd-Up just scrolls up to the last command prompt in
| your scroll buffer. Just press it as many times as you want to
| find the beginning of previous commands you typed.
|
| I'm not sure how it's implemented... maybe they take note of
| what your prompt looks like and generate a regex for it? Or
| maybe they take note of when the last time it was that your
| shell process had no child processes and read from stdin... but
| it works quite reliably.
| asdff wrote:
| Sometimes its nice to use something like tmux for this. Open a
| new pane for such a run and all output will be in the scroll
| buffer of that one pane.
| Izkata wrote:
| You could temporarily change your prompt:
| export PS1="\n\n\n\n\n\n$PS1"
|
| Or if the repeated prompt is part of your visual pattern
| matching: export PS1="$PS1\n$PS1\n$PS1\n$PS1"
| wruza wrote:
| Or # ~/.bashrc alias p5='printf
| "\n\n\n\n\n"' # run my-command; p5
|
| May also add 100 '-'s before or after newlines for better
| separation.
| Izkata wrote:
| Hmm... this looks like it works, to save in bashrc and
| activate it once: alias p6='export
| PS1="\n\n\n\n\n\n$PS1"' p6 my-command my-
| command
| hnlmorg wrote:
| I'm writing a terminal emulator that solves this (and many
| other) common problems with the CLI. For example, one of its
| features is it highlights command output so you can easily see
| where each commands output is.
|
| You can also collapse output too
|
| https://github.com/lmorg/mxtty
| atombender wrote:
| iTerm on macOS does this. It calls them "marks", and you can
| set them anywhere, but by default it creates a mark for each
| prompt. You can then jump between them with cmd-arrow. iTerm
| also suppers showing the timestamp of each line, and it
| visualizes this in a nice way where lines emitted around the
| same time have their timestamps replaced with a vertical line.
| kps wrote:
| Personally, I have a command called `--` that prints a
| terminal-wide horizontal red line using '-' (U+2501 if HN eats
| it). So I run things like $ --; make noisy-
| build
|
| Then I can see the start easily when scrolling back.
| nuancebydefault wrote:
| As a windows user, the fact that hitting a button immediately
| would reflect inside a running output stream, feels strange.
| But its benefit is clearly shown here.
| ezekg wrote:
| I wasn't aware of |& -- pretty sweet. I always redirected via
| 2>&1 and then piped.
| wruza wrote:
| I often use this technique in my dev debug logs. If the last
| print() was more than a few seconds ago, it also prints "(2.4
| seconds passed)" in gray text before printing another line. This
| helps with visually separating debug requests, button clicks,
| etc.
|
| Mine is not a tool, I just define my log function that tracks
| last call time. const now = Date.now() if
| (now - last_time >= 2000) { console.log(...) }
| last_time = now console.log(...args)
|
| Things like that should be in all dev toolboxes by default, I
| think. It's amazing how we create animated experiences etc for
| users but when it comes to development it's just println(). The
| cobbler's children go barefoot.
| JoBrad wrote:
| Wouldn't putting a \n at the start of PS1 do a similar thing?
| nasretdinov wrote:
| Nice tool, but I agree with other commenters that it needs to be
| implemented at the level of the terminal emulator (which makes it
| much harder to implement). The reasons for this are the
| following:
|
| 1. If a tool outputs escape sequences and expects the cursor to
| be at a certain position, this assumption will break 2. You have
| to not forget to pipe it, which might not always be possible to
| do cleanly 3. Since you're piping the output, many tools will
| stop using colours, etc, which is annoying.
|
| I've tried to make a similar tool, but as a patch to bash (to
| color stderr output), and it had many issues that can't be
| resolved on that level, e.g. many programs assume that stderr and
| stdout point to the same PTY, so they can print some ascii
| sequences to stdout and some to stderr, and expect them to be
| displayed in the correct order. (The article about it, in
| Russian: https://habr.com/ru/articles/207768/)
___________________________________________________________________
(page generated 2024-12-24 23:01 UTC)