Post a Comment
Bash is at once a shell interpreter (in its compiled form) and also a language. I think it doesn't really make sense to call a language unintuitive. Whether or not a language is intuitive is determined by the user's familiarity with similar languages, etc.
I believe that bash is very intuitive if you're fluent in ksh, for example. However, if you've never used a shell then it is not intuitive at all. Likewise, if you grew up using VBScript, bash is not intuitive (but the inverse is also very true).
Once you learn how to pipe together commands and the unix shell way of thinking, I think working in bash is very intuitive. I routinely pipe text through sed, awk, cut, tac... I construct lists of files with find, iterate over them in bash for loops or with xargs.
I like the extensions that GNU added to bash over plain old sh, and when I'm working in ksh on an AIX system, I miss all the power of gnu readline and bash's special variables and keybindings like $! or !cmd:p, etc.
Some people will tell you that bash is bloated, and I often will write a shell script so it does not NEED bash and can run on something leaner like ash or dash, but for an interactive shell bash cannot be beat. bash is the best interactive command line tool that exists today for shell work, period.
Some people will tell you that bash is bloated, and I often will write a shell script so it does not NEED bash and can run on something leaner like ash or dash, but for an interactive shell bash cannot be beat. bash is the best interactive command line tool that exists today for shell work, period.
I beg to differ. ZSH is the best shell. 
"but for an interactive shell bash cannot be beat. bash is the best interactive command line tool that exists today for shell work, period."
Fish (Friendly Interactive SHell: http://roo.no-ip.org/fish/ ) is a really nice attempt to build user friendly command line (especially for novice users) and polish some Bash rough edges.
Just from what you wrote:
sed, awk, tac...xargs...keybindings like $! or !cmd:p
can you really say any of this makes sense in any language known to man?
And piping isn't just for unix. VMS DCL also has pipes (ok and also lots of $'s) . But it was designed for the most part to be consistent, syntax checking and "user-friendly" and I don't mean gui clicky grandma user-friendly.
"can you really say any of this makes sense in any language known to man?"
And you think your grandmother can make sense of a line that looks like "get-childitem | measure-object -property length -sum"? Face it: to the average user, it doesn't matter what language you use, they're all just magical gibberish.
I read a few guides on unix shell programming an within a day or two I was able to write useful shell scripts with the "no sense" sed/awk/xargs/... tools.
Bash, combined with a good terminal emulator, is a joy to use. To execute the previous command I just hit 'up' and 'enter'. Can't do that in DOS - 4 out of 5 times it gives you the wrong command. I just can't figure out how command history in DOS works, nor do I care about how it actually works - it doesn't work well and that's all that matters. Does PowerShell fix that?
Tab completion in bash is easy to use. I hit tab and it completes the filename, or completes it as much as possible and presents you with possible choices. In DOS, it completes to the first match and doesn't show you all possible matches, which is stupid. I have to press Tab several times to get the filename I want. Does PowerShell fix that?
In a proper Unix terminal emulator, I can have multiple terminals in one window, seperated by tabs. I can easily navigate between the terminals with Ctrl-PageUp/PageDown, and they don't clutter the task bar. Furthermore, most X window managers can snap a window to the edge of another window or the edge of the screen, making it extremely easy to organize your terminal windows. DOS can't do any of that. Does PowerShell fix that?
People are all talking about how awesome PowerShell is because it uses .NET objects and what not, but frankly it doesn't seem very usable as an *interactive user program*. People talk about PowerShell being a "shell" but it looks more like a scripting language to me. If I want to do more complex things that I can't do easily in bash I'll launch Perl.
Bash, combined with a good terminal emulator, is a joy to use. To execute the previous command I just hit 'up' and 'enter'. Can't do that in DOS - 4 out of 5 times it gives you the wrong command.
That's why many experienced DOS users use 4DOS, why many experienced OS/2 CLI users use 4OS2, and why many experienced Windows CLI users use either 4DOS, 4NT, or both.
The vanilla shell sucks on those platforms, but replacing it is trivial.
Edited 2007-01-25 16:41
why in the world would someone want to learn bash, one of the most unintuitive shells ever created.
Hmmm. I may be wrong, but I'm drawing the conclusion from statement that you tried to learn it, found it difficult and gave up. Now, you don't think anyone should spend the time learning it.
Now, assuming that I'm wrong and have misinterpreted your comment, when you say most unintuitive shells, I'm assuming you've tried others and found them more intuitive. What shells would those be?
ok I'll give an example of unintuitiveness.
let's say you want to delete all files with extension .txt and you type this
rm * .txt
oops forgot I added a space
oops thanks for not telling me I will wipe out all the files and just do it anyway.
Powershell requires confirmation
Edited 2007-01-25 05:12
ok I'll give an example
let's say you want to delete all files with extension .txt and you type this
rm * .txt
oops forgot I added a space
oops thanks for not telling me I will wipe out all the files and just do it anyway.
Powershell requires confirmation
If you're that careless then turn interactive mode on. Problem solved.
ok I'll give an example of unintuitiveness.
let's say you want to delete all files with extension .txt and you type this
rm * .txt
oops forgot I added a space
oops thanks for not telling me I will wipe out all the files and just do it anyway.
Powershell requires confirmation
well... just add
alias rm 'rm -i'
to your .login file or .cshrc (depending on your shell)
problem solved - confirmation for every deletion
I think it's a REALLY BAD idea to alias rm to "rm -i". Not because I'm implacably opposed to interactive deletion (i'm not) but because (a) it might screw up scripts which rely on rm NOT being interactive to work properly; and (b) what happens when you move to the machine of someone who has NOT aliased rm to "rm -i"?
Far better to alias "rmi"to "rm -i" "mvi"to "mv -i" etc, and use those instead. Then when you use a system that uses the default behaviour for "rm" and doesn't have those aliases, it'll say "rmi... not found."
I think you and the people that don't understand a thing about shells (all those that modded you up basically) should STFU and go right away learn to use a shell, and stop pretending you do.
Because your stupid rant about "rm -i' alias that can have impact on a script is just plain BS.
An alias on "rm -i" will just not impact any of your scripts, unless you explicitely make them login scripts, which is plain stupid if it's not your session script.
You're basically complete newbies on shells, which surely explains all the stupid comments about monad being anything good for administration.
FYI, your mistake here is typically how people manage to render their system unusable with a "rm -r *", because they think that having defined rm as "rm -i" somewhere, and it works in their interactive shell, means it will work in their script, and prevent any mistake.
And I hope you actually never went to other people machines to "fix" them, because with your poor knwoledge of shells, you'll just break everything.
Asking what happens when you go to a machine that has not aliased rm to "rm -i" is even more scary. "unalias rm" followed by "alias rm='rm -i'" is sth you should at least understand to help others. Even worse, a simple "rm" instead of "rm" will just bypass any alias you put on "rm", and it works for every command.
You're just an example of people that, instead of asking why everyone does sth this way, just assumes you're better than them all, thinks they're all wrong and you're right, and go implement a really poorer solution. And the monad just seems like that to me, too, a unix shell with all the mistakes embedded.
Bash is not unintuitive. It is powerful and demands that you respect that power. For example, you could easily implement a "Trash" mechanism in Bash so if you did type that command, your files would be easily retrievable.
I HATE the idea of a shell asking me if I'm sure every time I type a command.
I did something similar some time ago, but it was a chown -R in the /etc directory...
It was solely my fault and I'm only blaming myself because I didn't double-check what I was typing and where.
And, btw, with confirmations for every single deletion, sooner or later you'll switch to the "hit enter without reading" side, and the advantages of the confirmations are gone.
Its the only reason to upgrade from XP
Not really. PowerShell 1.0 was RTM'ed for XP a couple months ago. I've had it installed since then. It's available here:
http://www.microsoft.com/windowsserver2003/technologies/management/...
The Vista version is also available at the same location, but it's still at RC2 (RTM is "expected" for Jan 31.)
Yeah, it reads to be very complicated, i found myself thinking why not just use cygwin whilst reading the article. To be honest i lost interest when
"When you pipe the output of this cmdlet, called Get-ChildItem, to the cmdlet Sort-Object,"
was mentioned, MS should just cut to the chase and impliment a proper unix (like?) shell without all the seemingly BS layers like what was written. Who needs the shell to work magic for us when the tried and tested
ls -lrt
can do what we need, without all the leg bone connects to the knee bone crud ...
man ls and man sort are your friends .... ohh sorry i assume not with this tool, for this its probably, start --> help --> search for text --> "powershell sort by file size"
I tend to agree with you. To me, the basic DOS syntax gets me by. Don't get me wrong, I like Unix shells like bash and csh much better. But, I don't get annoyed as much having to type copy instead of cp or dir instead of ls. I can live with that. But, if I want or need some elaborate OO code, I can use Python or C# or something made for writing powerful applications. What I miss are things associated with basic conveniences like:
o hitting tab twice to show more suggestions
o tabs on the command window itself
o up arrow history that can filter based on the few characters you type
o history that #1, works and #2 isn't forgotten between sessions
o includes apps like grep, sort, uniq, cut, sed and awk by default
I should elaborate to say that if MS will just make things less annoying, I will be happy. We have Vista at work. In fact, we have every new MS app at work. And, I have absolutely no interest in installing them. I could, but I'm just not excited by all of the hype.
Edited 2007-01-25 03:42
That's cool. Someone else here mentioned that it accepts forward or backward slashes, too. For me, that will be great. I hate having to type backward slashes on MS. For people starting out, they may get very confused as to which way is the right way. But, you can't blame MS for not switching cold turkey. That would break a lot of things. These are things that I look forward to discovering.
Then they should have called it PowerScript or MS Visual ADVANCED or something.
But they called it PowerShell and it's quite shitty at that job. For 40MB of memory out of the box you get a shell that's overly complicated and less suited for many shell tasks than bash (or even cmd.exe).
It's great that MS finally made its own Perl/Python/Ruby clone to satisfy their NIH syndrome but in the meanwhile we're still waiting for a powerful shell for Windows without all the jumping-through-loops involved in using cygwin.
Edited 2007-01-25 15:10
Now this idea of an object-oriented shell sounds pretty interesting, but is it going to be useful as the Linux/BSD/whatever command line? Basically, there is a huge console-culture on UNIX and UNIX-alikes, so a vast repertoire of tools is available. Even if you don't know what kind of tool to use for the job you want to accomplish, when you're familiar with your system there's always some kind of paper trail (searching package manager descriptions of software suites, flicking through man pages, etc.) that you can follow to find out what you need to do.
A lot of the usefulness of the shell as I use it on Linux seems to stem from modularity. There really seems to be only a very small amount of built-in functionality, and everything else is added on in nice, self-contained modules. As I understand it, this PowerShell gets a lot of its capability from the .NET libraries, which looks like a fairly monolithic approach to be taking. Will it be as useful with 3rd-party contributions?
I'm not bashing PowerShell (no pun intended), since it seems like it's something new, and that's always something to be admired. Also, it's obviously a very young project, so it would be stupid to write it off already. I'm just curious as to how well it's going to work. I mean, bash certainly has its weaknesses, but it also has a well-defined place; for the more complicated jobs where a more flexible, possibly object-oriented approach would be favoured, there's always Ruby or Perl or whatever, right? ;-)
"...but is it going to be useful as the Linux/BSD/whatever command line?"
I think it might be, but just as bash would be pretty useless without all the unix commands like find/grep/awk/..., PowerShell will be useless unless it has the same thing (only I think they're called commandlets in that world).
You need the primitives for listing processes, listing files, printing.
But also, you'll need to be able to interact with other, non-microsoft programs. You will probably also need to parse plain old text in a way that isn't totally awkward.
The thing I see as the best thing with PS is readability.
If I can sort by a named attribute instead of a column number, that's a win. If that attribute knows how it should be sorted then that's another win.
If you look at the man page for 'sort' in your favourite unix you see that you can specify sorting to be alphabetically, numerically, by date and other things.
I don't know all the options, and if I could sort without having to know them, I'd be happier.
I'm not so sure that's such a great idea. Sure, it makes it a bit less of a mess, but what do you do when you're trying to pipe to/from a 3rd party program that doesn't support this object model?
Serialize the object to text. It's easy to go from an object to text, but not the other way.
There is a reason we have the notion of structures in programming languages and don't store everything in strings.
The last thing that we need is to use XML for passing data between apps in the command line.
Two Reasons.
1) XML in these cases would be self defining (no XSD) thus parsing it in the target application would be a nightmare, unless you want to have a "Generaic ALL Apps XSD"
Which leads me to the second
2) Look at the mess MS in got itself into with Office XML. The spec is 6000+ pages! This sort of bloatware is something we dont need. Then there is the danger of MS making it Namespace enabled and somehow forcing it to go out over the net and do an underhand WGA Check?
Ok, I might be speculating a lot but this is the sort of thing that MS might get up to if they enabled XML as the object passing mechanism in a shell.
Please remember the KISS principal.
XML is not the solution here.
And what happens when windoze in their infinite wisdom changes an object class but doesn't teach the other cmdlets how to deal with the new properties. Piping works because it's simple and every Unix/Linux CLI program understands it. This is a typical MS answer for a problem that doesn't exit.
UNIX shells require you to parse text output to get at the data you want. Passing objects around just makes more sense.
No need for objects, just make commands optionaly accept xml in/output. That way you would have the benefit of both structured output and text based output in both xml and human-output modes. There was actually a project that developed xml-based replacements for common unix commands, but I can no longer find it.
The MS solution seems too over-engineered and buzzword compliant (aah objects) to me.
Hmmm. Now, I'm sure passing objects around will come in handy one day. But, generally, I think of a shell as an "interface" not a "scripting language". So, I'm just more interested in the forward slash backward slash thing than the scripting part. If I need something more powerful than simple bash or dos scripts can handle, I'm thinking about using Python.
Well I almost didn't even bother to read this article, but am thankful I did. This actually does sound like a very elegant idea. It seems like a natural evolution to go from everything-is-text to everything-is-an-object. Of course there will still be places where pure text processing is appropriate, but there is no reason such operations can't be fit into this design.
It has the potential to make scripts more robust, where pipelines aren't dependent on the order of fields in their input. And things like full tab completion fall out of the design for free.
What I wonder is if the objects that get passed around are mutable? If so, the third command in a pipeline could alter a passed in object (that had been sorted and passed through a selection filter) to update a database, or icon, or endless other possibilities. That would be quite a powerful ability and an advancement over what is offered in any *nix shell today.
Sure they whole passing oblects not text thing is a cool theory, but what does the syntax for the language actually look like?
from http://en.wikipedia.org/wiki/Powershell
Calculate the number of bytes in the files in a directory.
In powershell:
get-childitem | measure-object -property length -sum
In bash:
du -h
And it is not like the bash command is cryptic, du = "disk usage", the -h is not even required but it is the flag for "human readable", so you don't get an answer back in KB.
For some more interesting info check out the Powershell sctipts on Technet here: http://www.microsoft.com/technet/scriptcenter/scripts/msh/default.m...
The following script is designed to "List IP4 Route Table Information" (like route -p or netstat -r)
$strComputer = "."
$colItems = get-wmiobject -class "Win32_IP4RouteTable" -namespace "rootCIMV2" `
-computername $strComputer
foreach ($objItem in $colItems) {
write-host "Age: " $objItem.Age
write-host "Caption: " $objItem.Caption
write-host "Description: " $objItem.Description
write-host "Destination: " $objItem.Destination
write-host "Information: " $objItem.Information
write-host "Installation Date: " $objItem.InstallDate
write-host "Interface Index: " $objItem.InterfaceIndex
write-host "Mask: " $objItem.Mask
write-host "Metric 1: " $objItem.Metric1
write-host "Metric 2: " $objItem.Metric2
write-host "Metric 3: " $objItem.Metric3
write-host "Metric 4: " $objItem.Metric4
write-host "Metric 5: " $objItem.Metric5
write-host "Name: " $objItem.Name
write-host "Next Hop: " $objItem.NextHop
write-host "Protocol: " $objItem.Protocol
write-host "Status: " $objItem.Status
write-host "Type: " $objItem.Type
write-host
}
WOW, they reall made _that_ easier.
The 'Tech Analysis' and 'PowerShell' are neither of what they portend to be.
The tech analysis is no more than an impression. There is no systematic deconstruction, comparison or expression of objective aims in this article.
Like wise the name chosen for monad is boastful and disingenious. What wrong with a normal name such msh ? If as a company you can't name your products with out the unecessary hype (office/vista); how can we trust it is designed, produced or supported in a sane way.
I suppose it can all be summed up by a peek at dsa.msc and the Exchange System Manager.msc
This is more than vindication for the *nix like cli, as PowerShell is probably doomed to cp it poorly. To end on a constructive note, what MS should have done is absorbed cygwin and exposed all its internals (csvde, cacls, services and registry) via *text only*. Then ensured that these methods were available remotely, by default, like it is so easily,securely and conviniently done through ssh on *nix today. None of this 1/2 arsed psexec/dameware/gp based admin insanity we have now.
I'd say nice try, but it isn't even that:
http://blogs.msdn.com/powershell/archive/2006/08/03/687838.aspx
Talk about revisionist history. Apple had a hugely popular GUI based OS more than a decade before Windows-95. And many would argue that Win95, was just a buggy shell for DOS.
Msft didn't have a half-way worthwhile GUI based OS until 2000 - sixteen years after the Mac.
BTW: I don't use Mac, never have. I am no Apple fanboy, but this sort of revisionist history is too much.
Here's a pretty cool Powershell script that I saw at digg:
$v = new-object -com "SAPI.spvoice"
$v.Speak("Shall we Play a Game?")
I know it can be done on with other systems, but I didn't know this could be done with PowerShell until I read about this at digg, and I thought it was cool. :-)
More importantly, it shows PowerShell's ability to work with COM objects (besides .NET objects), via .NET's COM interop.
So one could mix and match COM and .NET objects in a script. And one can drive any app that implements OLE Automation.
For example one would instantiate an Excel COM object with:
$o = new-object -com "Excel.Application"
(With VSTO, I think PowerShell might be able to talk with Excel via .NET without using .NET's COM-interop functionality, but I'm not sure.)
(BTW, VBScriptHost already allowed for driving of automation apps, as do various so-called "scripting languages" like Python, and AppleScript drives apps on Mac OSX (and Cocoa apps automatically get some default scriptability), so no, I'm not claiming a "breakthrough" here, just adding to the discussion.)




