xonsh/docs/bash_to_xsh.rst

128 lines
5.3 KiB
Bash
Raw Normal View History

2016-02-04 22:37:45 -05:00
Bash to Xonsh Translation Guide
================================
2016-02-21 16:25:16 -05:00
As you have probably figured out by now, xonsh is not ``sh``-lang compliant.
2016-02-04 22:37:45 -05:00
If your muscles have memorized all of the Bash prestidigitations, this page
will help you put a finger on how to do the equivalent task in xonsh.
2016-02-04 22:37:45 -05:00
For shell scripts, the recommended file extension is ``xsh``, and shebang
line is ``#!/usr/bin/env xonsh``.
2016-05-07 13:40:55 -04:00
.. list-table::
2016-02-04 22:37:45 -05:00
:widths: 30 30 40
:header-rows: 1
* - Bash
- Xonsh
- Notes
* - ``$NAME`` or ``${NAME}``
- ``$NAME``
- Look up an environment variable by name.
* - ``export NAME=Peter``
- ``$NAME = 'Peter'``
2020-05-27 09:31:44 +03:00
- Setting an environment variable. See also :ref:`$UPDATE_OS_ENVIRON <update_os_environ>`.
* - ``unset NAME``
- ``del $NAME``
- Unsetting/deleting an environment variable.
2016-06-07 23:19:31 -04:00
* - ``echo "$HOME/hello"``
- ``echo "$HOME/hello"``
- Construct an argument using an environment variable.
* - ``something/$SOME_VAR/$(some_command)``
- ``@('something/' + $SOME_VAR + $(some_command).strip())``
- Concatenate a variable or text with the result of running a command.
2016-06-07 23:19:31 -04:00
* - ``${!VAR}``
2016-02-04 22:37:45 -05:00
- ``${var or expr}``
2016-05-07 13:40:55 -04:00
- Look up an environment variable via another variable name. In xonsh,
2016-02-04 22:37:45 -05:00
this may be any valid expression.
2020-09-25 03:14:12 +03:00
* - ``ENV1=VAL1 command``
2020-09-25 03:13:43 +03:00
- ``$ENV1=VAL1 command`` or ``with ${...}.swap(ENV1=VAL1): command``
2020-09-25 02:57:41 +03:00
- Set temporary environment variable(s) and execute the command.
Use the second notation with an indented block to execute many commands in the same context.
2020-09-25 03:11:50 +03:00
* - ``alias ll='ls -la'``
- ``aliases['ll'] = 'ls -la'``
- Alias in xonsh could be a subprocess command as a string or list of arguments or any Python function.
2016-02-04 22:37:45 -05:00
* - ``$(cmd args)`` or ```cmd args```
2016-05-20 19:55:56 -04:00
- ``@$(cmd args)``
- Command substitution (allow the output of a command to replace the
command itself). Tokenizes and executes the output of a subprocess
command as another subprocess.
2020-09-25 02:50:22 +03:00
* - ``find ~/ -name bashrc -exec wc '{}' \;``
- ``find ~/ -name bashrc -exec wc '{}' ';'``
2020-09-25 02:57:41 +03:00
- There is no notion of an escaping character in xonsh like the backslash (``\``) in bash.
2020-09-25 02:50:22 +03:00
Single or double quotes can be used to remove the special meaning of certain
characters or words.
* - ``v=`echo 1```
- ``v=$(echo 1)``
2020-09-25 02:57:41 +03:00
- In bash, backticks mean to run a captured subprocess - it's ``$()`` in xonsh. Backticks in xonsh
2020-09-25 02:50:22 +03:00
mean regex globbing (i.e. ``ls `/etc/pass.*```).
2020-09-25 02:57:41 +03:00
* - ``shopt -s dotglob``
- ``$DOTGLOB = True``
2020-09-25 03:04:40 +03:00
- Globbing files with ``*`` or ``**`` will also match dotfiles, or those hidden files whose names
begin with a literal `.`. Such files are filtered out by default like in bash.
2020-09-25 02:57:41 +03:00
* - ``if [ -f "$FILE" ];``
- ``p'/path/to/file'.exists()`` or ``pf'{file}'.exists()``
- Path objects can be instantiated and checked directly using p-string syntax.
2016-02-04 22:37:45 -05:00
* - ``set -e``
- ``$RAISE_SUBPROC_ERROR = True``
2016-05-07 13:40:55 -04:00
- Cause a failure after a non-zero return code. Xonsh will raise a
2016-02-04 22:37:45 -05:00
``supbrocess.CalledProcessError``.
* - ``set -x``
- ``trace on`` and ``$XONSH_TRACE_SUBPROC = True``
2016-02-04 22:37:45 -05:00
- Turns on tracing of source code lines during execution.
2016-02-10 03:22:30 -05:00
* - ``&&``
2020-09-25 02:57:41 +03:00
- ``&&`` or ``and``
2016-02-10 03:22:30 -05:00
- Logical-and operator for subprocesses.
* - ``||``
2020-09-25 02:57:41 +03:00
- ``||`` as well as ``or``
2016-02-10 03:22:30 -05:00
- Logical-or operator for subprocesses.
2016-05-07 13:40:55 -04:00
* - ``$?``
- ``_.rtn``
2020-09-25 00:15:55 +03:00
- Returns the exit code, or status, of the previous command. The underscore ``_`` is working
in the prompt mode. To get the exit code of the command in xonsh script
2020-09-25 00:16:49 +03:00
use captured subprocess ``!().rtn``.
2016-09-02 13:33:45 +03:00
* - ``!$``
2018-09-30 13:59:08 -07:00
- ``__xonsh__.history[-1, -1]``
2016-09-02 13:33:45 +03:00
- Get the last argument of the last command
* - ``$<n>``
- ``$ARG<n>``
- Command line argument at index ``n``,
so ``$ARG1`` is the equivalent of ``$1``.
* - ``$@``
- ``$ARGS``
- List of all command line argument and parameter strings.
2020-09-25 03:24:03 +03:00
* - ``while getopts "h?vf:" opt; do``
- ``import argparse``
2020-09-25 03:31:30 +03:00
- Start from `argparse <https://docs.python.org/3/library/argparse.html>`_ library to describe
the command line arguments in your script.
* - ``complete``
- ``completer list``
- As with many other shells, xonsh ships with the ability to complete partially-specified arguments
upon hitting the “tab” key.
2020-05-27 09:31:44 +03:00
* - Display completions as list
- ``$COMPLETIONS_DISPLAY = 'readline'``
- Display completions will emulate the behavior of readline.
2020-05-12 17:37:15 +03:00
* - ``exit``
2020-05-12 19:10:13 +03:00
- ``sys.exit()``
2020-05-12 17:37:15 +03:00
- Exiting from the current script.
To understand how xonsh executes the subprocess commands try
to set :ref:`$XONSH_TRACE_SUBPROC <xonsh_trace_subproc>` to ``True``:
.. code-block:: console
>>> $XONSH_TRACE_SUBPROC = True
>>> echo $(echo @('hello')) @('wor' + 'ld') | grep hello
TRACE SUBPROC: (['echo', 'hello'],)
TRACE SUBPROC: (['echo', 'hello\n', 'world'], '|', ['grep', 'hello'])
2020-09-24 23:39:36 +03:00
If after time you still try to type ``export``, ``unset`` or ``!!`` commands
2020-09-24 23:42:39 +03:00
there is `bashisms xontrib <https://xon.sh/xontribs.html#bashisms>`_:
2020-09-24 23:39:36 +03:00
.. code-block:: console
>>> xontrib load bashisms
>>> echo echo
echo
>>> !!
echo