[HN Gopher] The useful use of cat
___________________________________________________________________
The useful use of cat
Author : LorenDB
Score : 55 points
Date : 2024-10-20 12:33 UTC (10 hours ago)
(HTM) web link (mrmr.io)
(TXT) w3m dump (mrmr.io)
| ttyprintk wrote:
| A better example is 'pv -l'. Seeing cat in a heavily-used
| pipeline means pv is not available.
| terminalbraid wrote:
| My main use of cat is for clipboard pasting (if I can't leverage
| pbpaste or something more appropriate). If I want to get
| something into a file or get into a pipe as stdin `cat > file` or
| `cat | cmd`, paste, then end with cmd-D to send an EOF and
| terminate the cat. For files it circumvents "helpful" formatting
| you would get pasting into an editor.
| codesnik wrote:
| if you're on os x, you can also do pbpaste >
| file
|
| and if you're using zsh, just > file
|
| is sufficient, without cat
| fifilura wrote:
| "A la test driven development. "
|
| I would not call that test driven development (where are the
| testcases?)
|
| Rather more like REPL driven programming.
| delichon wrote:
| Whether there are formal examples or not, the thing you're
| doing during REPL driven programming is _testing_. It 's just
| rapid, iterative and informal.
| bityard wrote:
| TDD refers to a specific kind of testing methodology, not
| just any and all testing. Manual testing is not TDD.
| wwalexander wrote:
| You can still just begin with <somefile instead of cat somefile
| |. Does it really matter? No, but I don't think pointing out
| useful and concise built-ins is necessarily asinine.
| jchw wrote:
| Yeah, there are still some edge cases where cat is useful, but
| more often than not I just begin the redirection. I reckon some
| don't realize you can put it at the beginning, which does
| sometimes feel more ergonomic in a pipeline.
| JoshTriplett wrote:
| It's not that it feels awkward to write the redirection
| first. It's that it feels awkward to write `< file cmd`, with
| no operator between the filename and the command, and the
| redirection operator not pointing at the command.
| kortilla wrote:
| A pipeline without pipes connecting is just a field of shit
| AStonesThrow wrote:
| No, in ordinary usage it doesn't matter, and it's not like I
| would go out of my way to change someone else's script code.
|
| But if teaching or demonstrating shell features, I'd say that
| it's important to know that redirection is the most efficient,
| explicit, and available method.
|
| Indeed, a student could learn "cat file | ..." as a standard
| idiom and never use an initial redirect, but what happens when
| they come across one "in the wild"? They should know its proper
| interpretation, because it can otherwise be a bit jarring to
| see and difficult to interpret.
| kelnos wrote:
| Can you? In bash I end up with no input at all if I start the
| line with '<somefile'.
| echoangle wrote:
| > Because for me it'd only be a local maxima.
|
| Nitpick: this should be ,,maximum", maxima is the plural.
| smitty1e wrote:
| Note the 'local'. If the output has several humps, multiple
| minima/maxima are possible.
| zahlman wrote:
| Yes, but "it" and "a" in the original sentence are singular.
| Arcuru wrote:
| Using `cat file.txt | ...` has always felt more natural to me, so
| I still use it.
|
| If I need to build a long command I've been using the excellent
| `up` tool to do it, e.g. `cat file.txt | up`
|
| https://github.com/akavel/up
| REDS1736 wrote:
| Wow that looks amazing, thanks for telling me about this!
| sim7c00 wrote:
| cat all the things. i cat | grep and im not ashamed of it! cat |
| less - why not.? its not going to melt my pc more or less if i
| cat | more | less...
| moffkalast wrote:
| It's the cat's meow!
| tptacek wrote:
| Does anyone take the "don't use cat" stuff seriously?
| tux3 wrote:
| Well, this is the internet!
|
| We had just gotten over tabs vs spaces after barely a thousand
| years of noticing the other side is _objectively wrong_.
|
| Something new that you're definitely doing wrong to blog and
| argue and bicker about; it can't be helped!
| jonjonsonjr wrote:
| I tend to agree with this sentiment but this year I came across
| two situations where the use of cat is actually harmful and not
| just useless:
| https://github.com/jonjohnsonjr/til/blob/main/post/readat.md...
|
| I still instinctively start my pipelines with cat half the
| time, but now I have complicated feelings about it.
| rzzzt wrote:
| ShellCheck does (did): https://www.shellcheck.net/wiki/SC2002
| Ferret7446 wrote:
| It's more of a symptom of someone who doesn't understand what's
| actually going on, i.e. cargo cult scripting.
|
| Specifically, it indicates some combination of:
|
| 1. isn't aware of processes/pipes
|
| 2. isn't aware of cat's "primary" functionality
|
| 3. isn't aware of shell input redirection
|
| 4. isn't aware that shell input redirection can be put before
| the command
| cybrox wrote:
| 90% of the time, I care more about someone like that
| understanding my script than the tiny performance impact of
| an extra process or 'misusing' a function.
| PLenz wrote:
| I honestly use tac more then cat
| yjftsjthsd-h wrote:
| I'm not sure I have _ever_ used tac for real. Could you give an
| example?
| chgs wrote:
| Reading a log file from most recent entry for example
|
| Cat *log|grep error|tac for example
|
| Tail -500 log | tac
| sgarland wrote:
| When you want to tail a file, but you want it in descending
| order and you're not sure how much of it you want:
| tac file | less
| yjftsjthsd-h wrote:
| I guess the difference is that I expect things to read top
| to bottom, so I'd do that as less foo.log
| G
| sgarland wrote:
| Fair enough, if that's how you want it to read. less on
| its own is certainly quite capable.
| shaftoe444 wrote:
| In my experience it's best to do cat file | tac
| sgarland wrote:
| Why?
| cocodill wrote:
| and a cat is also good against mice
| kelnos wrote:
| People who get up in arms about "useless" uses of cat need to
| chill out. I read my pipelines left to right. Using a '<'
| redirection to pull the data in _after_ the command means I have
| to swap my reading direction back and forth, and why bother with
| that? I have better things to do with my brain energy.
| bloppe wrote:
| As others have mentioned, you can put `<` anywhere in the
| command, including at the very beginning. But, I agree that
| getting up in arms about this is really dumb.
| codesnik wrote:
| if you prefer to use cat just to read your pipeline from left to
| right, you can just start your command with file redirection. It
| doesn't have to be at the end of the command.
| <file grep something | do something else ...
|
| this works in bash too, but if you're using zsh, there're a
| couple of nice shortcuts <file
|
| on it's own works as more file
|
| and > file ... ... ^D
|
| allows you to put something into the file quickly without firing
| up the editor. Though > file << end ...
| end
|
| will give you nicer line editing experience.
|
| more zsh redirection tricks here:
| https://zsh.sourceforge.io/Doc/Release/Redirection.html#Mult...
| globular-toast wrote:
| If I saw <file grep ...
|
| It would give me pause. If I saw cat file |
| grep ...
|
| I would understand it instantly, as would any other Unix user.
| Therefore the latter is better code.
| CBLT wrote:
| I don't feel <file is obscure. I've seen shell in that style
| from coworkers and from open source. Your value judgement
| against it might just be your experience, rather than
| something universal.
| sgarland wrote:
| Or just use grep <pattern> file?
| zahlman wrote:
| `<file` at the start might not be _idiomatic_ , but when I
| see it I think it makes perfect sense. It puts the pipeline
| "in order", starting with redirection from the input (and
| presumably ending with redirection to the output, if not
| stdout).
| chgs wrote:
| Or you could just use cat
| mingus88 wrote:
| Coward, use `tail -c +0` like the rest of us useless command
| cowboys
| globular-toast wrote:
| cat concatenates files together. I often use it for that. Who
| cares if "files" is just one file? Using cat regardless keeps
| things uniform. I like it. People who get funny about it are just
| trying to be clever. Yes I know there are other ways to do it.
| But you understood what cat did, otherwise you wouldn't have
| commented on it.
| Svoka wrote:
| literally what cat stands for. conCATenate.
| x3n0ph3n3 wrote:
| cat | sudo tee somefile > /dev/null
|
| is still my favorite way to paste text into an ssh session and
| save it to a protected file.
| pbaam wrote:
| The cat command can be omitted there, as tee reads from
| standard input by default, even if stdin points to a terminal.
| I was going to comment an actually useful (and unavoidable in
| bash) use of cat and ssh, which is to do do nothing with
| standard input and redirect it to a file: <file
| ssh 'cat >file'
|
| And you could just use scp, but I've found clients and servers
| with the SFTP subsystem disabled.
| its-summertime wrote:
| The underlying topic for this is that, most shells treat
| files/redirections as part of the individual commands and not
| part of the pipelines. Files should be sometimes treated as
| commands instead, they plug into the fds of a process the same
| way as commands do.
|
| `cat x | head` attaches `cat x`'s stdout to `head`'s stdin, `< x
| head` just attaches `x`'s fd to stdin. In this way, treating a
| file like a "light-weight" command (light-weight because no
| backing process) makes more sense, `open x | head` perhaps
|
| Though I will note that, in a way, bash supports this, as it has
| a modules system, and one of the pre-existing modules in the
| source tree is a `cat` replacement, through my lack of
| understanding of C prevents me from working out if its optimal
|
| https://git.savannah.gnu.org/cgit/bash.git/tree/examples/loa...
| rolfan wrote:
| From the file you linked, the built-in just copies the input
| files one by one, sequentially, into stdin. All done in chunks
| of 4096 bytes, a common page size.
|
| Is it as optimal as just attaching the file descriptor? No,
| because you will have to pipe the contents. Is it optimal (or
| at least optimal enough)? Considering how pipes work, yes.
| js2 wrote:
| > Some people insist that we should never use a cat
|
| Rather, people argue against useless use of cat, which is
| different. Personally, I'd never argue against it on the command-
| line even though some do. It's once you commit your pipeline to a
| script where you may as well remove it.
|
| There are also suitable uses of cat that I don't think anyone
| would argue against. Besides the obvious use of outputting one or
| more files, it's also often used with here docs.
| userbinator wrote:
| The logic of the author's argument seems rather convoluted. To
| me, cat or not is a simple decision: does the first useful
| command in the pipeline accept input from a file, or only stdin?
| smitty1e wrote:
| I'm a believer in the ditt-k-pow, DTTCPW, the Dumbest Thing That
| Could Possibly Work.
|
| What, exactly, are the arguments against `cat`?
| cybrox wrote:
| The argument is that it's redundant because 'cat f | head' does
| the same as 'head f'
|
| I don't mind either way but I find starting with a cat and
| reading LTR to be very easy to understand.
___________________________________________________________________
(page generated 2024-10-20 23:02 UTC)