[HN Gopher] The growth of command line options, 1979-Present (2020)
       ___________________________________________________________________
        
       The growth of command line options, 1979-Present (2020)
        
       Author : intrepidhero
       Score  : 130 points
       Date   : 2021-12-15 16:22 UTC (6 hours ago)
        
 (HTM) web link (danluu.com)
 (TXT) w3m dump (danluu.com)
        
       | woodruffw wrote:
       | Maybe it's because I'm not the biggest Unix purist, but I don't
       | really mind the proliferation of command line options. The two
       | things that _do_ irk me are:
       | 
       | * Using short options in scripts. Scripts should almost always
       | use long options. As a corollary, tools should _always_ provide
       | long options _unless_ the tool isn 't intended for scripting.
       | 
       | * Lack of discoverability. We still don't have a standard way to
       | ask an arbitrary tool which flags it supports, or for a rough
       | semantic mapping of those flags (e.g. the classic -v/-V verbose
       | and version confusion). Developing a standard here would go a
       | long way towards automating things like tab completion without
       | each tool needing to maintain _N_ scripts for _N_ shells or
       | having its own slightly-different `--completions=SHELL`
       | generator.
        
         | Symmetry wrote:
         | For tab completion the fish shell just parses the man pages,
         | which are fairly standard, to figure out what tab completions
         | are available.
        
           | RMPR wrote:
           | I also used to think that, but it seems like the advanced
           | parsing is done manually[0]
           | 
           | 0: https://news.ycombinator.com/item?id=29343053
        
         | nauticacom wrote:
         | The last point would be amazing, imo. It's unfortunate that,
         | because of history, commands accept and parse arbitrary strings
         | as input instead of formally specifying it like a function
         | signature + docblock. If I could rewrite the universe, commands
         | would use a central API for specifying the names, data types,
         | descriptions, etc. for all the input they take. In our
         | timeline, maybe some file format could be standardized that
         | describes the particular inputs and options a command takes,
         | and e.g. shells would hook into it. Kind of like header files,
         | but distributed either in a community repository or by each of
         | the tools themselves.
        
           | useerup wrote:
           | > ... commands accept and parse arbitrary strings as input
           | instead of formally specifying it like a function signature +
           | docblock. If I could rewrite the universe, commands would use
           | a central API for specifying the names, data types,
           | descriptions, etc. for all the input they take
           | 
           | Which is _exactly_ what powershell does: Commands in
           | powershell (called  "cmdlets") are like functions with type
           | hints. A command does not parse the input strings itself,
           | rather it exposes this type information to the shell. The
           | shell is the one responsible for discovering the parameters
           | (and types) and parsing the command line parameters and
           | coercing types before passing them (strongly typed) to the
           | actual command.
           | 
           | This means that the information about parameter names and
           | types is readily available for doc-generation, auto tab-
           | completion and language servers which allow syntax
           | highlighting, completion etc to work even inside editors such
           | as vscode or emacs.
           | 
           | The point is that to specify a cmdket you _must_ declare
           | parameters, in much the same way that for a function in a
           | programming language to accept parameters it must declare
           | those as formal parameters.
        
           | kaetemi wrote:
           | Sounds a bit like PowerShell.
        
           | woodruffw wrote:
           | Yeah, the inertia is the real killer here. I'd love to see a
           | fully embedded solution (particularly given that ecosystems
           | like Go and Rust discourage sidecar files like manpages), but
           | thus far the only one I've really seen is individual tools
           | supporting a `--completions=SHELL` style argument that spits
           | out an `eval`-able script for the requested shell.
           | 
           | The real dream would be some kind of standard way for a
           | program to indicate that it's opting into more intelligent
           | CLI handling _without_ any execution. I 've thought about
           | trying to hack something like that together with a custom ELF
           | section, but that wouldn't fly for programs written in
           | scripting languages.
        
         | laurent123456 wrote:
         | > Using short options in scripts
         | 
         | And documentation, or when answering questions. SE answers are
         | often like "just type `blah -jraiorjg` and you're done", which
         | means having to look up all these options in the manual. Short
         | options should be the exception, when working in the shell
         | mostly, not the rule.
        
           | citrin_ru wrote:
           | Re-typing commands from SE answers without consulting a man
           | is a bad idea even with long options. SE is a good place when
           | you don't know where to start or which man to read, but once
           | you see an answer it is better to check in mans/docs how
           | suggested command would work and what it will do. But I agree
           | that if you want to help someone who doesn't know particular
           | command it is better to use long options.
        
       | hulitu wrote:
       | > Ironically, one of the reasons for the rise in the number of
       | command line options is another McIlroy dictum, "Write programs
       | to handle text streams, because that is a universal interface"
       | (see ls for one example of this).
       | 
       | That is unfortunately not the reason. There are 2 main reasons
       | why today (GNU) command line utilities have a lot of options: 1).
       | GNU. Apparrently they like to add features to programs 2).
       | Herritage of SYSV/BSD. Traditionally BSD options were different
       | from SYSV and the new GNU utilities were made to understand both.
        
         | fsckboy wrote:
         | > _1). GNU. Apparrently they like to add features to programs_
         | 
         | unix comes out of "worse is better". GNU comes out of The Right
         | Thing.
        
         | seoaeu wrote:
         | Adding features isn't itself a bad thing. But when you cannot
         | iterate or remove features (even the smallest change to
         | existing functionality could break a script somewhere!) then
         | you end up with the jumbled mess we have.
        
         | avgcorrection wrote:
         | I don't see an argument from you that (1) _wasn't_ caused by
         | the point that Luu raises.
         | 
         | It's not strange to end up adding features to programs if the
         | effective IPC is so impoverished that you would need to
         | sandwich a bunch of repetitive formatting commands if you
         | _didn't_ add some convenient built-in formatting options.
        
       | munificent wrote:
       | Two of the many joys in life are:
       | 
       | 1. Having a problem and solving it with a small amount of effort.
       | 
       | 2. Having a mental model of some external thing and delighting in
       | seeing that your model is accurate with respect to the actual
       | thing.
       | 
       | Elegant, minimal systems excel at providing #2. Big sprawling
       | systems with lots of options and special cases excel at providing
       | #1.
       | 
       | Many software engineers seem to be calibrated to extract a lot
       | more joy from experiencing #2 than #1. It's probably something to
       | do with the nature of the work. We work "backwards" by having a
       | mental model of a thing we wish existed and then bring it into
       | being. If we didn't find deep satisfaction in harmony between our
       | mental model and software model, we wouldn't have the drive to
       | keep fixing all of the bugs in our software.
       | 
       | But there is nothing _instrinsically_ superior to the joy of #2
       | compared to #1. It 's just a psychological/emotional preference.
       | Many people, if not most, outside of the world of software
       | engineering seem to prefer #1. They just like to get stuff done
       | and make stuff happening. You rarely see woodworkers lamenting
       | about the variety of clamps, jigs, and tools they have. Instead,
       | they delight in finding just the right specific tool to make a
       | job easy. Fishermen love their tackleboxes.
       | 
       | Of course, there is an appreciation of #2 in all of us, and you
       | see minimalism everywhere. But I've never seen it raised to such
       | a religious, moral level as I see in software engineering. It's
       | important to remember that that's a psychological choice we're
       | making--a personal preference we impose--and not something
       | fundamental to systems.
        
         | avgcorrection wrote:
         | This is very insightful.
         | 
         | Number 1 can be efficient but it isn't satisfying if it was
         | taken straight from a cookbook.
         | 
         | > But there is nothing instrinsically superior to the joy of #2
         | compared to #1. It's just a psychological/emotional preference.
         | 
         | I'm not sure about that. Feeling mastery and competence is
         | intrinsically rewarding. And that's easier to achieve with
         | point number 2; if your mental model aligns more with the real
         | thing then you are less likely to make mistakes and to have to
         | look up reference material--you are less likely to get
         | estranged from the task at hand.[1] And you are less likely to
         | be bewildered by all the apparent complexity that surrounds you
         | and that the sage old ones just tell you to put up with and to
         | not question. I don't think you would even mind being less
         | efficient as long as you are in that sweet groove of point
         | number two.
         | 
         | [1]: Modernity + alienation: efficient misery.
        
           | andy_ppp wrote:
           | Yes, the things we derive satisfaction from are because of
           | our ability to slot things into a preexisting framework,
           | proving our opinions correct (which we all love to happen)
           | and releasing dopamine (probably). There is no such thing
           | from applying a specific special case from a piece of
           | software.
        
             | avgcorrection wrote:
             | I guess you could put it like that.
        
           | munificent wrote:
           | _> Number 1 can be efficient but it isn't satisfying if it
           | was taken straight from a cookbook._
           | 
           | That may be true to one degree or another for you, but isn't
           | universal. I also prefer to understand solutions (why pick #1
           | or #2 when you can have both?), but I have certainly been
           | happy to see a problem evaporate even if I'm not 100% certain
           | why. The result has its own value.
           | 
           |  _> I'm not sure about that. Feeling mastery and competence
           | is intrinsically rewarding._
           | 
           | Yes, we all experience #2. My point is just that it's not
           | intrinsically superior to other sources of joy. Preferring it
           | is just that, a preference. There's nothing morally wrong
           | with people who prefer to simply get things done, nor is
           | there something fundamentally flawed with complex software
           | that caters to that.
        
         | albertzeyer wrote:
         | Out of my experience, #2 is often superior over #1 though.
         | 
         | For some limited well understood context, well defined
         | application, well defined task which will not be extended later
         | and only lots of variations are needed, then yes, #1 is
         | probably better. It's nice to have options like
         | enable_fancy_feature=True.
         | 
         | However, in practice, you often have none of these. The context
         | is often not well defined. It's often not yet well understood.
         | The application is not well defined, neither the specific
         | tasks. The scope and tasks will likely be extended during the
         | development.
         | 
         | In that case, it can often turn out that you made the wrong
         | abstractions, wrong options in case of #1. The software itself
         | becomes more and more complex and becomes very hard to
         | maintain, and new things which should be simple are now
         | difficult to do because of too much interdependencies.
         | 
         | Now, an elegant minimal system, or collections of small
         | building blocks or tools, will turn out to be much more
         | effective in solving some new task later on.
        
         | wyager wrote:
         | > Big sprawling systems with lots of options and special cases
         | excel at providing #1.
         | 
         | This is the sales pitch, but in reality you spend so much time
         | configuring and debugging that you rarely actually save any
         | time.
        
           | munificent wrote:
           | _> in reality you spend so much time configuring and
           | debugging that you rarely actually save any time. _
           | 
           | Conversely, that's the sales pitch for minimalism. But the
           | reality is that well-intentioned, thoughtful designers and
           | users seem to end up spending most of their time building and
           | using systems with a lot of complexity. If it really ended up
           | costing them more time to use those systems, it begs the
           | question of why we keep building them.
        
       | marttt wrote:
       | Interesting table. One more column would be great, though: number
       | of flags for all these commands in Plan 9 or 9front.
        
       | pif wrote:
       | Nothing more than a load of garbage.
        
         | simiones wrote:
         | The article, or the growing command line options list?
        
           | munk-a wrote:
           | The comment since it lacks any context and presents nothing
           | but a vague opinion. It's actually a recursive comment
           | because the poster heard that programmers love recursion.
        
       | WalterBright wrote:
       | Every command line switch is a bug.
        
         | WalterBright wrote:
         | Far too often, when people cannot agree on how a program should
         | work, the "solution" is to add a switch and so avoid making a
         | decision.
        
           | z3t4 wrote:
           | A better option is to create a common library and then make
           | many programs
        
           | kelnos wrote:
           | Or the program should legitimately work in both ways, at
           | different times, depending on context and the user's current
           | needs. Sometimes I want `ls -t`, sometimes I want `ls -S` and
           | sometimes I just want plain `ls`. It would be silly to make
           | them three different programs, and if those options didn't
           | exist, that would be foolish.
           | 
           | Sure, you could say that `ls -t` should be `ls | sort
           | --time`, and if command output was structured rather than
           | just text, and standardized, that would work and be easy to
           | implement in a cross-tool manner. But now we have `sort
           | --time`, which is _also_ an option that you say shouldn 't
           | exist. So now what? `ls | timesort` and `ls | sizesort`?
           | That's just silly.
           | 
           | Ok, how about something that doesn't affect _how_ the output
           | is presented, but _what_ output is presented. Most of the
           | time I just want `ls`, but sometimes I want to see dotfiles,
           | so I have `ls -a`. How do we fix that? `ls` and `lshidden`?
           | Again: silly. Do we just say  "dotfiles are stupid; we
           | shouldn't have this artificial concept of hidden files"? No,
           | that's silly too.
           | 
           | I get that your follow-up post softens the absolutism with
           | "far too often", but your original post did assert that
           | "every" command line option is a bug, and I'm tired of this
           | "options are bad" argument. Overall I would rather have the
           | option to change behavior than not. Take those options away,
           | and we get complaints that the maintainers are dumbing things
           | down and removing choice.
           | 
           | It's really a no-win situation: either your software is
           | bloated, or it's not flexible enough. Few people agree on
           | where the happy medium is. Discussions about this are, IMO,
           | just tiring and pointless, and are some of the worst forms of
           | bike-shedding. The only reason a potentially-useful option
           | should be removed (or not added in the first place) is if the
           | option creates a maintenance burden that the maintainer is
           | not comfortable taking on.
        
             | WalterBright wrote:
             | > but your original post did assert that "every" command
             | line option is a bug, and I'm tired of this "options are
             | bad" argument.
             | 
             | Every option doubles the amount of testing required to
             | exhaustively test the program. This soon reaches the level
             | of impossibility. My point is to encourage people to take a
             | hard look at the options and consider redesigns and
             | specification changes to eliminate as many as one can.
             | 
             | The same applies to `if` statements in code. Finding ways
             | to change the data structures and program logic to
             | eliminate edge cases and the `if` cases is a significant
             | goal of mine.
             | 
             | It also applies to compiler warnings. In the case of C, the
             | warnings are there because the C Standard allows practices
             | that are known to cause many problems, but the C compiler
             | vendor has to compile them anyway, and so choose to make
             | them warnings. But for a newer language, the warnings come
             | about because the language designer did not design the
             | language rules well enough.
        
               | bcbrown wrote:
               | > Every option doubles the amount of testing required to
               | exhaustively test the program.
               | 
               | True, but pairwise-independent combinatorial testing
               | provides almost-exhaustive coverage with non-exponential
               | growth in test cases: https://github.com/microsoft/pict
        
             | useerup wrote:
             | `ls | sort --time` is very close to `ls | sort
             | LastWriteTime` which is how you would do it in PowerShell.
             | 
             | In PowerShell `ls` is only used for retrieving the
             | filesystem objects (files and directories). It does not
             | have options for sorting or formatting[1]
             | 
             | Sorting is generally handled by `sort` (alias for the Sort-
             | Object cmdlet).
             | 
             | Formatting is generally handled by one of the format
             | commands, like format-table (alias `ft`) or format-list
             | (alias `fl`) or by converting into another format like e.g.
             | json or xml through `convertto-json`.
             | 
             | I.e. if I want to display the full path of every file
             | sorted by descending by last access, I would write:
             | ls | sort -d LastAccessTime | select fullname
             | 
             | [1] except for the `-name` switch which is more of an
             | optimization which only retrieves the local name as string
             | objects.
        
       | marcodiego wrote:
       | A graphic showing this growth would be super interesting.
        
       | 908B64B197 wrote:
       | With Python installed everywhere I often question the logic
       | behind writing long or non-trivial shell scripts.
       | 
       | It always seems so brittle since the output of a command line
       | tool can change (unless it's frozen in some standard) and relies
       | way too much on regex and assumptions about what the data
       | returned will look like. I much prefer to keep bash around only
       | for interactive commands and ad-hoc one-liners.
        
       | kjellsbells wrote:
       | Some observations:                 - Tool options increasing
       | monotonically seems like the very definition of bloat. Probably
       | since the marginal cost of adding an option is very low and the
       | cost of removing an option is very high (angry users).       -
       | There's a cognitive cost to bloat.  Personally, I know maybe 5-10
       | options to all the commands in the regular *nix tool set and
       | that's about the limit my brain could hold.       - Options are
       | useless if they are not discoverable at lower mental effort than
       | the alternatives. Man/info pages are great, but I'm not wading
       | through multiple pages on the off chance that ls has an option
       | that can output in JSON if it's a Wednesday and my POSIX locale
       | is unset.  Discoverability is a serious problem in large systems,
       | and I'm not sure anyone knows what the solution is. I mean, we've
       | had google, Stack Overflow, man X intro, GNU info, ...
       | 
       | So what does that mean in practice? Is there a way to square
       | modernity with the UNIX philosophy? I would suggest that
       | 1. Tool authors ruthlessly restrict options to fit in the working
       | set memory of the average human user. Let's say <10 options.  If
       | you need more options, you need a new tool.       2. Tools are
       | pluggable, so that the base implementation is simple and known-
       | to-be-present (shades of POSIX here), but that there is a
       | expansion pack mechanism for people who need it.  Imagine DLC for
       | ls.  You want extra magicka in your find(1)?  Make sure you have
       | the plugin and off you go.       3. Tools designers and users are
       | clear about the decision criteria to *not\* use a specific tool.
       | Sure I could do crypto in awk, or parse \0 in ls, but I shouldn't
       | do so.  There's no shame in reaching for a better solution, and,
       | over time, solutions will coalesce into new tools.  For example,
       | everyone uses jq not awk to parse their JSON...right?
       | 
       | Edit: I just returned from my kitchen with a IRL example: my
       | dishwasher has 15 programs but only two buttons show any sign of
       | wear: "quick wash" and "start"...
        
       | intrepidhero wrote:
       | This got linked in another front page story. Uncomfortable Truths
       | in Software Engineering.
       | 
       | > The Unix philosophy of "do one thing well" doesn't actually
       | work that well. Dan Luu explains this better than I could.
       | 
       | Usually The Unix Philosophy gets nothing but praise in these
       | parts so I was interested to see a counterpoint.
        
         | xxpor wrote:
         | I mean the empirical evidence alone seems point at the Unix
         | Philosophy not actually being popular in practice. GNU tools
         | are much more widely used on boxes humans interact with than
         | BSD/busybox. You don't see everyone trying to figure out how to
         | install all of the suckless tools immediately after installing
         | linux, etc. And then of course we get into systemd and that
         | whole ball of wax.
         | 
         | I do think there's a growing split between server like things
         | and desktop like systems that people actually regularly use.
         | For example, Alpine is super popular in containers, not so much
         | on desktops. Same thing with Busybox, but that's more
         | explicitly meant for embedded envs.
        
           | throw10920 wrote:
           | > I mean the empirical evidence alone seems point at the Unix
           | Philosophy not actually being popular in practice. GNU tools
           | are much more widely used on boxes humans interact with than
           | BSD/busybox.
           | 
           | I think that I can present an even better piece of empirical
           | evidence (not to diminish the poignancy of your own):
           | 
           | Almost no large or successful piece of software is composed
           | of Unix command-line utilities.
           | 
           | Firefox, Linux, gcc, Visual Studio Code, Windows, Chrome,
           | Google services, Discord, Spotify, Blender, GIMP, Apache,
           | Slack, Office, Steam, Matrix/Element...almost every single
           | non-trivial piece of software in existence is _not_ composed
           | out of Unix shell utility pipelines.
           | 
           | "Do one thing well" allows you to do one thing well,
           | tautologically - but it doesn't allow you to do many things
           | well. The fact that Unix utilities compose at a very
           | superficial level is irrelevant, because the use of text as
           | an interchange format is such a heart-stoppingly bad idea
           | (consider a programming language where the only type is a
           | string - you wanna write a web server in that?) that it
           | renders Unix tools near-useless for building larger tools (as
           | evidenced by the fact that nothing is made with them), and
           | only useful for immediate interactive use, and building small
           | scripts with (that would already be better served by a real
           | programming language).
           | 
           | The Unix Philosophy is self-contradictory. "Do one thing
           | well" is meant to enable composition, for building larger
           | programs - but "Text is the universal interface" is in direct
           | opposition to building larger programs. But, because tools
           | are only supposed to do one thing well, they're feature-
           | impoverished and not very useful on their own, so you have to
           | compose them. You're screwed either way.
        
             | jmfldn wrote:
             | Shell programming through small cli tools was never meant
             | to scale into massive complex software so you're comparing
             | apples and bananas.
             | 
             | Do one thing well and text as the universal interface works
             | well in the small for parsing files, doing sys admin tasks,
             | gluing a few things together. That's what it's intended
             | for. It's obviously the wrong tool to build a system in.
             | Used in the right context they compose beautifully.
        
             | PaulDavisThe1st wrote:
             | > Firefox, Linux, gcc, Visual Studio Code, Windows, Chrome,
             | Google services, Discord, Spotify, Blender, GIMP, Apache,
             | Slack, Office, Steam, Matrix/Element...almost every single
             | non-trivial piece of software in existence is not composed
             | out of Unix shell utility pipelines.
             | 
             | All true.
             | 
             | However, the development environment (and frequently the
             | build systems) used for all of the above are likely
             | substantially composed out of Unix shell utilities and
             | pipelines, aided by very unix-y tools such as Perl or awk.
             | 
             | That says something, I think. Just not sure what.
        
             | citrin_ru wrote:
             | > use of text as an interchange format is such a heart-
             | stoppingly bad idea ... consider a programming language
             | where the only type is a string
             | 
             | Posix shell is a programming language where the only type
             | is a string. Text as an interchange format works reasonably
             | well in practice for a wide range of tasks.
             | 
             | To me shell, easy to combine unix commands and text as
             | interchange is a clear example of New Jersey style from
             | "Worse is better" [1] and their critique comes mostly from
             | followers of MIT/Stanford style.
             | 
             | In my carrier I wrote hundreds of small shell scripts which
             | use unix commands and text as an an interchange format.
             | Yes, I see that some bugs can be prevented/detected by
             | using something more strongly typed than shell, but all my
             | scripts worked reliably enough and didn't suffer from any
             | significant bugs so why bother? (disclaimer: I'm old
             | fashioned and like to read man pages; I imagine shell can
             | be full of traps if you ignore documentation and use only
             | trail and error approach or practice stackoverflow driven
             | development).
             | 
             | Of course for large projects and even some small ones other
             | tools/languages fit better than shell but shell have its
             | niche.
             | 
             | [1] https://en.wikipedia.org/wiki/Worse_is_better
        
             | rustyminnow wrote:
             | Different tools serve different purposes. Just because you
             | wouldn't write a web browser/server/IDE/OS in a shell
             | scripting language doesn't mean they don't have value or
             | are failed paradigms.
             | 
             | I've written tons of shell scripts for one-off jobs or
             | simple work that would've taken 2, 3, maybe 4 times the
             | amount the time to write in a "real" programming language.
             | (E.g. throwaway code to generate 10,000 test files that are
             | slightly different would take me 5-10 minutes in bash, but
             | maybe half an hour in node or python.)
             | 
             | Passing around strings isn't the BEST paradigm but it's
             | extremely flexible when you need flexibility. There are
             | times when you need something more solid and that's fine
             | too.
             | 
             | And fwiw I'd bet a majority of the software you listed uses
             | bash somewhere in either their build process or SAAS stack.
        
           | bch wrote:
           | > GNU tools are much more widely used on boxes humans
           | interact with than BSD/busybox. You don't see everyone trying
           | to figure out how to install all of the suckless tools
           | immediately after installing linux, etc.
           | 
           | Or perhaps those BSDers, suckless tool users, etc get setup
           | and quietly just get to work. I feel that's plausible.
           | 
           | I think you're right re: server/desktop split, which decades
           | ago might have been hard to tell apart. Is desktop-computing
           | and some loud but ignorant (of Unix) majority directing the
           | future of Unix down the garden path or are the
           | traditionalists out of touch and just yelling at clouds and
           | kids to stay off their lawn?
           | 
           | I fall into the traditionalist camp - I think the Unix that
           | got us here is Good and to know it is to love it.
           | 
           | I think pushing back against complexity is (and has been for
           | a long time) an additional challenge for BSD/Linux, besides
           | it's primary role of being a great compute environment. The
           | BSDs have done marvellously here.
           | 
           | > I mean the empirical evidence alone seems point at the Unix
           | Philosophy not actually being popular in practice.
           | 
           | I'm worried this is polling 100 people off the street about
           | how they care for their kitchen knives and trying to tie that
           | back to Michelin Star restaurant kitchens. I don't know...
        
           | wyager wrote:
           | Software popularity is almost always a historical accident
           | rather than a reflection of users' preferences.
        
             | ReleaseCandidat wrote:
             | Almost nobody used the original Unix-tools on any Unix
             | (like Irix, Solaris, AIX, HP-UX and Tru64). Everybody
             | installed the GNU tools, that's why after some time every
             | vendor shipped them with their Unix as add-on disks.
        
             | xxpor wrote:
             | Kind of hard to separate cause and effect there. Why does
             | my dad prefer Windows? He's used it for 30 years and he's
             | used to it. If he switched to Ubuntu, would he prefer that?
             | Perhaps, but there's a lot of stuff to learn. So he prefers
             | Windows, in some sense.
        
               | traviscj wrote:
               | I have the same problem with textmate :-(
        
               | johnisgood wrote:
               | I think for a large number of people it would make no
               | difference as they are in the browser at all times, or
               | the software they use on the daily is available for
               | Linux, too.
        
         | the_af wrote:
         | > The Unix philosophy of "do one thing well" doesn't actually
         | work that well. Dan Luu explains this better than I could.
         | 
         | That quote from the Uncomfortable Truths article is strange
         | because Dan Luu doesn't explain that "it doesn't actually work
         | well". He just explains that the philosophy is not consistently
         | followed, but he is not unhappy with it.
        
           | MisterTea wrote:
           | > He just explains that the philosophy is not consistently
           | followed, but he is not unhappy with it.
           | 
           | Which is exactly the reason for the glut of command line
           | options.
           | 
           | A great example of following Unix philosophy using a more
           | recent example is the ssh client on plan 9. It is split into
           | three separate programs each with their own man page: ssh(1)
           | for terminal access, sshfs(4) for mounting a remote file
           | tree, and sshnet(4) which imports a remote machines tcp
           | stack. Keep it simple, stupid.
        
         | AceJohnny2 wrote:
         | Rob Pike, one of Unix's co-creators, and owner of quite a sharp
         | tongue, put it best in a Slashdot interview:
         | 
         |  _" Those days [of the Unix Philosophy] are dead and gone, and
         | the eulogy was delivered by Perl."_
         | 
         | https://interviews.slashdot.org/story/04/10/18/1153211/rob-p...
        
           | fsckboy wrote:
           | ok sure, but unix is still here and perl died
           | 
           | there's a subtle thing about perl that's not mentioned often,
           | which is how it borrowed ideas from many other tools and that
           | made perl "intuitive" to learn for people who knew the other
           | tools. But once you're embedded in just perl for awhile, you
           | forget the other tools and then perl's grab-bag of borrowed
           | ideas becomes sort of burdensome, it loses "intuitiveness".
        
         | avgcorrection wrote:
         | Usually both the Unix Philosophy gets uncritical praise _and_
         | many people complain about how unstructured shell application
         | data is. The great thing about this essay is that it connects
         | the two dots and finally concludes that "do one thing well" and
         | "text is the universal interface" go together like oil and
         | water.
        
         | BrazzVuvuzela wrote:
         | In years past, some Unix utilities used to do things like
         | silently truncating long lines that were too long for the
         | static buffers used by those tools. The GNU Coding Standards
         | document (originally written in the early 90s I believe)
         | specifically says not to do things like this (GNU's Not Unix,
         | after all..)
         | 
         | > _For example, Unix programs often have static tables or
         | fixed-size strings, which make for arbitrary limits; use
         | dynamic allocation instead._
         | 
         | > _Avoid arbitrary limits on the length or number of any data
         | structure, including file names, lines, files, and symbols, by
         | allocating all data structures dynamically. In most Unix
         | utilities, "long lines are silently truncated". This is not
         | acceptable in a GNU utility._
         | 
         | https://www.gnu.org/prep/standards/standards.html
        
         | ReleaseCandidat wrote:
         | The 'Unix Haters Book' has some too:
         | 
         | https://web.mit.edu/~simsong/www/ugh.pdf
        
           | marcodiego wrote:
           | The UHHB has very few points that are still valid. It is a
           | humorous piece and was written about 3 decades ago. We
           | shouldn't continue citing it as valid criticism.
        
             | ReleaseCandidat wrote:
             | > The UHHB has very few points that are still valid.
             | 
             | I disagree. Yes, nobody uses sendmail anymore, filesystems
             | vastly improved and X isn't a resource hog any more. I've
             | reread it some months ago and the main points still hold.
             | 
             | For example the part about `kill`:                   Most
             | operating systems have a "kill" command. So does Unix. In
             | most operating systems, the kill command kills a process.
             | The Unix         implementation is much more general: the
             | "kill" command sends a         process a message. This
             | illustrates the first Unix design principle:         * Give
             | the user power by making operations fully general.
             | The kill command is very powerful; it lets you send all
             | sorts of messages to          processes. For example, one
             | message you can send to a process tells it to          kill
             | itself. This message is -9. -9 is, of course, the
             | largest single-digit message, which illustrates another
             | important         Unix design principle:         * Choose
             | simple names that reflect function.
        
               | monroeclinton wrote:
               | I don't find the argument about kill convincing. You can
               | use `kill pid` and it will send a SIGTERM signal to the
               | process. The -9 option is only necessary when you want to
               | send a SIGKILL signal. I don't think it is a bad thing
               | that kill gives users the option to choose which signal
               | to send. I only use the -9 option when I want to
               | terminate a process without it being handled.
        
               | Athas wrote:
               | While I agree that there's much of the UHHB that is still
               | valid (and what's not valid is still funny), I don't
               | think that's a good example. Modern kill allows you to
               | provide the signal name if you wish. I don't think it's a
               | particularly good criticism of kill that it also allows
               | you to use a numeric shorthand if you wish (even if that
               | shorthand is very popular).
               | 
               | I think the UUHB is mostly worth reading to understand
               | the absolutely _dismal_ state of proprietary Unix in the
               | 90s. It explains why technical reasons contributed to the
               | growth of both Windows NT and GNU.
        
       | tra3 wrote:
       | Interesting article, but I don't see how the increase in number
       | of arguments invalidates the "do one thing well".
       | 
       | Sure ls has a 58 (!) arguments but it's still a tool to list
       | files ultimately.
       | 
       | > I've heard people say that there isn't really any alternative
       | to this kind of complexity for command line tools, but people who
       | say that have never really tried the alternative, something like
       | PowerShell.
       | 
       | I've spent a lot of time passing around JSON and XML, not the
       | same but similar. While it's true that structured data makes
       | things easier, it's not without it's own faults.
       | 
       | I subscribe to unix philosophy of "do one thing well" and pass
       | text around because it's served me well. You have to question
       | status quo to come up with something new and better, but so far
       | I'm not seeing it.
        
         | useerup wrote:
         | > Sure ls has a 58 (!) arguments but it's still a tool to list
         | files ultimately.
         | 
         | No, it has evolved into a tool to get files/directories of a
         | directory _and_ sort them _and_ format them.
         | 
         | Powershell separates those. `ls` in Powershell gets filesystem
         | objects. It does not have any of the nix craziness for
         | controlling the output and sorting, yet it is possible to do
         | the exact same thing by piping output from ls into a format-
         | command like format-table(ft), format-list(fl) or even
         | convertto-json
        
       | AtlasBarfed wrote:
       | AND YET LS STILL IS NOT RELIABLY PARSEABLE
       | 
       | And yet there aren't --json (and/or --yaml) universal output
       | option flags to structure your data in a reliably parseable
       | format.
       | 
       | Shouldn't every option for a major UNIX command (insert your
       | definition for major) have an extensive list of useful
       | examples/use cases? Man still fails me here. As does the AWS CLI
       | too as a side complaint. If your option is important and useful,
       | then it demands a good example.
        
         | shatteredgate wrote:
         | It doesn't really make sense to have unix commands output json
         | or yaml. They're already doing a form of parsing internally,
         | you're then asking them to encode the output in another text
         | format so you can parse it again. Why? You'd have better
         | results just using the underlying API to get a list of files,
         | and this is what every other program that needs to get a list
         | of files actually does. From a scripting perspective this is
         | one of the things that powershell actually got right.
        
           | AtlasBarfed wrote:
           | well, because, ls, lsblk, ps, and a host of other table-based
           | outputs aren't reliably parseable. Their columns overflow.
           | They aren't durable to line breaks in indentifiers and other
           | UTF8 and control character oddities.
           | 
           | You know what is? A decent data output format. And JSON is
           | the best of the compromises that exist now. YAML would be
           | nice because if you are outputting json, yaml output is easy
           | and it's a bit more readable.
           | 
           | That doesn't violate the UNIX philosophy of text output. It
           | probably improves it.
           | 
           | Underlying APIs aren't as universal, portable, or well-known.
           | We are talking basically GNU cross-platform programs.
        
             | shatteredgate wrote:
             | But you don't actually want to parse them though, that's
             | the mechanism by which you receive the data but the real
             | end goal is you just want the data in its canonical format
             | so it can used programmatically; in powershell there is no
             | parsing, the output _is_ always the canonical
             | representation.
             | 
             | I don't get what you meant in the last sentence, the
             | underlying API is glibc which is also cross platform and is
             | incredibly well known. Other cross-platform languages like
             | Java, Golang, Rust, etc have their own portable APIs to
             | enumerate directories that are cross platform.
        
         | munk-a wrote:
         | I read in an article (this one - joke) that all lower case
         | letters except `jvyz` are in use - it looks like `-j` and `-y`
         | are just sitting there waiting for someone to add some output
         | formats - then we just need to add a verbose flag and... maybe
         | a switch that automatically gzips the output? We're so close to
         | the 100% completion achievement - we can get there in our
         | lifetimes.
        
         | justinsaccount wrote:
         | Something like https://github.com/Juniper/libxo is probably the
         | best bet for non-powershell, non-python like things to ever be
         | properly parseable.
        
       | dang wrote:
       | Discussed at the time (of the article):
       | 
       |  _The growth of command-line options, 1979-Present_ -
       | https://news.ycombinator.com/item?id=22473821 - March 2020 (171
       | comments)
        
       | mjw1007 wrote:
       | A gentle suggestion for bloggers: if you're going to write an
       | article with a title like "The growth of command line options,
       | 1979-Present", please also arrange to prominently display the
       | date of composition.
        
         | ghaff wrote:
         | Really, any blog post should have a prominent date on it. For a
         | lot of things, it's essential context. Older posts _can_ be
         | useful /interesting but they can also be pretty much completely
         | useless depending upon the topic.
        
         | bo1024 wrote:
         | Every article (really, every thing) posted on the web should be
         | timestamped.
        
         | pugworthy wrote:
         | March 2020 for those of you who just had to find out after
         | reading this comment.
        
           | HotHotLava wrote:
           | > The latest year in the table is 2017 because I wrote the
           | first draft for this post in 2017 and didn't get around to
           | cleaning it up until 2020.
        
       ___________________________________________________________________
       (page generated 2021-12-15 23:00 UTC)