[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)