Slashdot Mirror


Which Shell Do You Prefer?

Pascal de Bruijn asks: "I recently started to use NetBSD, the first thing I noticed was that it didn't have a command-line history. So I immediately wanted to switch my shell, being on BSD my first instinct was to change to tcsh, but many people told me it wasn't any good. Others recommended zsh. I would really like to hear your opinions about shells." The submitter is particularly interested in shell memory usage, and the features you like...and dislike...from the current options that are available, today.

19 of 138 comments (clear)

  1. command line history by eXtro · · Score: 5, Informative

    did you try enabling it, it's off by default

    set history=1000
    - or maybe -
    history = 1000
    - or possibly -
    set history 1000

    I've never seen a shell without command line history, but I've logged into a lot of places where it wasn't turned on by default.

    1. Re:command line history by Doc_XII · · Score: 2, Informative
      I've never seen a shell without command line history

      /bin/sh (aka old school Bourne Shell) doesn't have a command line history.

    2. Re:command line history by MattCohn.com · · Score: 2, Informative

      cmd.exe does, that's what I use on my Windows box...

    3. Re:command line history by LizardKing · · Score: 2, Informative

      "set -o emacs" in NetBSD's standard Bourne shell will give you command line history. Nect time RTFM.

      Chris

  2. Huh? by Anonymous Coward · · Score: 3, Informative

    I recently started to use NetBSD, the first thing I noticed was that it didn't have a command-line history.

    It? Command-line history isn't a feature of an operating system, it's a feature of a shell.

    my first instinct was to change to tcsh, but many people told me it wasn't any good.

    Read csh programming considered harmful. It's not really sensible to write shell scripts using one shell and use another, so steer clear of csh.

    Many people like zsh for it's completion routines, but I believe bash has similar facilities by now.

    1. Re:Huh? by AtrN · · Score: 3, Informative
      Command-line history isn't a feature of an operating system, it's a feature of a shell.

      It can be a feature of the operating system. With pty's you can insert arbitrary filters into the input stream allowing consistent editing across all programs that do terminal input. I've used ile in the past to do this. The benefits include one editor interface and programs not needing to know about and include the editor. There's a trade off (of course), without knowledge of the editor the programs can't tailor it to specific uses, such as programmable completion. It could be but the editors need to provide facilities to allow such control and they don't AFAIK. It would nice if they did.

  3. zsh by dhall · · Score: 3, Informative

    I originally chose this shell back in '92 for the right hand prompt. A 'spiff' feature for a shell chocked full of features. It was also the first shell to have a truly programmable completion. It has all the interactive add-on's for tcsh, with the base template built off of Korn Shell (so you don't have issues with scripting in something separate from a Bourne derivative).

    The z-shell is so filled with features at this point, it's nearly become the "emacs" of shells, and yet, it's memory footprint for the same tasks is smaller than either bash or tcsh.

  4. Bash is the One True Shell, ksh is very close by afabbro · · Score: 4, Informative
    Yes, I'm (mostly, as much as ever) serious.

    When picking a shell, you should consider:

    • how easy it is to work with interactively
    • how easy it is to code (yes, I write 99% of my stuff in perl or whatever, but you will need to script some day, mark my words...if nothing else, system startup scripts for Solaris, AIX, etc.)
    • how standard is it on what type of Unices you work on.

    The candidates:

    sh is too primitive in terms of user features, period. No one uses the Bourne shell if they can help it.

    csh/tcsh...well, google for "csh Programming Considered Harmful" to see its many internal bugs. Also, most of the major Unices don't use it (Solaris, AIX, Linux - I guess *BSD might still) for their system stuff. If it's not considered a good scripting platform AND most Unices don't use it for their scripts...

    zsh - From what I've read, a good shell, but very nonstandard. Do you really want to lug a shell around and install it (and set up /etc/shells or whatever each time, etc.) for every machine you log into?

    ksh - sh scripting with all the good interactive features. A really solid shell and a very good choice. All the sh goodness with the t/csh interactive features added.

    bash - I think bash is a little better than ksh because some of its interactive features are better. Tab-completion is better than ESC-\. The way the shell handles tab completion is better (X possibilities, do you want to see?) Lots of little things like that. Benefits greatly from reimplementing ksh. Installed by default on all Linux distros (except tiny niche players) and Solaris since Solaris 8...easy to build and install on AIX or *BSD (and HP-UX I'd guess, I don't know)

    bash is the best shell in my opinion and I have no qualms about defending it. ksh is a reasonable second choice and some people prefer it. zsh may be in the running but never caught on widely. Everything else is inferior.

    --
    Advice: on VPS providers
    1. Re:Bash is the One True Shell, ksh is very close by eyez · · Score: 3, Informative

      csh/tcsh...well, google for "csh Programming Considered Harmful" to see its many internal bugs. Also, most of the major Unices don't use it (Solaris, AIX, Linux - I guess *BSD might still) for their system stuff. If it's not considered a good scripting platform AND most Unices don't use it for their scripts...

      Um. I'm sorry, but I don't see how (t)csh scripting equates to it's value as a login shell. Yes, it can be ugly to script in csh, mainly due to it's lack of function support, but it's a very nice shell to use for day-to-day use. It's completion system is extremely sane, and it has lots of extra convenience setups, and many cool extras.

      zsh - From what I've read, a good shell, but very nonstandard. Do you really want to lug a shell around and install it (and set up /etc/shells or whatever each time, etc.) for every machine you log into?

      Zsh is actually my favorite shell. The way I have it set up, if I run into a machine where zsh isn't available, I have a backup tcsh config which works very similarly to my zsh config. Thing is, most of what I do with zsh also works on bash, too.

      Of course, that's not WHY I use zsh. Well, it may be part of it, but more importantly is that zsh really is designed to be the most configurable shell around. you can make it do /anything/, given a certain varying amount of work. I'm far too tired to go into any sizeable amount of detail about it, but there's plenty of documentation on zsh's site.

      My point, though, is that EVERYTHING bash can do, zsh can do at least as well and often better. So even if you have the extra power of ZSH on your most-used machines that you may have control over (and many administrators, as long as they're not total jackasses, will listen to someone who asks for a zsh install), and another shell (I use tcsh because i like the syntax of their while/if/etc stuff better, but it doesn't matter that much) anywhere you can't get it, and not suffer too badly over it. You'd just miss out on the extra nicenesses of zsh on machines you didn't have the authority/energy to make it work on.

      And one smaller point: Zsh's POSIX-sh compliance is actually better in compliant mode than Bash's is in sh-compliant mode. You really do get a lot out of zsh as a shell, even if it can be a bit harder to configure.

      --
      get 0wned. irc.w30wnzj00.com
  5. A few more details by devphil · · Score: 5, Informative


    Some random facts:

    • Anyone spending more than a brief amount of time on a *nix system should learn how to use the basic sh commands, even if it's not their login shell? Why? Because 1) most system-level scripts are written in sh, and 2) when major programming languages perform a "shell" call, e.g., system(), it uses sh to do the work.
    • There is a POSIX specification of sh which cleans up all the wacky historical bugs. The resulting shell is actually ksh.
    • The csh/tcsh family were originally meant to be more friendly to programmers (a C-style syntax), but it all seriously backfired. Every other shell allows the user to write subroutines. Not csh. Instead, you get a goto command. No, I'm not joking.
    • tcsh is just some user-friendly features added to csh, but the annoyances and lack of comparative features just doesn't make up for it.

    The only real choices today as far as user login shells go are bash 2.x, ksh (ksh93, not ksh88), and zsh, all of which continue to cross-pollinate good ideas.

    --
    You cannot apply a technological solution to a sociological problem. (Edwards' Law)
  6. zsh by honold · · Score: 4, Informative

    i was convinced by adam spier's page and the zsh faq to give zsh a try - it was even a netbsd system that prompted it. i got sick of administering freebsd/opensbd/netbsd with different shells and i wanted to standardize on something with the features i wanted.

    bash was tried first, but when i started playing with misc options like vi mode, got deeper into completion, etc i realized that bash/ksh weren't appropriate long-term choices for me. auto cd to directories, amazing completion options, typo correction, shared history, and a proper vi mode (see this for the confession from gnu's docs).

    'knowing' zsh will largely translate to bash/ksh systems when you use them and zsh is not available - you'll just be reminded of their shortcomings :) the basics are largely identical.

    the new unix power tools book also makes much mention of zsh.

  7. Bash gets my vote by klui · · Score: 2, Informative

    When I first used UNIX, it was ksh. I had gotten used to ESC-ESC for name completion. Then I got my NeXT and liked TAB for completion under csh. Much better. When I found out that bash had the same thing but TAB-TAB prints all possible matches, I was hooked from then on. Plus, much of the settings are the same as ksh and scripting is about the same.

    I tried zsh but its man page is like Perl's, referencing a bunch of other man pages, making navigation/reference cumbersome. tcsh's configuration is different enough from [bk]sh's that I stopped using it in short order.

    So it's bash for me. It's a good thing bash is available under OS X. Early versions had only sh, csh, and tcsh and things were painful. Recent versions have all those, including bash and zsh.

  8. NetBSD's default shell has a history... by SN74S181 · · Score: 2, Informative

    There certainly is a history in the default shell (/bin/csh) on NetBSD. Type the 'h' command to see your numbered command history. Then type, for instance !3 to repeat the third command on the list, or !! to repeat the most recent command.

    But if we wanted to have a shell war, maybe I am just being pedantic and interfering.

  9. should make a poll out of this by zatz · · Score: 4, Informative

    I would vote for zsh, personally.

    I've actually had bash segfault on me a few times, which zsh has never done. and zsh uses less memory unless you do abusive things via scripting or the command line editor. zsh scripting is a superset of sh, so the things I try generally work; csh users can have a similar experience after setting a few options. (But remember, csh programming Considered Harmful.) I've become accustomed to spiffy zsh features like reporting when other users log in and out (before the prompt, just like new mail), extended globbing, very customizable completion behavior, being able to tab-expand history references (makes trying "!rm" much less dangerous), and so forth.

    It's even the little things. Like, zsh expands commands when it prints a job completion report, but bash doesn't; so if you have a loop which does something on a bunch of items, each of which can complete in the background, under bash you get a report where each item looks like "[%] Done wget $i" or something equally useless, but under zsh you can see the actual text of the command that finished.

    I have 100+ lines invested in the four rc files for zsh by now, so something new might not be immediately superior for me. I have been meaning to seriously try out es and rc for years.

    --

    Java: the COBOL of the new millenium.
  10. eshell actually *is* a useful choice by LeninZhiv · · Score: 3, Informative

    Of course I realise you're joking, but Emacs actually does come with a built-in shell, eshell.

    What rocks about it is that it's written in Emacs lisp, so you can use it on anything Emacs runs on. It's very nice to be able to fire up a Unix-like shell on Windows for those of use who prefer a cli approach and have never adapted to the MS-DOS tradition.

    Still though, when I am in a Unix environment I like zsh for my login shell, which still has a more features.

  11. UNIX shell FAQ by scubacuda · · Score: 5, Informative

    While surfing the web for FAQs on UNIX shells, I came across this popular FAQ on the differences between shells and how to choose.

    There's a great table in there that lists the features of each.

  12. Nope, bash has that too. by devphil · · Score: 3, Informative


    Programmable completion has been in bash for a while now. See the original project page for more, or use the debian bash package, which includes the completion libraries by default.

    I actually had to disable the cvs-subcommand-autocomplete. I would try to complete the name of an actual file, and the cvs-completion would fire... generating network traffic to the CVS server... taking forever... when all I wanted was a local filename.

    --
    You cannot apply a technological solution to a sociological problem. (Edwards' Law)
  13. Depends ... by nbvb · · Score: 2, Informative
    When I'm myself, my shell is set to /bin/bash.

    When I'm the root user, my shell is /sbin/sh (No, *NOT* /bin/sh!) On Solaris, one should *NEVER* change root's shell.

    Ever. Ever. EVER. Instead, in root's .profile, I have the following:
    if [ -x /usr/bin/bash ]; then
    exec /usr/bin/bash
    fi
    This _will_ cause problems using dtlogin, but real admins use serial consoles!

    All my scripting is done using /bin/sh .... I know it's standard, I know it's on ALL my Solaris machines (The 2.5.1/2.6 ones don't have bash by default ... thank GOODNESS we're retiring most of them :)

    For simple sysadmin-type tasks, the bourne shell has almost all the features you need ... but if you need to do hairy things with I/O, then it's nuttin' but Perl.... Remind me to share my Veritas Volume Mangler scripts some day :)

    --NBVB
  14. BusyBox by e8johan · · Score: 2, Informative

    If you want a small memory footprint, try the embeddable shell alternative: BusyBox.

    "BusyBox has been written with size-optimization and limited resources in mind. It is also extremely modular so you can easily include or exclude commands (or features) at compile time. This makes it easy to customize your embedded systems. To create a working system, just add /dev, /etc, and a kernel."