🐚 Python-powered shell. Full-featured and cross-platform.
Find a file
Andy Kipp 21da30e753
Fixed populating the return code for interrupted process. (#5380)
### Motivation

There is annoying behavior when you run command in the loop and can't
interrupt e.g. [this
report](https://github.com/xonsh/xonsh/discussions/5371) and a bit
#5342. After diving into this I see the issue around return code.

### The essence

Basically ``p = subprocess.Popen()`` populates ``p.returncode`` after
``p.wait()``, ``p.poll()`` or ``p.communicate()``
([doc](https://docs.python.org/3/library/os.html#os.waitpid)). But if
you're using `os.waitpid()` BEFORE these functions you're capturing
return code from a signal subsystem and ``p.returncode`` will be ``0``
like success but it's not success. So after ``os.waitid`` call you need
to set return code manually ``p.returncode = -os.WTERMSIG(status)`` like
in Popen. Example:
```xsh
python  # python interactive

import os, signal, subprocess as sp

p = sp.Popen(['sleep', '100'])
p.pid
# 123
p.wait()
# Ctrl+C or `kill -SIGINT 123` from another terminal
p.returncode
# -2

# BUT:

p = sp.Popen(['sleep', '100'])
p.pid
# 123

pid, status = os.waitpid(p.pid, os.WUNTRACED)
# status=2

# From another terminal:
kill -SIGINT 123

p.wait()
# 0
p.returncode
# 0
```

```xsh
from xonsh.tools import describe_waitpid_status
describe_waitpid_status(2)
# WIFEXITED - False - Return True if the process returning status exited via the exit() system call.
# WEXITSTATUS - 0 - Return the process return code from status.
# WIFSIGNALED - True - Return True if the process returning status was terminated by a signal.
# WTERMSIG - 2 - Return the signal that terminated the process that provided the status value.
# WIFSTOPPED - False - Return True if the process returning status was stopped.
# WSTOPSIG - 0 - Return the signal that stopped the process that provided the status value.
```

See also: [Helpful things for
knight](https://github.com/xonsh/xonsh/pull/5361#issuecomment-2078826181).

### Before

```xsh
$RAISE_SUBPROC_ERROR = True

sleep 100
# Ctrl+C
_.rtn
# 0  # It's wrong and RAISE_SUBPROC_ERROR ignored.

for i in range(5):
    print(i)
    sleep 5
# 0
# Ctrl+C  # Can't interrupt
# 1
# 2 
```

### After
```xsh
sleep 100
# Ctrl+C
_.rtn
# -2  # Like in default Popen

$RAISE_SUBPROC_ERROR = True
for i in range(5):
    print(i)
    sleep 5
# 0
# Ctrl+C
# subprocess.CalledProcessError
```

### Notes

* We need to refactor `xonsh.jobs`. It's pretty uncomfortable work with
module.
* The logic is blurry between Specs, Pipelines and Jobs. We need to
bring more clear functions.
* The `captured` variable looks like "just the way of capturing (stdout,
object)" but in fact it affects all logic very much. We need to create
table where we can see the logic difference for every type of capturing.
E.g. in `captured=stdout` mode we use `xonsh.jobs` to monitor the
command but in `captured=object` we avoid this and some logic from
`xonsh.jobs` applied in `stdout` mode but missed in `object` mode. We
need clear map.

## For community
⬇️ **Please click the 👍 reaction instead of leaving a `+1` or 👍
comment**

---------

Co-authored-by: a <1@1.1>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-05-02 22:10:53 +02:00
.devcontainer Codespaces and devcontainer.json (#5158) 2023-06-21 22:23:46 +05:30
.github chore: Update publish.yml python versions (#5359) 2024-04-24 08:43:04 +02:00
appimage fix(appimage): quote version bounds in appimage prereqs 2024-04-23 14:34:29 -04:00
ci fix: xonfig web is not upto-date (#4606) 2022-01-18 11:11:16 -05:00
docs Update tutorial.rst: remove new line chars (#5382) 2024-05-02 18:01:06 +02:00
news Fixed populating the return code for interrupted process. (#5380) 2024-05-02 22:10:53 +02:00
scripts re-run CI tests 2020-08-08 14:02:44 -04:00
tests Fixed populating the return code for interrupted process. (#5380) 2024-05-02 22:10:53 +02:00
xompletions feat: add xontrib-django 2022-04-12 14:19:15 +05:30
xonsh Fixed populating the return code for interrupted process. (#5380) 2024-05-02 22:10:53 +02:00
xontrib [pre-commit.ci] pre-commit autoupdate (#5271) 2024-01-30 12:23:50 +01:00
.authors.yml Updated authorship for 0.16.0 2024-04-23 14:34:30 -04:00
.coveragerc refactor(amalgamate): remove amalgamation (#4858) 2022-07-04 10:40:16 +05:30
.gitattributes Remove syntax override for .xsh files (#4554) 2021-11-22 10:07:04 -05:00
.gitignore chore: ignore more pdm files 2024-04-20 23:44:26 +05:30
.mailmap Updated authorship for 0.16.0 2024-04-23 14:34:30 -04:00
.pre-commit-config.yaml [pre-commit.ci] pre-commit autoupdate (#5376) 2024-04-30 13:42:32 +02:00
AUTHORS.rst Updated authorship for 0.16.0 2024-04-23 14:34:30 -04:00
CHANGELOG.rst Updated CHANGELOG for 0.16.0 2024-04-23 14:34:31 -04:00
conftest.py use recommended pytest entry point in docs and comments (#4671) 2022-02-19 01:45:45 +05:30
CONTRIBUTING.rst docs: update contribution guide 2024-04-16 11:23:35 -04:00
FUNDING.yml Become a sponsor to xonsh (#5167) 2023-07-01 13:15:06 +00:00
github_deploy_key.enc publish dev and latest release docs on xonsh-docs 2016-10-20 19:48:38 -04:00
license copyright update 2016-06-30 12:24:55 -04:00
logo.txt accomodate pip bug by making setup.py ascii 2015-11-16 15:12:02 -08:00
MANIFEST.in refactor(amalgamate): remove amalgamation (#4858) 2022-07-04 10:40:16 +05:30
pyproject.toml refactor: update line length to default setting 2024-04-16 11:23:35 -04:00
README.rst chore(README): remove old CI status badges, light language polish 2024-04-29 21:16:17 +05:30
rever.xsh Downgrade AppImage to 3.11 (#5364) 2024-04-25 11:46:36 +02:00
run-tests.xsh refactor(amalgamate): remove amalgamation (#4858) 2022-07-04 10:40:16 +05:30
setup.cfg refactor: update line length to default setting 2024-04-16 11:23:35 -04:00
setup.py docs: Fix a few typos (#4889) 2022-07-23 04:42:46 +05:30
xonsh-in-docker.py Ruff linter (#5118) 2023-04-19 12:59:32 +00:00

xonsh
=====

.. class:: center

    **xonsh** is a Python-powered, cross-platform, Unix-gazing shell language and command prompt.

    The language is a superset of Python 3.6+ with additional shell primitives.
    xonsh (pronounced *conch*) is meant for the daily use of experts and novices alike.

    .. image:: https://raw.githubusercontent.com/xonsh/xonsh/main/docs/_static/what_is_xonsh.png
            :alt: What is xonsh?
            :align: center

.. class:: center

    If you like xonsh, :star: the repo, `write a tweet`_ and stay tuned by watching releases.

    .. image:: https://img.shields.io/badge/Zulip%20Community-xonsh-green
            :target: https://xonsh.zulipchat.com/join/hbvue5rimpdkwkdjuiqfs7tv/
            :alt: Join to xonsh.zulipchat.com

    .. image:: https://github.com/xonsh/xonsh/actions/workflows/test.yml/badge.svg
            :target: https://github.com/xonsh/xonsh/actions/workflows/test.yml
            :alt: GitHub Actions

    .. image:: https://codecov.io/gh/xonsh/xonsh/branch/master/graphs/badge.svg?branch=main
            :target: https://codecov.io/github/xonsh/xonsh?branch=main
            :alt: codecov.io

    .. image:: https://repology.org/badge/tiny-repos/xonsh.svg
            :target: https://repology.org/project/xonsh/versions
            :alt: repology.org

First steps
***********

Install xonsh from pip:

.. code-block:: xonshcon

    python -m pip install 'xonsh[full]'

And visit https://xon.sh for more information:

- `Installation <https://xon.sh/contents.html#installation>`_ - using packages, docker or AppImage.
- `Tutorial <https://xon.sh/tutorial.html>`_ - step by step introduction in xonsh.

Extensions
**********

Xonsh has an extension/plugin system.  We call these additions ``xontribs``.

- `Xontribs on Github <https://github.com/topics/xontrib>`_
- `Awesome xontribs <https://github.com/xonsh/awesome-xontribs>`_
- `Core xontribs <https://xon.sh/api/_autosummary/xontribs/xontrib.html>`_
- `Create a xontrib step by step from template <https://github.com/xonsh/xontrib-template>`_

Projects that use xonsh or compatible
*************************************

- `gitsome <https://github.com/donnemartin/gitsome>`_: Supercharged Git/shell autocompleter with GitHub integration.
- `xxh <https://github.com/xxh/xxh>`_: Using xonsh wherever you go through the SSH.
- `rever <https://regro.github.io/rever-docs/>`_: Cross-platform software release tool.
- `Regro autotick bot <https://github.com/regro/cf-scripts>`_: Regro Conda-Forge autoticker.
- `zoxide <https://github.com/ajeetdsouza/zoxide>`_: A smarter cd command.
- `any-nix-shell <https://github.com/haslersn/any-nix-shell>`_: xonsh support for the ``nix run`` and ``nix-shell`` environments of the Nix package manager.

Jupyter-based interactive notebooks via `xontrib-jupyter <https://github.com/xonsh/xontrib-jupyter>`_:

- `jupyter and jupyterlab <https://jupyter.org/>`_: Interactive notebook platform.
- `euporie <https://github.com/joouha/euporie>`_: Terminal based interactive computing environment.

The xonsh shell community
*************************

The xonsh shell is developed by a community of volunteers. There are a few ways to help out:

- Solve a `popular issue <https://github.com/xonsh/xonsh/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc>`_. You can start with the `Developer guide <https://xon.sh/devguide.html>`_.
- Solve a `good first issue <https://github.com/xonsh/xonsh/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+sort%3Areactions-%2B1-desc>`_.
- Take an `idea <https://github.com/xonsh/xontrib-template/issues?q=is%3Aopen+is%3Aissue+label%3Aidea+sort%3Areactions-%2B1-desc>`_ and `create a new xontrib <https://github.com/xonsh/xontrib-template#why-use-this-template>`_.
- Become xonsh core by deep diving into xonsh and improve the threading and subprocess logic.
- `Become a sponsor to xonsh <https://github.com/sponsors/xonsh>`_.
- `Write a tweet`_, post or an article to spread the good word about xonsh in the world.
- Give a star to xonsh repository and to `xontribs <https://github.com/topics/xontrib>`_ you like.

We welcome new contributors!

.. _write a tweet: https://twitter.com/intent/tweet?text=xonsh%20is%20a%20Python-powered,%20cross-platform,%20Unix-gazing%20shell%20language%20and%20command%20prompt.&url=https://github.com/xonsh/xonsh

Credits
*******

- Thanks to `Zulip <https://zulip.com/>`_ for supporting the xonsh community!