The Art of Command Line (2015)
github.com
github.com
Skimming The Grapes of Wrath would be shorter. Thank you, but no thank you.
Let me help you with this:
man -t bash > man.ps && lpr man.ps
Then, grab a coffee, sit in the sun and spent some quality time with your tools. :)It happened to me often enough that even when I knew what I wanted to achieve and which command X could do that I would first try to read darned man page and fail to find the solution, but then just googling gave enough of material to
a) have something to try
b) have a discussion of the cases where that "something" doesn't fulfill the use most use cases of those who asked (the "natural need") including, of course, the use case I've had.
I have a completely opposite attitude. Bash is horrible on many levels. Bash man page is only a part of horribleness.
The main problem for all man pages is that they are mostly as if written for those who already know about every unnecessary detail of both the tool in question and all related tools or environmental issues, but who searches for some even more obscure detail among all obscure details that they already know.
Not to mention the descriptions that aren't: e.g. the complete explanation of the option --frob-blonk FILE would be something like "this option uses the FILE as the frob blonk" oh, how helpful.
I use bash every day, but I've at least managed to reduce its use to the minimum that keeps me still sane.
There are too many developers who rely only on Google/Stack Overflow to find and write answers to questions, and it's common to repeat bad, incomplete, or outdated information. I can think of a lot of times when the most accepted SO answer for many questions was "copy and paste this gigantic block of code" instead of using an existing command.
I'm sure even most of the readers here can't give a one line answer what is the "right" and "general" way to preset a darn variable for a shell. By design of all these artifacts we work with, it necessarily leads to a page-length discussion of which shells exist and what their differences are and whatnot. Such a waste of everybody's mental energy on a global level.
Files like .bash_profile, .bash_login, .profile, .zprofile, /etc/profile, /etc/profile.d/whatever.sh all serve the same purpose, the primary aspect of which is to apply things like environment variables at login. Display managers and [login] shells source these things in a predictable precedence order so that environment variables are correctly inherited by children of GUI environment processes and login shells.
Login shells? Well yeah, the point of a login shell is that it invokes login-related tasks like setting environment variables from a profile. That's intentionally separate from the behavior of interactive shells because the environments of interactive shells may have been modified intentionally and shouldn't be "reset" to the values applied at login.
edit: also .inputrc is the readline configuration file for things like shortcut keys in all programs which use readline (not just bash) and .bashrc is for customizations specific to interactive shells
And your explanation what the differences are is for me still circular, exactly like in the man pages: login shell is the one which invokes login-related tasks, and I should care about the difference from the interactive shells. I still have no idea what that even means, it is what exactly happens when?
Anybody knows some sane explanation of these? I admit I never tried to find it, as I tried to read the man pages, didn't find anything reasonable, but knew that it doesn't matter to me. I just want the darn variables to exists whenever I need them. I don't care about the differences. One single place is enough.
But now that you say that you "do understand these mechanisms without evicting too much from" your "brain cache" I'd really like to learn everything about the differences. Specifically, when is one invoked and when another for the user "acqq", let's say, on a default Ubuntu system, and on a default Red Hat system?
Are really more different user shells invoked in different forms for a single user, on a single machine, between the booting of the machine, logging in (in GUI) and then starting a few times the terminal with shell inside? When is invoked and which is invoked when? And why shouldn't be a single place for the variables I want to define? No idea, but I would be grateful to read about it now. Thanks in advance.
PAM uses /etc/environment, and systemd would prefer to have you set up default environment variables in /etc/systemd/system.conf. You can even pass them directly to Linux from your bootloader (unrecognized arguments on the kernel command line in the form foo=bar become environment variables), but the profiles are the generally accepted way of doing it.
I'm happy to read more expansive pages in my own time but when I'm 'in the zone' as it were, the last thing I want to do is read through why something works. Perhaps it's a gap in the market? Or more likely I'm in the minority!
When you don't know what to look for, it is not as simple as "looking something up".
(And I too actually consider awk much simpler than e.g. bash)
It's actually 78 pages on my system (Debian, bash 4.4.12).
I've heard that OpenBSD has the best man pages that are more pleasant to read and more informative/concise.
https://www.facebook.com/permalink.php?story_fbid=2110408722...
† Anyone else here that remembers the days when man pages and Windows help files used to be referred to as online documentation? As opposed to printed manuals.
From `man wc`
WC(1) BSD General Commands Manual
WC(1)
NAME
wc -- word, line, character, and byte count
When in actuality `wc` outputs lines, words bytes ...I mean, strictly speaking, the name field doesn’t document the output, but having those aligned makes the documentation much easier to read.
IME it’s easier to focus when reading printed documentation. One can jot down notes and no temptation to go and reload Facebook/Twitter/etc. I haven’t done it often, but some commands are really worth knowing inside and out.
man --html=calibre bash lpr <(man -t bash)
See: https://unix.stackexchange.com/a/64011 function pman() {
man -t ${1} | open -f -a /Applications/Preview.app
}m, a Unix shell utility to save cleaned-up man pages as text:
https://jugad2.blogspot.com/2017/03/m-unix-shell-utility-to-...
Edit: Also check out the stuff about the word mu in the latter part of the post :)
:r !man bash | col -b
the col utility will strip backspace characters with the -b switch (along with reverse line feeds).It uses col, but also redirects the cleaned-up output to a file named cmd.m (so you don't have to run that man command for the same command - like bash or other - each time), where cmd is the cmd you give to man as an arg. That file cmd.m is stored under your ~/man dir, which gets created first, with mkdir -p. More refinements possible, of course, but this was just a quick and dirty script I whipped up. For example, could check more for permission and other kinds of errors, not create the ~/man dir each time but only once, etc.
export MANPAGER="/bin/sh -c \"col -b | vim -c 'set ft=man ts=8 nomod nolist nonu noma' -\"" sudo apt install -y bash-doc && lpr /usr/share/doc/bash-doc/bashref.pdf
178 pages of awesome.Too often, the solution of some is only to throw more hardware at the problem.
Saying "it's an unfortunate fact of life that programming is tied to computers" is as weird as saying "it's unfortunate that being a car mechanic is tied to cars". The job exists because of computers and cars - not in spite of it.
If you wanted a problem solving or engineering job that wasn't tied to computers then there are other options, like a mechanic, electrical engineer, mathmatition or working in any of the numerous fields of science. But a the end of the day, you're still going to need to understand the core principles of that field if you want to be effective in it.
The command line is just a UI like any other - GUIs included. The way modern computers work is via API/ABI calls; via kernel syscalls and drivers separating out the responsibility of peripherals. Your command line is just an interface for managing applications that are compiled against libraries that interface with those syscalls - so in that regard using the CLI isn't any different to launching an application via a graphical icon running on a typical WIMP interface. In either case you're not making those API calls from the CLI, you're not manually managing your memory nor any of the important things that an OS does under the hood. All you're doing is using a text interface to fork() a process rather than using a mouse click to fork() a process. The difference being many CLI tools require their config supplied as command line arguments while many GUI tools don't. But even there, there are as many exceptions to that rule as there are examples of it.
I said no such thing. My point was that, if one wants to program computers, I would think one would want to be good at their job and delve deep into how their code makes computers do what they do. Showing no interest in learning the command line or the shell makes me question their interest and desire.
https://www.tldp.org/LDP/abs/html/
(as a pdf: http://tldp.org/LDP/abs/abs-guide.pdf )
>file> fish: Expected a command, but instead found a redirection
>fileLearning the fundamentals of your tools is a...fundamental of doing this job. If you don't want to know how your tools work, I question one's competence or desire to do this job.
> If you don't want to know how your tools work, I question one's competence or desire to do this job.
I in turn question one's competence when, instead of getting the job done, hours upon hours are spent on irrelevant parts of configuration or getting some ideal solution to work where something less elegant would perfectly suffice. Unfortunately, the folks insisting on 'mastering' ones tools tend to often be in that category.
As an analogy: I don't care if the craftsmen that fixes my house uses his hammer holding it upside down. I only care that my house is properly fixed and stays so. How that was achieved, I could not care less about.
If one doesn't care that the carpenter building his house is using a hammer upside down, that's a whole 'nother bunch of issues I won't go into here.
I'd love to see at least a small allusion to what nature the issues are made of. Because, to iterate, I'd rather have a well-built house build by an absolutely unconventially working carpenter than a mediocre house build by someone that knows how to use a hammer according to the textbook.
If I want to see nice processes and fantasies fulfilled, I watch movies. In real life, I care about results.
An apt comparison might be Jimmy Hendrix playing a right-handed guitar left-handed (i.e. upside-down) and still producing master pieces.
~240 pages for man bash
Google says the grapes of wrath has 464 pages.
I call that a similar ballpark. If I had an English exam with Steinbeck as one of the set texts just once I would read every word of it. I have a shell exam every damn day I work rest and play. Do you? Is skimming seeming more reasonable in that light?
Huh?! Unlikely?!
they're very rare but do exist.
But that is entirely besides the point. The parent was outraged how developers are unlikely to use only simple text editors. And the phrase he was taking an issues with didn't say that emacs is a simple editor either. So you're either willingly misinterpreting everything or just unable to read and understand simple sentences.
By any other meaning, emacs and vim wouldn't qualify.
An editor like Vim or Emacs ia great because eventually
_the editor adapts itself to the programmer and not the other way around_.
Every other configuration of Emacs and Vim have been different, suiting the programmer writing it. People have distros of Emacs/Vim
- Doom - Spacemacs - NeoVim
Etc.
I agree. nonetheless, most developers use IDEs. This in turn means that a developer is unlikely to use only simple editors.
Maybe actually read the comment chain you're responding to?
1: https://insights.stackoverflow.com/survey/2018#technology-_-...
VSCode, Visual Studio, Intellij may be fighting for mindshare on laptops, but if you ssh into a server, I bet you're using vim.
I mean, sometimes I run vim in the integrated terminal in VSCode. :) Whatever is quicker/handy. I know I answered that question with "VSCode, Sublime, Emacs, and Vim".
(I've got 10+ years of experience in software development and I just can't get to grips with it, at best I can do basic operations in Vim (for git). Looked at emacs the other day but I need to read a lot of manuals and tutorials and practice to get to grips with it)
I'm currently using VS Code, before that it's been IDEA, Atom for a little while (but it was slow), Sublime Text (I still miss it), and much longer ago, notepad++ and eclipse. (the folder I have all my code in is still called "workspace").
Yes, well, see what happens? Every time fads change or new languages appear, you have to change your editors. What if you could have just one editor for everything? For text files and taking notes, for all the programming languages in the world that you just learn once and learn it well, and be done with it. No more need for new editors.
It was the built-in tutorial that got me started. One just needs to type C-h t and then you’re good! Each to their own but that has suited me well at least.
As long as our hypothetical Blub programmer is looking down the power continuum, he knows he's looking down. Languages less powerful than Blub are obviously less powerful, because they're missing some feature he's used to. But when our hypothetical Blub programmer looks in the other direction, up the power continuum, he doesn't realize he's looking up. What he sees are merely weird languages. He probably considers them about equivalent in power to Blub, but with all this other hairy stuff thrown in as well. Blub is good enough for him, because he thinks in Blub.
Emacs is not just a code editor. It will change the way you approach programming. As long as you don't understand it you might (rightfully, I guess) compare it to just "another text editor, only with these weird commands". Some of the stuff that Emacs can do and the way it integrates into your daily activities, cannot be seen in other text editors, so you're not even expecting such benefits from the other tools or realize that they exist out there, in the wild.
This is the most pretentious nonsense I've ever read. Writing code is writing code. God could create for you the most perfect IDE to ever exist, with every feature you know you want, and every feature that you don't yet know you want. Tailored exactly to your needs. But at the end of the day, you're just going to sit down and write code in it.
All I see when I look at people who endlessly tinker with their setup, are people who are spending time things that aren't providing aren't providing value to their customers. I've worked with quite a few emacs wizards. Do they write better code than me? Some do, some don't. It doesn't seem to related to their use of emacs though. Are they more efficient than me? Some are, some aren't. Did they all spend a lot more time than I did to learn how to use their text editor? Yes. Did they all have to tinker with their text editor a lot more than I did to get it working the way they want it? Yes. Have I ever had a problem that I wouldn't have had if I'd invested all the time required to master emacs? No.
Once you get used to that model of using a computer, it feels crippling to use applications that you can't easily program in on the fly. It's the difference between having a full programming language and a bunch of buttons you can press, and it's for something you're going to be doing a lot for a long time.
Funnily enough, that's how I feel about Lisp itself: I love having a language I can program at runtime, at compile-time, at read-time (and, in a decent editor, at edit-time).
It really makes me wish that there were a decent modern Lisp OS. It'd need some solution to run Firefox and emulate emacs. Maybe when I retire I'll devote my remaining years to that.
Are they really wizards then? :^)
Same with the LISPs (which Blub is about btw) - Some LISP programs become unmantainable for people that did not write it, but without a doubt, LISP is one of, if not the most expressive language there is.
My recommendation: Go with spacemacs. It is perfect for people who just want to use the goodness of emacs without it weird edges and spending hours on configuration. One day I might switch to emacs, but for the coming time I am perfectly happy with using a pre-configured emacs. The time I don't spent working, I'd rather read more papers and do non-compsci-stuff.
Not one in my team use an IDE because they die merely trying to index everything. Everyone uses a simple editor of choice: Emacs, Vim, VS Code and Notepad++ are the popular choices. Everyone has at least two Bash/CMD instances open.
The systems programming world is a different one unlike the web programming world where everything is small and self contained for an IDE and GUI.
That being said, my most used is probably either regular Notepad or Notepad++ in a Windows env.
Vim with cscope/ctags is the best of both worlds. Index your project once -- no penalty when building. Symbolic searching is a must have on any large code base (declaration, usage, etc).
As an example: https://bedtools.readthedocs.io/en/latest/
But there are also many people who use Common Workflow Language (https://www.commonwl.org/) for this purpose.
CWL allows for workflow portability between execution engines. The open source engine my team creates (Arvados - https://arvados.org) is ideal for large-scale processing work.
We store, process and manage petabytes of genome data with it, and execute workflows that span hundreds of simultaneous compute nodes.
Does your lab work well with 2-3 people being able to set up the data processing for the rest of the team?
Learning the unix commandline is considerable effort and requires regular practice. Instead of learning bash, biologists could spend their time reading relevant papers in their specialization or brush up on statistics.
Those people who know their stuff aren't doing that job because they have their own data to deal with. There are people with 10,000 line proteomics outputs who manually search for missing entries. There is at least one student with single cell RNAseq data which she can't even look at (never heard of fastqc or the LESS command). It is frankly disasterous.
I figured maybe other fields have the issue too and I got it together enough to out out my first and only ebook on the topic. It's higher level than OP here, but still focuses mostly on the command line. Anyway, it's called Digital Superpowers and is $10. If anyone wants a preview chapter or anything I can send you one.
Search for eternal bash history and set it up once. I can point out its usefulness more.
It's worth doing, purely for the enlightenment of freeing you from the busted, "macho" notion that a GUI is inferior to a command line. GUIs are awesome.
(I actually made a proof-of-concept tool called 0rk which displays the images in the terminal https://github.com/follower/0rk so you don't even have to leave your terminal to look something up.)
There's also the TLDR pages project which aims to create "Simplified and community-driven man pages" with practical examples which looks like a helpful approach: https://tldr.sh/
Not sure if any of the TLDR clients already do this but it just occurred to me it'd be cool to be able to view an example and then edit it directly...
https://news.ycombinator.com/item?id=9720813
(Provided for interest purposes, not suggesting it's a dupe - https://news.ycombinator.com/newsfaq.html)
https://developer.ibm.com/articles/au-unixtext/
After years of using bits of bash I've found quite a few new things for me.
https://pubs.opengroup.org/onlinepubs/007904875/utilities/xc...
For whatever reason, programmers tend to be rather dismissive of non-general-purpose programming languages, or more generally languages that do not work like conventional general-purpose languages, and refuse to learn them. I think the worst case we see of this is with CSS, where people come up with elaborate ways to place boxes procedurally in javascript (and JS once suffered from being considered a toy language, too), but I've seen similar attitudes get pointed at things like apache configuration, systemd unit files, jq, and Lua.
(On the other end, sometimes people believe that they're just writing configuration, and that this is somehow more maintainable than writing code, when really they're writing code embedded in a data description language; see Chef, Ansible &c.)
As for autotools, autoconf's "Portable Shell Programming" document covers seriously ancient shells. New programs following those guidelines aren't trying to stay compatible: their code isn't going to compile on the relics that run those shells without active effort that generally isn't happening. It's just a cargo cult.
Also, would suggest mentioning gitbash in the Windows section. You get it for free with git so it's easy to come by, even in corporate environments where obtaining permission to install software is hard. If combined with something like ConEmu, it's actually pretty nice.
curl cheat.sh/<command>
was a thing. All these years.... $ whois cheat.sh | grep 'Creation Date'
Creation Date: 2017-04-16T13:42:06Z
Not that many years.I find the choice of the word "obscure" a bit amusing, given that this section lists many commands used ona daily basis by thousands of syadmins.
Never again!
Use xonch at least.
Yep, learned that the hard way
If you're just picking it up, check it out.
It's less likely you'll "master" a terminal emulator. (Other than figuring out settings where the defaults get in your way of using it).
Most of it works just the same.