🐚 Python-powered shell. Full-featured and cross-platform.
Find a file
Andy Kipp 0f25a5a348
Read stop signals from the process and update the process state. (#5361)
Reading stop signals from the process and update the process state.

### The issue

Technically. In a couple of places that critical for processing signals
we have `os.waitpid()`. The function behavior is pretty unobvious and
one of things is processing return code after catching the signal. We
had no good signal processing around this and this PR fixes this. See
also `proc_untraced_waitpid` function description.

From user perspective. For example we have process that is waiting for
user input from terminal e.g. `python -c "input()"` or `fzf`. If this
process will be in captured pipeline e.g. `!(echo 1 | fzf | head)` it
will be suspended by OS and the pipeline will be in the endless loop
with future crashing and corrupting std at the end. This PR fixes this.

### The solution

Technically. The key function is `proc_untraced_waitpid` - it catches
the stop signals and updates the process state.

From user perspective. First of all we expect that users will use
captured object `!()` only for capturable processes. Because of it our
goal here is to just make the behavior in this case stable.
In this PR we detect that process in the pipeline is suspended and we
need to finish the command pipeline carefully:
* Show the message about suspended process.
* Keep suspended process in `jobs`. The same behavior we can see in
bash. This is good because we don't know what process suspended and why.
May be experienced user will want to continue it manually.
* Finish the CommandPipeline with returncode=None and suspended=True.

### Before

```xsh
!(fzf) # or !(python -c "input()")
# Hanging / Exceptions / OSError / No way to end the command.
# After exception:
$(echo 1)
# OSError / IO error
```

### After

```xsh
!(fzf) # or `!(ls | fzf | head)` or `!(python -c "input()")`
# Process ['fzf'] with pid 60000 suspended with signal 22 SIGTTOU and stay in `jobs`.
# This happends when process start waiting for input but there is no terminal attached in captured mode.
# CommandPipeline(returncode=None, suspended=True, ...)

$(echo 1)
# Success.
```
Closes #4752 #4577

### Notes

* There is pretty edge case situation when the process was terminated so
fast that we can't catch pid alive and check signal
([src](67d672783d/xonsh/jobs.py (L71-L80))).
I leave it as is for now.

### Mentions

#2159

## 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>
Co-authored-by: Gil Forsyth <gforsyth@users.noreply.github.com>
2024-05-22 11:45:39 -04:00
.devcontainer Codespaces and devcontainer.json (#5158) 2023-06-21 22:23:46 +05:30
.github chore: use stable 3.12 for CI jobs (#5307) 2024-05-16 15:43:57 +05:30
appimage Update AppImage pre-requirements.txt (#5404) 2024-05-09 22:31:19 +02:00
ci fix: xonfig web is not upto-date (#4606) 2022-01-18 11:11:16 -05:00
docs Now last executed CommandPipeline is available in `__xonsh__.last` (#5422) 2024-05-22 09:25:35 -04:00
news Read stop signals from the process and update the process state. (#5361) 2024-05-22 11:45:39 -04:00
scripts re-run CI tests 2020-08-08 14:02:44 -04:00
tests Read stop signals from the process and update the process state. (#5361) 2024-05-22 11:45:39 -04:00
xompletions feat: add xontrib-django 2022-04-12 14:19:15 +05:30
xonsh Read stop signals from the process and update the process state. (#5361) 2024-05-22 11:45:39 -04: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: use stable 3.12 for CI jobs (#5307) 2024-05-16 15:43:57 +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 (#5412) 2024-05-13 21:22:46 +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 Downgrade prompt-toolkit to >=3.0.29,<3.0.40 (#5403) 2024-05-09 09:13:03 -04:00
README.rst Add Jupytext to news (#5402) 2024-05-10 11:03:44 +02:00
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.
- `Jupytext <https://jupytext.readthedocs.io/>`_: Clear and meaningful diffs when doing Jupyter notebooks version control.

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!