News for hackers. Stuff that matters.
Re:The Dawn of a new Command Line Interface (2017) by CJefferson on Tuesday April 13, 2021 @06:46AM (#26790485)
I'm interested in progress in this area, but I'm disappointed the article seems to ignore the existence of powershell, which does some things different to traditional linux shells -- I would at least like a discussion of how this related to powershell.
Re:The Dawn of a new Command Line Interface (2017) by marlowe221 on Tuesday April 13, 2021 @09:10AM (#26791667)
I work in a Windows shop (security compliance reasons for federal government contracts). Before I got this job I was pretty much only developing in Linux.

Honestly? Powershell is pretty cool, though it feels a little strange to admit that. It has it's own very powerful syntax and virtually all of the common Bash commands are now aliased by default, so it's pretty smooth transition for the basic stuff.

Re:The Dawn of a new Command Line Interface (2017) by richardwhiuk on Tuesday April 13, 2021 @09:37AM (#26791934)
Re:The Dawn of a new Command Line Interface (2017) by yourapostasy on Tuesday April 13, 2021 @07:59AM (#26791019)
The "key issues to address" list explicitly calls out many of the challenges Powershell manages with its object-based view of the world. It looks like Arcan's SHMIF layer is meant to let developers using Arcan capture rich data and metadata before it gets smooshed into the VTxxx emulation layer and smeared away in a sea of screen formatting characters.

Where Arcan cannily (IMHO) differs from Powershell is it acknowledges the transition from existing toolchains will be organic instead of demanding wholesale operational changes to a different processing model. So it splits the data and metadata processing pipeline, exposes it at key points to the developers using Arcan, and lets an emulation layer cover legacy use cases, while enabling Arcan developers to create much richer data representations underneath the covers that can be tapped if desired by users via Lua manipulating the many different Arcan components (I think). This opens up hybrid GUI/TUI/other-interface best-of-breed/mixed-mode options that are unreasonably challenging to implement (especially with sync logic) with current UI stacks.

I like this approach more than Powershell's, but it remains to be seen how Arcan handles the guidance of the data and metadata ontology and resultant taxonomy; it is a much deeper problem space than just defining a default namespace, a way to modularly plug into it with extensions, then standing back and letting developers have at it. The way Powershell handled it, introspection and discoverability are out of band instead of a batteries included experience, and module management is still split out of band between Nuget, PrivateGallery, custom solutions, hand-curated Git+Jenkins lash-ups, etc.

For my small-scale, personal projects like for my family's intranet, the lack of an opinionated default for at-scale management of these issues is not a problem. But at my clients with dozens, hundreds and even thousands of developers, it presents software engineering management challenges. Solvable, just a developer experience hygiene factor I'd rather not deal with because solving it adds zero business value, it's just the cost of doing business.

Re:The Dawn of a new Command Line Interface (2017) by Koshkin on Tuesday April 13, 2021 @08:25AM (#26791246)
To be fair, the article seems to be more about the terminal emulation and the limitations it puts on the CLI rather than about the shell language.
Re:The Dawn of a new Command Line Interface (2017) by rbanffy on Tuesday April 13, 2021 @09:03AM (#26791598)
Proper VT emulation gives you multiple fonts, mouse and windows.
Re:The Dawn of a new Command Line Interface (2017) by crazyloglad on Tuesday April 13, 2021 @07:36AM (#26790848)
There was no point in bringing up powershell at the time, its legacy is an entirely different beast from vtXYZ and would invite the next "why isn't hyper.is covered" and "why isn't upterm covered and ..."

The fabric under attack was the bastard display server protocol itself and not the parts that tie in with the strong points of Powershell, i.e. shell UI design or data exchange format specifics.

This story was continued in a post from yesterday that fizzled, https://arcan-fe.com/2021/04/12/introducing-pipeworld/#pipel...

Re:The Dawn of a new Command Line Interface (2017) by pjmlp on Tuesday April 13, 2021 @08:31AM (#26791294)
Powershell is great, it is the closest of the REPL experience from Xerox PARC, Lisp Machines and ETHZ workstations.

The experience could be replicated in UNIX shells, but noone sems to care to actually go down that path.

Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @09:03AM (#26791602)
I feel that the closest we can get to a Lisp machine with modern components right now would be to get PowerShell, Emacs and StumpWM (or EXWM) to deeply interoperate.
Re:The Dawn of a new Command Line Interface (2017) by ticviking on Tuesday April 13, 2021 @10:57AM (#26793049)
I mean it's possible to run PowerShell on Linux, but PowerShell has some pretty significant rough edges, including a pretty painful performance story for something I want to use as a UI.
Re:The Dawn of a new Command Line Interface (2017) by pjmlp on Tuesday April 13, 2021 @04:32PM (#26798852)
It is also a matter of culture, as mentioned you could have a UNIX shell being structured, able to directly interact with shared objects, IPC with running applications, yet very few do it.
Re:The Dawn of a new Command Line Interface (2017) by donatj on Tuesday April 13, 2021 @08:01AM (#26791035)
Is it possible to return structured data in PowerShell from non-.Net languages? I am genuinely asking here, it’s been years since I’ve poked it. If not though that seems like an enormous stumbling block.
Re:The Dawn of a new Command Line Interface (2017) by kaba0 on Tuesday April 13, 2021 @08:40AM (#26791391)
Well, it can export as json, xml and I’m sure some other formats as well, so in principle it can.
Re:The Dawn of a new Command Line Interface (2017) by rbanffy on Tuesday April 13, 2021 @08:48AM (#26791458)
That sounds interesting, but either programs deal with schema transforms, or we'll have to write a lot of that kind of logic in XSLT or jq (kind of the same stuff we do with cut, sed, awk, sort and grep for unstructured streams). Not sure it's that useful a feature unless the domain of the programs is narrow.
Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @09:05AM (#26791625)
I think it could be useful - from PowerShell's perspective, all you need is to wrap your "classical" executables to somehow accept and emit .NET objects, and you can carry on from there. Importantly, no more writing parsers in the pipeline or in your scripts.

I could see a whole library of such wrappers being built for common executables (and new popular OSS CLI tools could provide their own wrapper along with the tool).

Re:The Dawn of a new Command Line Interface (2017) by rbanffy on Tuesday April 13, 2021 @09:14AM (#26791711)
You can wrap your .NET, JVM, Python, Perl or C functionality in a small program that links to the library you want, that deserializes your XML or JSON, reads your command, and acts on the incoming object stream, spitting it to stdout in a neutral, preferably human readable, format that can then be piped into the next command.

Oh! Wait! This is what tools like cut, jq, grep, awk, and sed to.

And they won't tie you to a certain object model.

Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @09:29AM (#26791862)
> Oh! Wait! This is what tools like cut, jq, grep, awk, and sed to.

Yes! Except, you have to use them to write one-shot parsers that are specific to both what you're piping from and what you're piping to! For n commands you may want to arbitrarily mix, that's n² parsers to write.

> And they won't tie you to a certain object model.

From the point of view of a system user, tying to a certain object model is a feature. It facilitates commands interacting well with no parsers in between. But even if you don't have a common object model, just wrapping the commands to produce structured output can already be helpful, because the parsers you'll be writing to glue commands will operate on structured, higher-level concepts. It's easier to map between two different representations of what a "file" or "process" is, than it is to manually dig them out of an unstructured text stream.

To use a stupid example, assuming hypothetical "kill-and-announce" that echoes a process name and sends a SIGKILL to its PID:

  ps aux | awk '{ ...extract columns... }' | sed 'rename columns' | xargs kill-and-announce ...
Would be harder to figure out than:

  wrapped-ps | wrapped-kill-and-announce
Or even with incompatible object models:

  wrapped-ps | select Target={id:$_.PID, name:$_.name} | wrapped-kill-and-announce
Re:The Dawn of a new Command Line Interface (2017) by fiddlerwoaroof on Tuesday April 13, 2021 @11:31AM (#26793642)
This is one of those eternal debates I think: on the one hand you have OOP and certain sorts of FP advocates advocating for extremely rich data models that eliminate certain classes of errors by design. On the other hand, you have the Unix notion of using a very generic data type (see also Perlis’s “rather 100 functions on one data structure than ten functions on ten data structures”) to maximize flexibility, at the cost of a certain amount of footguns.

Personally, I’m discovering more and more that CL’s REPL in SLIME is my preferred shell in part because the CL ecosystem has a rich array of operations on a small number of data-types (without forcing everything into binary streams), but also the ability to define ad-hoc datatypes as needed and a powerful system for manipulating them and integrating the custom data types into existing protocols.

Also, the claim that you need n^2 encoder/decoders isn’t actually true: conventions around data formats can reduce it to O(n) in the number of conventions.

Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @05:59PM (#26799888)
> This is one of those eternal debates

Myself I know I'm stuck here. I've been thinking in circles for a while. At the moment, I'm leaning towards rich type system and structured data, but I'm not sure if it can be made fully convenient for the shell.

Do you know if anyone attempted to summarize this debate and distill some conclusions, or reframe it in a way that would allow to make progress?

> I’m discovering more and more that CL’s REPL in SLIME is my preferred shell

In terms of command line or scripting? SLIME is awesome, particularly with its interactive Inspector :). And I wrote my fair share of "scripts" as CL functions. But I can't seem to get used to using the REPL as a shell; I feel something is missing. Most likely convenience functions (that I didn't bother to write for myself yet).

That whole paragraph you wrote applies to another Lisp system, though: Emacs. In recent years, I've been leaning on it more and more for day-to-day operations. For instance, I rarely use shell for file operations - I mostly stick to dired. I end up scripting common operations straight in Emacs Lisp, and bind them to ad-hoc UIs (using the Hydra package). And of course utilize well-known packages like Magit (for Git). This recent experience makes me think that we could pull more common shell interactions and turn them from 1D to 2D interface. And I keep dreaming about merging it with PowerShell, in a way that allows Emacs to ingest and manipulate .NET objects nicely, while at the same time exposing its internals to PowerShell.

> Also, the claim that you need n^2 encoder/decoders isn’t actually true: conventions around data formats can reduce it to O(n) in the number of conventions.

I think this assumes conversions are lossless, which isn't the case in UNIX piping. When you invoke "tools like cut, jq, grep, awk, and sed", it's almost always to filter out most of the text in the pipeline.

Re:The Dawn of a new Command Line Interface (2017) by kaba0 on Tuesday April 13, 2021 @08:54AM (#26791495)
To be honest, I’ve been thinking about a shell based on the JVM. Especially now with GraalVM, you can have truly polyglot programs running on top of it, with inlinig cross-language boundaries! But of course native code execution should be “bootstrapped” into that world somehow. (Actually, it can use LLVM IR and that as well can run a C function on js objects which is phenomenal, but people do want to run native software from a shell)
Re:The Dawn of a new Command Line Interface (2017) by rbanffy on Tuesday April 13, 2021 @09:05AM (#26791616)
While you'll be able to invoke methods on returned objects, if you are piping stuff, you'll still need to deal with hammering the output of one program into the input of another.
Re:The Dawn of a new Command Line Interface (2017) by rkangel on Tuesday April 13, 2021 @06:54AM (#26790534)
It is worth noting that this article is from 2017.
Re:The Dawn of a new Command Line Interface (2017) by p_l on Tuesday April 13, 2021 @07:14AM (#26790683)
Which is over 5 years after Powershell became common.
Re:The Dawn of a new Command Line Interface (2017) by INTPenis on Tuesday April 13, 2021 @07:25AM (#26790768)
Yes but some would argue Psh didn't become useful until release 6 in 2018.
Re:The Dawn of a new Command Line Interface (2017) by indymike on Tuesday April 13, 2021 @09:02AM (#26791591)
As long as I have to write C# wrappers to launch commands like I would in unix with xargs or parallel in PowerShell it's still not the ticket.
Re:The Dawn of a new Command Line Interface (2017) by p_l on Tuesday April 13, 2021 @09:53AM (#26792128)
And neither of those are native parts of shells but external applications, dare I say, just like the C# wrappers. (Especially parallel, since it's nowhere close to default install, and has very pesky license notice).

OTOH, PS 7.0 added ForEach -Parallel

Re:The Dawn of a new Command Line Interface (2017) by indymike on Tuesday April 13, 2021 @06:20PM (#26800116)
Yeah, but & is a thing and will do the job nicely as long as you don't try to pipe output to the same file... also, you can invoke pretty much any command with xargs... the issue was escaping escaped stuff with PowerShell. Hopefully things have gotten better.
Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @09:33AM (#26791897)
You shouldn't need to, unless your PowerShell installation doesn't support Invoke-Command, or ForEach-Object -Parallel...
Re:The Dawn of a new Command Line Interface (2017) by indymike on Tuesday April 13, 2021 @04:07PM (#26798438)
Yeah... shouldn't need to but... there are issues with escaping command line parameters with invoke-command and ForEach-Object that prevent parallelizing older cmd-style command line applications. The work around is to write a wrapper in a compiled language and use PowerShell to invoke the wrapper... There's a lot of really cool stuff in PowerShell.
Re:The Dawn of a new Command Line Interface (2017) by TeMPOraL on Tuesday April 13, 2021 @05:40PM (#26799697)
> there are issues with escaping command line parameters with invoke-command and ForEach-Object that prevent parallelizing older cmd-style command line applications.

Can you tell me more? So I know what to expect when I hit such issue myself.

> The work around is to write a wrapper in a compiled language and use PowerShell to invoke the wrapper...

Wonder if you need to really break out of PowerShell for this.

Recently when doing some scripting at work, I ended up writing .NET code straight in the script. It looks like this:

  $someCSharp = @"
  using System;
  //...
  public class Foo : Bar {
     public override object Baz(Quux arg) {
       //...
     }
  }
  "@
  
  Add-Type $someCSharp -ReferencedAssemblies C:\Path\To\Some\dependency-I-need.dll
This makes PowerShell compile your code into an in-memory assembly and make it available in the session, just as if it was an external .NET type. You could probably make a module out of it. Hell, cmdlets are .NET types underneath, you can make new ones from C#, so you could probably make such ad-hoc .NET classes available as PowerShell cmdlets.

I suppose using a proper .NET development environment for this would be more kosher; I arrived at the solution described above because my needs were simple, like binding .NET regex engine to SQLite (to get REGEXP operator in queries), or convincing Invoke-RestMethod to stop checking certificate validity.

Still, I love the capability, the fact that I can just drop into C# in the middle of the script. It's one of those things that make me think of Lisp machines and Common Lisp the experience of being able to deeply interact with your environment, and the joy of writing "scripts" that are automatically AOT-compiled (like with SBCL implementation of Common Lisp).

Re:The Dawn of a new Command Line Interface (2017) by p_l on Tuesday April 13, 2021 @07:45AM (#26790908)
That would be... an opinion. Not very grounded one unless one's whole base for it was "I couldn't use it on Linux".