...making Linux just a little more fun!

Ten Things I Dislike About Linux

By Henry Grebler

I've written about things that irritate me in Bill's platforms. Here, to show that I can be an equal-opportunity disparager/disdainer/curmudgeon, are 10 things I dislike about Linux.

First, some ground rules. I'm not impressed by the argument, "But that's how $PLATFORM does it" (where $PLATFORM is some other platform). And, if your friend Jeffrey jumped off a cliff would you follow him?

LG is about

...making Linux just a little more fun!

and I claim that the things I'm grumbling about diminish the fun I get out of Linux.

	- I don't think I can get her to do it.
	- You mean it'll be difficult.
	- Very.
	- Well, this is not Mission Difficult, Mr. Hunt, it's Mission
	  Impossible. Difficult should be a walk in the park for you.

	-- Mission: Impossible II 

Sure, some of the things I grumble about will be difficult to change. But some wouldn't be so difficult. What did JFK say about that?

	[We do these things], not because they are easy, but because
	they are hard, because that goal will serve to organize and
	measure the best of our energies and skills, ...

		-- John F. Kennedy, "We Choose to Go to the Moon" 
		Delivered at Rice University in Houston, Texas on 12 September 1962.

Clearly, I subscribe to the notion that difficulty should not prevent us from attempting to make things better.

Please don't say the GNU software is not Linux. If that's your argument, then read the title of this article as Ten Things I Dislike About GNU/Linux.

So here, in no particular order are ten things I dislike about Linux.

1. Silly restrictions

    mkdir /tmp/example
    cd /tmp/example
    rmdir .

    rmdir: .: Invalid argument

But "rmdir ../example" is OK. You know what I mean. Just do it.

Ben Okopnik reminded me of:

    cp /tmp/foo             # Isn't it bloody OBVIOUS? Copy it *here*!

especially since

    ln -s /tmp/foo

does exactly the corresponding task.

2. Backward compatibility

There are countless examples. Here are a few:

The glibc fiasco. The C compiler disaster. Dynamic libraries in general. Every new version of emacs.

    When you upgrade to Emacs 22 from a previous version, some
    older versions of external Lisp packages are known to behave
    badly. So in general, it is recommended that you upgrade to
    the latest versions of any external Lisp packages that you are

    The following input methods were removed in Emacs 22.2, but
    this was not advertised...

Compare that with FreeBSD:

	In most cases a package created for an older version of
	FreeBSD can be installed and used on a newer system without
	difficulty since binary backward compatibility across major
	releases is enabled by default.

3. Multiple distros

Are they really necessary? Fedora is not Ubuntu's primary enemy. Surely that role ought to be reserved for Microsoft. In the meantime, Bill has an army of technical people all marching to the beat of a single drummer, while every 2 or 3 Open Source people are creating their own separate orchestra. There is one Microsoft, one Apple and countless flavours of Linux.

In my opinion, FreeBSD gets the balance just about right. Very little is forced upon the user. The range of packages is huge. There is a single (default) structure or framework with which all packages have to comply. But, within the framework there is ample opportunity to satisfy almost every conceivable whim.

FreeBSD is far from perfect; I might write about that one day, but this is a Linux forum.

4. Too many desktop producers trying to emulate the offerings from Bill

I don't do Windows. There are many reasons, but one of them is look and feel. The way Windows does many things messes with my head. I could go on at length - I have in the past. But this article is about Linux.

All I'm trying to suggest is that Linux does many (most) things really really well. Let's celebrate those things and let's celebrate the difference.

5. Uninterruptible commands

There are various examples, but I'll use network file systems.

You NFS-mount a disk on a remote system, e.g.

    mount tsf2:/spare /p6/spare

For some reason, the remote machine is inaccessible; perhaps the network is down, perhaps the machine has halted.

You now issue a df command (because you weren't concentrating):

    df -h
Filesystem                         Size     Used    Avail Use% Mounted
/dev/hdc9                          4.6G     4.3G      67M  99% /
/dev/hdc2                           97M      16M      76M  17% /boot
tmpfs                              363M        0     363M   0% /dev/shm
/dev/hdc7                           20G      16G     3.4G  83% /home
/dev/hdc8                          7.4G     851M     6.2G  12% /opt

... and then the session just hangs. You can't use any key to regain control. In such situations, when I've SSHed into a machine, I often find it quicker to go


to abort the entire ssh session and SSH back in, rather than wait for the df command to return control to me.

You are supposed to be able to use one of ^C or ^\ but often both are powerless. Sometimes ^Z works (followed by something like "kill %1"); but that's unnecessarily obscure, and it doesn't always work.

Surely you can create a command that means "I understand the consequences, just do it." (Or even "hang the consequences, just do it.") In effect, I've shown that disconnecting the SSH session achieves the required result. Just give me a keystroke to do it.

Also, of course, shutting down the machine seems to make all sorts of magic possible. It's just that shutting down the machine is somewhat drastic.

6. Network file systems

This applies to both NFS and Samba.

    # umount /mnt/tsf500/C
umount: /mnt/tsf500/C: device is busy
umount: /mnt/tsf500/C: device is busy
    umount -f /mnt/tsf500/C
umount2: Device or resource busy
umount: /mnt/tsf500/C: device is busy
umount2: Device or resource busy
umount: /mnt/tsf500/C: device is busy

I'm the !@#$%^&* human.

However, I have learnt about the "-l" option:

       -l     Lazy unmount. Detach the filesystem from the filesystem  
              hierarchy now, and cleanup all references to the filesystem
              as soon as it is not busy anymore.

It's not perfect, but it is better.

6. Memory handling

My example here is Firefox. I'm certain that Firefox leaks memory. And I understand that I am an extremely heavy user of Firefox. As I write, I have 7 Firefox windows running for a total of 40 tabs. And I am trying very hard to restrain myself. I'm annoyed at how often I lose my machine. I could easily be running 4 or 5 times as many Firefox sessions.

As Firefox consumes more and more resources, in particular memory, things start to go critical. Sometimes, if I'm quick, I can start deleting sessions and get control back. Other times, I'm left in a state where only a reboot can give me back control.

I surmise that what happens is that, after Firefox has used too much memory, Linux cannot recover. It doesn't have to be that way. On my FreeBSD system, I've gone through the same scenario, but the only thing that suffers is Firefox itself. I get a message telling me that Firefox has misbehaved and has been killed. The OS survives.

7. iptables

I miss ipfilter. Where is the equivalent of "ipf -F a"?

Part of the problem arise from the fact that iptables is incoherent. There is a set of commands to do various things ("iptables ..."), but a completely different syntax is used in iptables-save and iptables-restore.

Further, there is asymmetry. On a machine on which no iptables commands have been issued, iptables-save produces an empty answer (zero lines). But once iptables has been invoked, one cannot get back to this state with only iptables commands.

I have written a script to achieve what I want, but it just shouldn't be that difficult.

8. Dot files

Here's one of my directories:

ls  -la
total 144
drwxr-xr-x   6 henryg  henryg   4096 Jun 12 11:32 .
drwxr-xr-x  15 henryg  henryg   4096 Jul 20 09:54 ..
drwxrwxr-x   3 henryg  henryg   4096 May  9 14:35 .ENV.
-r--r--r--   1 henryg  henryg    715 Feb 20  2005 .bash_profile
-rw-r--r--   1 henryg  henryg   5347 May  1 13:11 .bashrc
-r--r--r--   1 henryg  henryg   4692 Feb 20  2005 .bashrc.01
-rw-rw-r--   1 henryg  henryg   4529 Jan 14  2010 .bashrc.02
-rw-r--r--   1 henryg  henryg  18734 May  6 11:21 .emacs
-rw-r--r--   1 henryg  henryg  20539 May  6 11:12 .emacs.give_up_for_the_moment
-r--r--r--   1 henryg  henryg  18323 Jan 16  2007 .emacs.pre_FreeBSD
-r--r--r--   1 henryg  henryg     40 Feb  4  1999 .less
-rw-------   1 henryg  henryg    760 Aug  4 18:22 .lesshst
-r--r--r--   1 henryg  henryg   1242 Feb  4  1999 .lesskey
-rw-r--r--   1 henryg  wheel   12039 Jun 12 10:13 .login_sh
drwxr-xr-x   2 henryg  henryg   4096 Jun 26 12:37 .ssh
-r--r--r--   1 henryg  henryg    183 Jul 29  2007 .zile
lrwxrwx---   1 henryg  henryg      6 Jan 19  2010 RCS -> ../RCS
dr-xr-xr-x   2 henryg  henryg   4096 Jan 14  2010 bash
dr-xr-xr-x   4 henryg  henryg   4096 Jan 14  2010 bin

19 entries. In this case, most have dot (period) as the first character of their name.

With 'ls', I can select the entries which do not start with a dot:

ls -l 
total 8
lrwxrwx---  1 henryg  henryg     6 Jan 19  2010 RCS -> ../RCS
dr-xr-xr-x  2 henryg  henryg  4096 Jan 14  2010 bash
dr-xr-xr-x  4 henryg  henryg  4096 Jan 14  2010 bin

I can obviously select all entries (using the first command above).

I can select all entries except for . and .. using:

$ ls -lA
total 136
drwxrwxr-x  3 henryg  henryg   4096 May  9 14:35 .ENV.
-r--r--r--  1 henryg  henryg    715 Feb 20  2005 .bash_profile
-rw-r--r--  1 henryg  henryg   5347 May  1 13:11 .bashrc
-r--r--r--  1 henryg  henryg   4692 Feb 20  2005 .bashrc.01
-rw-rw-r--  1 henryg  henryg   4529 Jan 14  2010 .bashrc.02
-rw-r--r--  1 henryg  henryg  18734 May  6 11:21 .emacs
-rw-r--r--  1 henryg  henryg  20539 May  6 11:12 .emacs.give_up_for_the_moment
-r--r--r--  1 henryg  henryg  18323 Jan 16  2007 .emacs.pre_FreeBSD
-r--r--r--  1 henryg  henryg     40 Feb  4  1999 .less
-rw-------  1 henryg  henryg    760 Aug  4 18:22 .lesshst
-r--r--r--  1 henryg  henryg   1242 Feb  4  1999 .lesskey
-rw-r--r--  1 henryg  wheel   12039 Jun 12 10:13 .login_sh
drwxr-xr-x  2 henryg  henryg   4096 Jun 26 12:37 .ssh
-r--r--r--  1 henryg  henryg    183 Jul 29  2007 .zile
lrwxrwx---  1 henryg  henryg      6 Jan 19  2010 RCS -> ../RCS
dr-xr-xr-x  2 henryg  henryg   4096 Jan 14  2010 bash
dr-xr-xr-x  4 henryg  henryg   4096 Jan 14  2010 bin

How do I select just the ones which begin with a dot?

I can do it, but I have to use excruciating contortions. For 'ls', I can use the very unsatisfactory

    ls  -lA | fgrep ' .'

For many years I have used the close approximation

    ls -d .??*

to refer to entries which begin with a dot but exclude . and .. with reasonable success.

Further, what if you want to do some form of treewalking? You want all entries (except . and ..) irrespective of whether their name begins with a dot or not.

Recently I discovered bash's

    shopt -s dotglob

which does not help with ls, but does have the redeeming virtue that it "flattens out" the name space and treats all entries uniformly whether the entry starts with dot or not. Now the problem of selecting files that begin with a dot reduces to the problem of selecting any group of files with some commonality.

Further, because it excludes . and .. it allows simple constructs like

    file */*/*

to behave nicely. See also nocaseglob.

9. Mouse Selection

I know that this applies to all platforms and most products. I'm complaining here because, in my mind, Linux is about freedom - and I would hope that means freedom from stupidity. This applies to Firefox and, from my experience, most GUIs.

Here's a bit of screen:

    Line 1
    Line 2
x   Line 3
    Line 4
    Line 5

The "x" represents the cursor position. I press-and-hold the left button, and begin to swipe downwards and to the right. As the mouse hits one of the L's (say the first character in "Line 3"), all the text above this point is highlighted. I know that Microsoft does it that way, but why?

It's not as if I am able to select an area. If instead I start with my mouse over the "n" of "Line 3" and I swipe downwards and to the right, I won't only pick up text to the right of the "n" in the next line, I'll get all of the next line.

So it understands lines, but it behaves as if that understanding only applies sometimes. It seems to me that this violates the Principle of Least Surprise.

Where it's particularly galling is when the text I'm swiping is near the top of what I can see, because then I don't realise that the stuff above has been selected - until I paste what I believe is a couple of lines only to discover that I have pasted several hundred lines. Oops! Talk about Least Surprise; I'm astonished!

What I want is that, if I put my cursor somewhere on a line and select, I only pick up from the original point of my cursor to the right and down. Too difficult, you say? Well, maybe. But consider this. My workaround for this scenario is to select from the other end and swipe to the left and up to the beginning. So, if I want to select Lines 3 and 4, I place my mouse out to the right on line 4 (sometimes a long way out), like this:

    Line 1
    Line 2
    Line 3
    Line 4          x
    Line 5

And, guess what. First, it works! If I begin to swipe to the left and up, I do NOT get any of Line 5 in my selection. And, second, surprise, surprise, as I continue to swipe to the left, no matter how far left of the L in Line 3 I go, I never get anything ABOVE Line 3 - even if I go out of the window and off the screen to the left!

As far as I'm concerned, don't tell me it can't be done (that's virtually never true), or that it's too hard (that's just a matter of will) - just do it.

10. Filetypes

Why did Linux decide to do away with filetypes?

I think the various DEC operating systems had the best handle on filetypes. Let's say I wrote a script, pdfsplit.sh. I could have the filetype "sh" to indicate that this script is intended for execution by /bin/sh, but I could invoke it either by using the full name, or simply by using the part of the name to the left of the dot, pdfsplit in this case. It's just a little more elegant.

Then executables, e.g. 'ls', could be called something like ls.exe or ls.bin but still be invoked with "ls". When you list a directory, you would be able to tell what type most of the files were without having to run "file".

Magic numbers could still serve the purpose they have now.


So there you have them. I'm not even saying they are the 10 most annoying things. I'm sure other people would not be as irritated as I am with the items on the list. They might have a different list. I even suspect that, were I to start from scratch, I would produce a different list.

I am hoping to provoke some sort of response, preferably recommendations for mechanisms people have discovered to ameliorate the annoyance.

And, who knows? Perhaps in the long term, some people will agree with some of my grumbles and work towards improvement.


Talkback: Discuss this article with The Answer Gang


Henry has spent his days working with computers, mostly for computer manufacturers or software developers. His early computer experience includes relics such as punch cards, paper tape and mag tape. It is his darkest secret that he has been paid to do the sorts of things he would have paid money to be allowed to do. Just don't tell any of his employers.

He has used Linux as his personal home desktop since the family got its first PC in 1996. Back then, when the family shared the one PC, it was a dual-boot Windows/Slackware setup. Now that each member has his/her own computer, Henry somehow survives in a purely Linux world.

He lives in a suburb of Melbourne, Australia.

Copyright © 2011, Henry Grebler. Released under the Open Publication License unless otherwise noted in the body of the article.

Published in Issue 183 of Linux Gazette, February 2011