7 ms·
Can someone explain the misuse of cat, which bat solves?
by wodenokoto 7y ago
Can someone explain the misuse of cat, which bat solves?
- spoiler 7y agoI guess they just meant it as in "reading code," when in fact bat is better tool just for reading code.
- saagarjha 7y agoUsing cat to catenate a file to standard input isn't misuse, but it looks like bat performs syntax highlighting.
- deleted 7y ago[deleted]
- jhbadger 7y agoThey are referring to using cat to print out a file to the terminal. I'm not sure that's a "misuse", but personally I've never done it, using "more" or "less" instead. "bat" really is a replacement for more/less, only with additional features such as syntax highlighting in source code.
- johnisgood 7y agoI use: cless() { pygmentize -O style=<style> "$1" 2>/dev/null | less } I have programs that depend on pygmentize so I am not sure I will use bat anytime soon when I already have pygmentize and less, or at least not for it having syntax highlighting.
- pcr910303 7y agoThat use is the exact reason why LESSPIPE exists, check out man less & https://www-zeuthen.desy.de/~friebel/unix/lesspipe.html https://www-zeuthen.desy.de/~friebel/unix/lesspipe.html
- johnisgood 7y agoMaybe, but I already had pygmentize, I already had less, and this small function took me less than 10 seconds to type in and start using immediately (and I use a particular style that pygmentize provides so that is a plus). :P In any case, thanks for sharing.
- pcr910303 7y agoOh, I forgot to mention that LESSPIPE is a mechanism to automatically pipe the contents of a file when opening in less, and that the linked LESSPIPE script has an option to use pigmentize for syntax highlighting. It’s a tool for enhancing less & pygmentize, not replacing them. Well, just providing info for everyone. I’m not trying to force you using that script :-)
- johnisgood 7y ago> Well, just providing info for everyone. I’m not trying to force you using that script :-) Yeah of course, sorry, I admit my comment did seem defensive! Thank you for sharing, really. :)
- saagarjha 7y agoI just use nano -v.
- arundelo 7y agoI guess the author was thinking of how cat's original purpose is to concatenate multiple files, not show just one file. (But I certainly don't think using cat in the latter way is a misuse.) There's also a commonly noted "unnecessary use of cat" where people do this: cat file.txt | grep foo instead of this: <file.txt grep.foo but that's not relevant to bat (which can be used unnecessarily in the same way).
- weaksauce 7y agoOr ‘grep foo file.txt’
- Zhyl 7y agoWhat's the name of the bash feature with the '<' before the filename? I want to read the docs on it but I don't even know what to search for.
- detaro 7y agoinput redirection: https://www.tldp.org/LDP/abs/html/io-redirection.html https://www.tldp.org/LDP/abs/html/io-redirection.html
- yesenadam 7y agoGoogle "UUOC" - it's famous. Edit: Sorry downvoter, thought I was being helpful - no-one mentioned the acronym yet. There's a lot online about it, more than I'm qualified to explain. Entertaining reading too. I remember reading about the UUOC Awards years ago..
- deleted 7y ago[deleted]
- pdkl95 7y agoSimply using cat to dump a single file to STDOUT is technically a misuse because cat is theoretically intended to concatenate files. This 'misuse' is 'solved' by bat because bat seems to be primarily intended for its syntax highlighting and git-related features; according to bat's docs, cat-style concatenation of files is intended for drop-in compatibility with traditional cat. That said, the idea that using cat to show a single file is "misusing" cat is prescriptivist rules-lawyering. There is no technical reason against using cat for non-concatenation purposes. The descriptivist interpretation of cat says using the tool for non-concatenation purposes is fine, since that's how people are actually using it. However, note that cat is often misused as a substitute for STDIN redirection: # this creates an extra process that wastes # time copying STDIN to STDOUT cat "${inputfile}" | do_stuff # just connect inputfile directly to STDIN do_stuff <"${inputfile}" # or if you want to keep the input # at the start of the pipeline <"${inputfile}" do_stuff
- eurg 7y agoCatting a file will your terminal make interpret escape codes in the file. For instance: $ echo -e "\033]0;${USER} is an unfriendly person\007" > test-file.txt Then, many days later: $ cat test-file.txt will change your terminal title. With less, you _can_ interpret escape codes, but usually you don't, and I consider this the correct default.
- tazard 7y agoThat's a surprising and interesting bit if knowledge, thanks
- joosters 7y ago'less -R' is useful because it will honour colour control codes while escaping other ones (like title changes, terminal bell, etc)
- ISL 7y agoTried it -- didn't work. Single-quoting didn't work either. Terminal is urxvt. What is clear is that $ cat test-file.txt does not print the initially-echoed text, but it is escaped and up to nefarious tasks.
- eurg 7y agoThe escape sequence is terminal specific. urxvt is likely different from xterm in this regard.
- enriquto 7y agoin your example it is not cat who "interprets" the escapes, but echo
- eurg 7y agoNeither one interprets the sequence, but cat will print the file unfiltered to stdout, and stdout is processed by your terminal, and then the terminal will interpret it. less filters before printing to the terminal.