Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I would not advise to replace your interactive shell with it as it's a pain when you stumble upon uncompatible commands, but writing shell scripts with xonsh is a wonderful experience.


I use fish, so it's not a problem for me. When I tried it 4 years ago it's was a bit unstable, which made me switch back to fish. Also fish is much more polished and user friendly out of the box.


Can you talk about how is it different than writing python scripts? Or writing test code in the python console?


Feels like the only benefit is not having to write os.system(). Though maybe including shell scripts (like build environment setup stuff from other software) for more complicated commands? I may give this a try for a bit to find out


This the perfection, why would you want anything more?

  import os
  def sh(x):
      return os.popen(x).read().split("\n")


os.system doesn't actually change your environment:

    >>> os.getcwd()
    'C:\\Users\\Admin\\Downloads'
    >>> os.system("cd Video")
    0
    >>> os.getcwd()
    'C:\\Users\\Admin\\Downloads'
    >>>


In a xonsh script, you can have regular statements like "cd", "ls", and pretty much everything.

It's just like Bash scripting, except in Python. You can mix and match Python statements with regular shell commands.


I have never tried it but I would probably prefer to use sh ( https://pypi.org/project/sh/ ) and have users install that before having to use a totally separate shell. Python is normally already there.


Cursory look at the docs:

    sh.ls("-l", "/tmp", color="never")
Oh dear - no. A lot less ergonomic than "ls -l /tmp".

If all you want is a convenient way to call commands from Python scripts, sh makes sense. The benefit of xonsh, though, is that it is a shell :-)

So, for example, if you want to have a fancy prompt, you can use Python functions to construct your fancy prompt. If you want to manipulate your $PATH as a list (or any similar environment variable), you just treat it like a Python list and do whatever you want with it.

I often write simple conditionals/for loops right on the prompt (not via a shell script). I use the Python syntax, but call whatever command I want and manipulate it.

And it's really handy that the shell prompt is a Python prompt - you can import any Python library and play with it. I never run "python" to get to a Python prompt. I have it available at all times. I want to look at a docstring for a standard Python function? I just do it at the command line.


For me it shines when you need to write shell scripts but you prefer do some parts in python. As another commenter wrote os.system or calling the subprocess module works too, but I find it less satisfying.


What are some examples of incompatible commands?


I don't remember exactly why and how some shell scripts refused to run, but on top of my head I think 'alias' was not working and 'sudo !!' too.


I hope you're not trying to source regular Bash scripts without using source-bash.

I've used xonsh as my primary shell for many years now. The Bash compatibility was poor initially, but they fixed most/all the issues, and source-bash just works.

I use Gentoo, and don't actually use sudo, so I can't comment on that (I just su into root).


Interesting! I think I never tried to update xonsh in 7 years or so.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: