In the comments section of a recent post I found out that Windows PowerShell had been ported to Linux. Had no clue it was a thing.
Went looking and found this old article attempting to explain why they did it. Not remotely interested in giving up Bash for PowerShell, but I thought it was interesting enough to share. The article seems to be from 2016.
I have never been more tempted to check the NSFW box, but I’ll leave it open for now unless a mod complains. :-D
Powershell is annoyingly good though.
Can someone explain to me why? The outputs are objects and that is cool for scripts, but the fact that every small thing is its own cmdlet is super annoying. I can do everything in Linux if I know 10 commands. In PS I would always have to look up everything.
That sounds more like a clash of cultures than a real problem. In Linux you need to know 10 options and possibly subcommands for each command. Naturally the same concept has different flags, and the same flag has different meanings in different commands. Is that really better?
If I recall the Verb-Noun idea is supposed to make it clear what is happening, take a look through stuff like the approved verbs for defining cmdlets. There’s aliases and stuff for sure for example I think ls is an aliases for Get-ChildItem in PowerShell.
It’s supposed to make it so you don’t necessarily need to look things up, need to do something to an item? Well you can Copy, Remove, Rename, Move etc, and while yeah that’s a super basic example that you know the equivalent linux commands for, the concept is supposed to apply everywhere. Now, whether or not people follow the guidelines is probably another story.
I don’t really hate shell scripting, feel like they all have their place, complex stuff though is nicer in straight PowerShell than bash IMO, but I’m fine using either.
The aliases are good for the most part, but
curl
is an alias forInvoke-Webrequest
, even though the two are incompatible.Same here. I keep hearing that Powershell is so good, but I have to look up every little thing. It’s all too specific and you can’t remember it all.
Maybe you’re a bit more used to the linux stuff then.
https://lemm.ee/comment/20786033 – I think powershell’s syntax is far better than bash’s. It feels more modern.
I’ll take your word for it. I could never wrap my head around PowerShell back when I still had a Windows install. Whenever I could, I would use either the DOS prompt or WSL/Ubuntu. I may not be great at Bash or DOS but at least I’m not having to resort to cargo culting to do anything. Probably a sign I’m getting old.
I wouldn’t go that far
As much as I hate windows powershell is actually decent.
The problem is that on Linux it competes with bash and dozens of way better terminals.
We’re not talking terminals, though, are we? You can run pwsh in dozens of terminals. As a shell, it’s… Very decent.
I hate to say it, but powershell is better than bash.
I’ve been a Linux sysadmin for decades and Windows for the year 8 years or so. I started using Windows with an air of contempt, and still do. I hate myself for saying this, but Powershell is better than bash. Bash is very limited if you consider only bash. For bash to be useful you need the entire GNU suite with grep, cut, awk etc.
But that’s almost never how a system is configured. The entire point is that bash, zsh, fish etc. can make use of those utilities. You don’t need bash trying to reinvent everything. You don’t want that. That’s why changing shells is generally painless and a strength, not a weakness.
That’s like saying that your car is very limited because you need cylinders, spark plugs, oil filters…
Well yeah, you do and typically that comes with the car, just like grep comes with bash
Yes, that’s the point of the shell. It’s the glue for all the little tools.
So you’re saying Powershell doesn’t uphold Unix Philosophy and thus shouldn’t be used?
PowerShell actually does uphold the Linux philosophy pretty well. Most functions are in modules that can be imported, disabled or swapped out as appropriate.
PS looking good
Slow as shit though.
there are other shells that have all the nice powershell things without the weird stuff (at least for not windows people), like nushell
although I wouldn’t be surprised if powershell was the thing that started the trend of better shells
mind telling me why?
i thought it’s just another terminal.
I can maybe chime in since I’ve used both. Basic operations like if statements, arithmetic and loops are a lot closer to what you’d expect on PS. The barrier to programming in bash vs PS is IMO a bit higher because bash heavily uses symbols for everything. This does make PS way more verbose but more easy to wrap your head around it when unfamiliar with the syntax.
I prefer bash but for anything bigger than 5 lines I prefer proper scripting language like python or js and making an alias for “node path/to/js/script.js” and using execSync(“program param1 param2”) to run shell commands.
Long story short, I prefer bash because it’s built in and I know it better than PS, I expect PS guys to feel the same way.
Its a completely different shell, not just another terminal emulator.
Its more readable, and its syntax is less arcane than bash.
For example, a script to get the first line of a file and its lenght in bash is:
#!/bin/bash if [ "$#" -ne 1 ]; then echo "Usage: $0 filename" exit 1 fi filename="$1" if [ ! -r "$filename" ]; then echo "File '$filename' does not exist or is not readable." exit 1 fi read -r first_line < "$filename" echo "First line: $first_line" length=${#first_line} echo "Length of first line: $length"
There is so much I hate about this, like using a semicolon after the if condition, and ending it in fi.
Versus the powershell version:
It feels more modern.
bash scripting is not intended to perform all of your logic in the scripting language, it’s intended to call out to other programs which perform specific tasks. The entire POSIX command set is your bash scripting language.
Your script is a simple one-liner if you know some simple commands:
$ head -n 1 /usr/share/dict/words | tee /dev/stderr | tr -d '\n' | wc -c A 1
Maybe not all, but it’s definitely intended to do some, and it’s really bad at it.
It works fine for what it is. Bash is just a shell while Powershell is more of a scripting language.
I think a better comparison would be Python vs Powershell.
It doesn’t work fine for what it is. People use Bash for scripting all the time and it’s full of footguns and gotchas. Powershell is just an attempt at a sane shell. It’s not meant to be a full general purpose language like Python; it doesn’t make sense to equate them.
Personally I don’t really like the style of Powershell. The structured data is very obviously a good thing but I don’t really like the syntax. Nushell seems a lot nicer IMO.
Bash one liners are one is the most fun things in programming.
I can do that as well:
$l = Get-Content "example.txt" -TotalCount 1; Write-Output $l; ($l.TrimEnd("`r", "`n")).Length
There’s a condensed version using aliases then:
$l = gc 'example.txt' -TotalCount 1; $l; ($l.TrimEnd("`r", "`n")).Length
I still think it has a better syntax than bash.
oh, so it’s it’s own language too.
I only use it to access WSL (don’t judge me)
Did you mean WSL? I mostly use it for that too because lua development on windows is ass.
yhea, sorry.
If you are on Windows test out either Git bash or Msys2
Much better experience
That semicolon is the same use in both languages, why the hangup? It’s a way to put separate commands on the same line.
PowerShell tried to build everything around the verb-noun command naming structure, which improves readability.
What’d the semicolon ever do to you?
After the if condition. No other language does that, so it feels unecessary.
It is unnecessary. It’s only needed when you keep them on the same line. E.g.:
if [ "$variable" == "value" ]
then
echo "Condition is true"
fi
That ; can be used anywhere in bash or powershell for the same effect
I know, but not all languages require it.
For example, lua does the following:
if true then print("hello") end hello
but this also works:
if true then print("hello") hello
It sounds like the main point of confusion for you with semicolons, especially in bash and its if/then statements, isn’t about their general readability but more about their role in defining what counts as a complete statement or command, and when they are required versus optional.
You’re right that bash requires a semicolon (or a newline) after the if condition before the then keyword if they are on the same line. This is because then is considered a separate ‘command’ or keyword that follows the if condition and its associated
[ ]
or(( ))
test.A newline serves the same purpose as a semicolon.
In contrast, languages like Lua, Python, or PowerShell often have syntax where then (or its equivalent) is intrinsically linked to the if and doesn’t require a separator between the condition and the block opening keyword, even on the same line. They typically use newlines or specific block delimiters (like
end
in Lua, indentation in Python, or curly braces{}
in PowerShell) to define the scope of the if statement.While the semicolon’s general use is to put multiple commands on one line, its mandatory placement after the if condition before then in bash when on the same line is a specific syntactic requirement of bash to separate those two distinct logical parts of the if construct. Many other languages simply define if condition then block as a single syntactic unit, hence no semicolon is needed there.
No grep though as far as I could find… There was a similar cmdlet IIRC, but it was extremely limited and didn’t work well (this was years ago though)
The idea with powershell isn’t to be a text parser - so grep doesn’t really work. When you pass things through pipes, it’s a full object with multiple properties, and those you can filter with either simple expressions like
select-object [-property]
or with more complex expressions: https://4sysops.com/archives/add-a-calculated-property-with-select-object-in-powershell/Select-String
It’s really useful too. You can either pipe in text or for example Get-ChildItem a directory of files and it will parse them all. As usual it returns a helpful object with properties like line number.