チュートリアル

xonshはシェル言語とコマンドプロンプトです。他のシェルとは異なり、xonshはPythonをベースにしており、サブプロセスコマンドの呼び出し、環境の操作、ファイルシステムの処理を容易にする構文が追加されています。xonshコマンド・プロンプトは、ユーザーにxonsh言語への対話式アクセスを提供します。

すべてのPythonコードもxonshですが、すべてのBashコードをxonshで使用できるわけではありません。それは目的を破るだろうし、とにかくPythonは優れている!それでもxonshは、コマンドの実行、Bash環境での読み込み、Bashタブ補完の利用など、重要な点でBash-wards互換です。

このチュートリアルの目的は、あなたにxonshを教えることです。Pythonを学ぶための優れたガイドがたくさんありますが、これは彼らのランクには参加しません。同様に、既にコマンドプロンプトまたはインタラクティブなインタプリタを使用している場合は、このチュートリアルを最大限に活用できます。

中に潜んでみましょう!

xonshの起動

xonsh(http://xon.shを参照が正常にインストールされていると仮定すると、xonshインタープリターをxonshコマンドで起動することができますあなたがより小さい端末にいると仮定してください:

$ xonsh
snail@home ~ $

今私たちはxonshシェルにいます。私たちのユーザ名はまるでsnail私たちのホスト名homeであり、ホームディレクトリ(~)にあります。あるいは、ターミナルエミュレータ(xterm、gnome-terminalなど)が起動時にxonshを自動的に実行するように設定することもできます。これはお勧めです。

基本

xonsh言語はPythonに基づいており、xonshシェルはPythonを使用してそれが受け取るすべての入力を解釈します。これは算術のような単純なものを単純にします:

>>> 1 + 1
2

注意

ここから>>>、xonsh入力の接頭辞(またはプロンプト)を使用します。これはPythonの規約に従い、シンタックスハイライトをトリックするのに役立ちますが、$シェルにとってはより伝統的です。

これは単なるPythonなので、モジュールをインポートしたり、値を出力したり、Pythonの他の組み込み関数を使うことができます:

>>> import sys
>>> print(sys.version)
3.4.2 |Continuum Analytics, Inc.| (default, Oct 21 2014, 17:16:37)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]

また、int、float、リスト、セット、辞書などのリテラルデータ型を作成して使用することもできます。あなたが既にPythonを知っているなら、あなたが慣れ親しんでいることはすべてそこにあります:

>>> d = {'xonsh': True}
>>> d.get('bash', False)
False

xonshシェルは、より高度なフロー制御のための複数行入力もサポートしています。マルチラインモードは、入力の最初の行が単独で構文的に有効でないときは常に自動的に入力されます。カーソルが最初の列にあるときにEnter(またはReturn)を押すと、複数行モードが終了します。

>>> if True:
...     print(1)
... else:
...     print(2)
...
1

もちろん、フロー制御にはループも含まれます。

>>> for i, x in enumerate('xonsh'):
...     print(i, x)
...
0 x
1 o
2 n
3 s
4 h

関数とクラスを定義して呼び出すこともできます。私はあなたに細部を惜しみませんが、これかなりクールです:

>>> def f():
...     return "xonsh"
...
>>> f()
'xonsh'

インデントを簡単にするために、Shift + Tabは4つのスペースを入力します。そして、それについては基本セクションのためにまとめます。これはPythonのようなものです。

環境変数

環境変数は$、名前の後ろに記述されます。たとえば、 $HOME$PWD、と$PATH

>>> $HOME
'/home/snail'

Pythonで他の変数を設定する場合と同様に、環境変数を設定(およびエクスポート)することができます。それらも削除しても同じことが言えます。

>>> $GOAL = 'Become the Lord of the Files'
>>> print($GOAL)
Become the Lord of the Files
>>> del $GOAL

非常に素晴らしい。

環境そのもの${...}

すべての環境変数は、組み込み${...}(別名__xonsh__.env)マッピングで使用されます。このマッピングには直接アクセスすることができますが、ほとんどの場合、必要はありません。

あなたの現在のセッションに環境変数が存在するかどうか(例えば素晴らしいxonshスクリプト内にあるかどうか)を確認する場合は、メンバーシップ演算子を使用できます:

>>> 'HOME' in ${...}
True

特定の環境変数に関する情報を取得するには、このhelp()メソッドを使用できます

>>> ${...}.help('XONSH_DEBUG')

その上で役に立つ方法の一つ${...}ですswap()環境変数を一時的に設定するために使用することができます:

>>> with ${...}.swap(SOMEVAR='foo'):
...     echo $SOMEVAR
...
...
foo
>>> echo $SOMEVAR

>>>

環境ルックアップ${<expr>}

$NAMEルックアップしたい環境変数の名前を知っている限り、これは素晴らしいことです。しかし、プログラムで名前を構築したい場合や、別の変数から名前を読みたい場合はどうすればよいでしょうか?${} 演算子を入力します。

警告

Bashでは$NAME${NAME}構文的に同等です。xonshでは、彼らは別の意味を持っています。

中括弧内に有効なPython式を置くことができます ${<expr>}この式のこの結果は、環境内の値をルックアップするために使用されます。実際に動作している例は次のとおりです。

>>> x = 'USER'
>>> ${x}
'snail'
>>> ${'HO' + 'ME'}
'/home/snail'

悪くない、xonsh、悪くない。

環境タイプ

Pythonの他の変数と同様に、環境変数には型があります。このタイプは、変数名に基づいて課されることもあります。現在のルールは非常にシンプルです:

  • \w*PATH:名前がPATHで終わる変数はすべて文字列のリストです。
  • \w*DIRS:DIRSで終わる名前の変数は、文字列のリストです。
  • XONSH_HISTORY_SIZE:この変数はintです。
  • CASE_SENSITIVE_COMPLETIONS:この変数はブール値です。

xonshは必要に応じて(主にサブプロセスコマンドによって)環境の型なしの(文字列のみの)表現に自動的に前後に変換します。xonshの場合は、常に型付きのバージョンがあります。ここにはPATHの例がいくつかあります:

>>> $PATH
['/home/snail/.local/bin', '/home/snail/sandbox/bin',
'/home/snail/miniconda3/bin', '/usr/local/bin', '/usr/local/sbin',
'/usr/bin', '/usr/sbin', '/bin', '/sbin', '.']
>>> $LD_LIBRARY_PATH
['/home/snail/.local/lib', '']

またことに注意して任意の Pythonオブジェクトは、環境に行くことができます。関数のようなより洗練された型を環境に持たせることは時には便利です。xonshが特別だと考える環境変数がいくつかあります。それらは環境変数ページで見ることができます

注意

サブプロセスモードでは、未定義の環境変数を参照すると空の文字列が生成されます。ただし、Pythonモードでは、KeyError変数が環境内に存在しない場合は、a が生成されます。

コマンドの実行

シェルとして、xonshはコマンドを簡単かつ楽しく実行するためのものです。サブプロセスコマンドの実行は、他のシェルでも同様に動作します。

>>> echo "Yoo hoo"
Yoo hoo
>>> cd xonsh
>>> ls
build  docs     README.rst  setup.py  xonsh           __pycache__
dist   license  scripts     tests     xonsh.egg-info
>>> dir scripts
xonsh  xonsh.bat
>>> git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   docs/tutorial.rst

no changes added to commit (use "git add" and/or "git commit -a")
>>> exit

これは非常に自然に感じるはずです。

Pythonモードとサブプロセスモード

純粋なPythonモードで動作する行と、シェル固有の構文を使用する行、実行環境を編集する行、およびコマンドを実行する行を区別すると便利なことがあります。残念ながら、構文だけでは、どのモードが望ましいかは必ずしも明らかではありません。このあいまいさは、ほとんどのコマンドラインユーティリティがPython演算子によく似ていることに起因しています。

の場合を取るこれは有効なPythonコードですが、またはで記述することもできますだから、xonshはそれがサブプロセスモードで実行されることをどのように知っていますか?ls -lls - lls-lls -l

すべての名前が現在の変数として見つからない場合は、式文(expr-stmt、Python ASTのドキュメントを参照してください)のみを含む任意の行に対して、xonshはその行をサブプロセスコマンドとして解析しようとします。上記では、場合lsl変数ではありません、サブプロセスモードが試みられます。サブプロセスモードでの解析が失敗すると、その行はPythonモードになります。

次の例では、を使用してディレクトリの内容をリストします。次に、新しい変数名を作成してからそれらを減算します。最後に、ディレクトリを削除して再度一覧表示できるようにします。ls -llsllsl

>>> # this will be in subproc-mode, because ls doesn't exist
>>> ls -l
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh
>>> # set ls and l variables to force python-mode
>>> ls = 44
>>> l = 2
>>> ls -l
42
>>> # deleting ls will return us to subproc-mode
>>> del ls
>>> ls -l
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh

Pythonとサブプロセスモードの間の決定は、常に可能な限り安全な方法で行われます。何かがうまくいかない場合は、Pythonモードになります。2つのモードの間の決定は、実行の前に行われます。あなたは部分的に実行されたコマンドについて心配する必要はありません。不可能です。

サブプロセスコマンドを絶対に実行したい場合は、次のセクションで説明する構文を使用してxonshを強制的に実行させることができます。

引用符

一重引用符または二重引用符を使用して、特定の文字または単語の特別な意味をxonshに取り除くことができます。サブプロセス・コマンドにxonsh構文と衝突する文字が含まれている場合、xonshがそれらを解釈しないようにするには引用符を使用する必要があります。

>>> echo ${
...
SyntaxError: <xonsh-code>:1:5: ('code: {',)
echo ${
     ^
>>> echo '${'
${

警告

xonshにエスケープ文字がないという考えは、bashのバックスラッシュ(\)と同じです。

$()¶を使ってキャプチャされたサブプロセス!()

$(<expr>)xonsh 演算子は、サブプロセスコマンドを実行し、そのコマンドに関する情報取得します。

$()構文は、キャプチャし、Python文字列として、コマンドの標準出力ストリームを返します。これは$()、Bashでのパフォーマンスと似ています例えば、

>>> $(ls -l)
'total 0\n-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh\n'

この!()構文は、呼び出されたクラスのインスタンスとして、コマンドに関する詳細情報を取得しましたCommandPipelineこのオブジェクトには、戻りコード、プロセスID、標準出力および標準エラー・ストリーム、および入出力のリダイレクト方法に関する情報を含む、指定されたコマンドの結果に関する詳細情報が含まれています。例えば:

>>> !(ls nonexistent_directory)
CommandPipeline(stdin=<_io.BytesIO object at 0x7f1948182bf8>, stdout=<_io.BytesIO object at 0x7f1948182af0>, stderr=<_io.BytesIO object at 0x7f19483a6200>, pid=26968, returncode=2, args=['ls', 'nonexistent_directory'], alias=['ls', '--color=auto', '-v'], stdin_redirect=['<stdin>', 'r'], stdout_redirect=[9, 'wb'], stderr_redirect=[11, 'w'], timestamps=[1485235484.5016758, None], executed_cmd=['ls', '--color=auto', '-v', 'nonexistent_directory'], input=None, output=, errors=None)

このオブジェクトは、戻りコードが0で、戻りコードと等しい(ビア==場合は "真実"になり ます。それはまた、戻りコードにハッシュします。これにより、サブプロセスコマンドとのやりとりの面白い新しい種類の対話が可能になります。たとえば、次のようになります。

def check_file(file):
    if !(test -e @(file)):
        if !(test -f @(file)) or !(test -d @(file)):
            print("File is a regular file or directory")
        else:
            print("File is not a regular file or directory")
    else:
        print("File does not exist")

def wait_until_google_responds():
    while not !(ping -c 1 google.com):
        sleep 1

CommandPipelineオブジェクトを反復処理すると、出力の行が得られます。これを使用すると、コマンドの出力を素早くきれいに処理できます。さらに、これらのオブジェクトitercheckは、組み込みイテレータと同じように動作するメソッドを公開しますがXonshCalledProcessError、プロセスにゼロ以外の戻りコードがある場合に発生します。

def get_wireless_interface():
    """Returns devicename of first connected wifi, None otherwise"""
    for line in !(nmcli device):
        dev, typ, state, conn_name = line.split(None, 3)
        if typ == 'wifi' and state == 'connected':
            return dev

def grep_path(path, regexp):
    """Recursively greps `path` for perl `regexp`

    Returns a dict of 'matches' and 'failures'.
    Matches are files that contain the given regexp.
    Failures are files that couldn't be scanned.
    """
    matches = []
    failures = []

    try:
        for match in !(grep -RPl @(regexp) @(str(path))).itercheck():
            matches.append(match)
    except XonshCalledProcessError as error:
        for line in error.stderr.split('\n'):
            if not line.strip():
                continue
            filename = line.split('grep: ', 1)[1].rsplit(':', 1)[0]
            failures.append(filename)
    return {'matches': matches, 'failures': failures}

$()そして!()、オペレータは表現そのものです。つまり、結果を変数に代入したり、必要な操作を実行したりすることができます。

>>> x = $(ls -l)
>>> print(x.upper())
TOTAL 0
-RW-RW-R-- 1 SNAIL SNAIL 0 MAR  8 15:46 XONSH
>>> y = !(ls -l)
>>> print(y.returncode)
0
>>> print(y.rtn)  # alias to returncode
0

警告

キャプチャされたサブプロセスに対してジョブ制御が実装されていません。

サブプロセスモードまたは取得されたサブプロセスの中では、$NAME変数や${}構文を使用して環境を照会することも、Pythonの値に@()演算子を挿入することもできます

>>> $(echo $HOME)
'/home/snail\n'

$[]¶を使って未取得のサブプロセス![]

キャプチャされていないサブプロセスは、$[]![]演算子で示されます。$()ほぼすべての方法で取得さたサブプロセスと同じです。唯一の違いは、サブプロセスのstdoutがxonshを直接経由して画面に渡ることです。の戻り値$[]は常にNoneです。

以下では、結果$[]が自動的に出力され、戻り値は文字列ではないことがわかります。

>>> x = $[ls -l]
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh
>>> x is None
True

![]オペレータは同様である!()ことが指定されたコマンドの実行結果に関する情報を含むオブジェクトを返すことができます。しかし、標準出力ストリームと標準エラーストリームは端末に送られ、その結果のオブジェクトは表示されません。例えば

>>> x = ![ls -l] and ![echo "hi"]
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh
hi

¶の Python評価@()

@(<expr>)オペレータのフォームは、サブプロセスモードで動作し、任意のPythonコードを評価します。結果はサブプロセスコマンドリストに追加されます。結果が文字列の場合、引数リストに追加されます。結果がリストまたは他の非文字列の場合、内容は文字列に変換され、引数リストに順番に追加されます。最初の位置の結果が関数の場合、明示的にマッピングに追加されていなくても、エイリアスとして扱われます(下の別名のセクションを参照してくださいaliasesそれ以外の場合、結果は自動的に文字列に変換されます。例えば、

>>> x = 'xonsh'
>>> y = 'party'
>>> echo @(x + ' ' + y)
xonsh party
>>> echo @(2+2)
4
>>> echo @([42, 'yo'])
42 yo
>>> echo "hello" | @(lambda a, s=None: s.read().strip() + " world\n")
hello world
>>> @(['echo', 'hello', 'world'])
hello world
>>> @('echo hello world')  # note that strings are not split automatically
xonsh: subprocess mode: command not found: echo hello world

この構文は、キャプチャされたサブプロセスまたはキャプチャされていないサブプロセスの内部で使用でき、サブプロセスコマンドリスト内の任意のトークンを生成するために使用できます。

>>> out = $(echo @(x + ' ' + y))
>>> out
'xonsh party\n'
>>> @("ech" + "o") "hey"
hey

したがって、@()Pythonモードで複雑なコマンドを作成し、必要に応じてそれらをサブプロセスに送ることができます。例えば:

for i in range(20):
    $[touch @('file%02d' % i)]

この@()構文は、スタンドアロンの引数としてではなく、サブプロセス引数の内部でも使用できます。例えば:

>>> x = 'hello'
>>> echo /path/to/@(x)
/path/to/hello

サブプロセス引数の内部で使用<expr>され、文字列以外の繰り返し可能性を評価すると、指定された@()すべての値の外積に展開されます。

>>> echo /path/to/@(['hello', 'world'])
/path/to/hello /path/to/world

>>> echo @(['a', 'b']):@('x', 'y')
a:x a:y b:x b:y

コマンド置換@$()

@()and $()演算子の一般的な使い方は、コマンドの出力をコマンド自体に置き換えることです(コマンド置換) Xonshはこの操作のための簡潔な構文を提供します:@([i.strip() for i in $(cmd).split()])@$(cmd)

次の例を考えてみましょう。

>>> # this returns a string representing stdout
>>> $(which ls)
'ls --color=auto\n'

>>> # this attempts to run the command, but as one argument
>>> # (looks for 'ls --color=auto\n' with spaces and newline)
>>> @($(which ls).strip())
xonsh: subprocess mode: command not found: ls --color=auto

>>> # this actually executes the intended command
>>> @([i.strip() for i in $(which ls).split()])
some_file  some_other_file

>>> # this does the same thing, but is much more concise
>>> @$(which ls)
some_file  some_other_file

サブプロセスのネスト

私はこれを乱用しないように物乞いをしていますが、それは(巣に私たちがこれまで見てきたサブプロセス・オペレーター可能です$()$[]${}@()@$())。インスタンスそれは以下の通りです不条理の境の誤った側にあります。ls -l

>>> $[@$(which @($(echo ls).strip())) @('-' + $(printf 'l'))]
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh

大きな力をもって、など

注意

これらのサブプロセス演算子 はサブプロセスモードで実行されるため、これらのサブプロセス演算子は内部$()および/または$[]動作します。以来@()${}Pythonのモードでその内容を実行し、それはそれらの内部に巣他のサブプロセス演算子することはできません。

パイプ

サブプロセスモードでは、xonshを使用|すると、他のシェルと同じようにコマンドをパイプでつなぐことができます

>>> env | uniq | sort | grep PATH
DATAPATH=/usr/share/MCNPX/v260/Data/
DEFAULTS_PATH=/usr/share/gconf/awesome-gnome.default.path
LD_LIBRARY_PATH=/home/snail/.local/lib:
MANDATORY_PATH=/usr/share/gconf/awesome-gnome.mandatory.path
PATH=/home/snail/.local/bin:/home/snail/sandbox/bin:/usr/local/bin
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0

|それ以外の場合はPython演算子であるため、これはサブプロセスモードでのみ使用できますパイプが何であるか分からない場合は、多くの素晴らしい参考文献があります。StackOverflowまたはGoogleに関する情報を見つけることができるはずです。

論理サブプロセスと

サブプロセスモードでは、and演算子を使用してサブプロセスコマンドを連鎖させることもできます。コマンドの真理値は、戻りコードがゼロ(すなわち)であるかどうかで評価されます。Pythonの場合と同様に、コマンドが評価すると、後続のコマンドは実行されません。たとえば、存在する場合と存在しない場合があるファイルをリストしたいとします。proc.returncode == 0False

>>> touch exists
>>> ls exists and ls doesnt
exists
/bin/ls: cannot access doesnt: No such file or directory

ただし、最初に存在しないファイルをリストすると、エラーだけが表示されます。

>>> ls doesnt and ls exists
/bin/ls: cannot access doesnt: No such file or directory

また、心配しないでください。Xonshは&&オペレータand をあなたのために直接翻訳します。もちろんPythonicは少ないですが、あなたのシェルです!

論理サブプロセスまたは

同様にandor演算子を使用してサブプロセスコマンドを連鎖させることができます。違いは、リターンコードがゼロでない(すなわち、失敗した)場合にのみ、後続のコマンドが実行されるということです。上のファイルの例を使用して:

>>> ls exists or ls doesnt
exists

これは、存在しないファイルを列挙しようとしません!ただし、最初に存在しないファイルをリストすると、エラーが表示され、存在するファイルが表示されます。

>>> ls doesnt or ls exists
/bin/ls: cannot access doesnt: No such file or directory
exists

決して恐れるな!Xonshも||演算子を直接変換しorます。あなたの筋肉の記憶は安全です、ここで私たちと一緒に。

入出力リダイレクト

xonshはまた、あなたがリダイレクトすることができますstdinstdoutおよび/またはstderrこれにより、コマンドの出力先と出力先を制御することができます。xonshにはこれらの操作のための独自の構文がありますが、互換性のためにxonshはBashのような構文もサポートしています。

基本的な操作は、 "(>への書き込み"、 "()への追記" >>、 "からの読み出し"(<)です。これらの詳細は、おそらく例を通して最もよく説明されます。

注意

リダイレクションのターゲットは空白で区切る必要があります。そうでなければ、xonshはSyntaxErrorを発生させます。

リダイレクトstdout

次のすべての例ではCOMMAND、通常の出力(stdout)を実行してファイルに書き出し、output.txt存在しない場合は作成します。

>>> COMMAND > output.txt
>>> COMMAND out> output.txt
>>> COMMAND o> output.txt
>>> COMMAND 1> output.txt # included for Bash compatibility

これをoutput.txt置き換えること>内容を上書きするのではなく、ファイルを追加するようにすることができます>>>>存在しない場合でもファイルを作成します)。

リダイレクトstderr

次のすべての例ではCOMMAND、エラー出力(stderr)が実行されerrors.txt呼び出されたファイルに書き込まれ、存在しない場合は作成されます。

>>> COMMAND err> errors.txt
>>> COMMAND e> errors.txt
>>> COMMAND 2> errors.txt # included for Bash compatibility

上記のように置き換える>、その内容を置き換えるのではなく>>、エラー出力が追加されerrors.txtます。

ストリームの結合

すべてCOMMANDの出力(通常出力とエラー出力の両方)を同じ場所に送ることができます。次のすべての例では、このタスクを実行します。

>>> COMMAND all> combined.txt
>>> COMMAND a> combined.txt
>>> COMMAND &> combined.txt # included for Bash compatibility

stderrをstdoutに明示的にマージして、エラーメッセージが通常の出力と同じ場所に報告されるようにすることもできます。これは次の構文で行うことができます:

>>> COMMAND err>out
>>> COMMAND err>o
>>> COMMAND e>out
>>> COMMAND e>o
>>> COMMAND 2>&1  # included for Bash compatibility

このマージは、パイプを含む他のリダイレクションと組み合わせることができます(上記のパイプのセクションを参照してください):

>>> COMMAND err>out | COMMAND2
>>> COMMAND e>o > combined.txt

この最後の例は、次のものと同等であることに注意する価値があります。 COMMAND a> combined.txt

同様に、次の構文でstdoutをstderrに送ることもできます:

>>> COMMAND out>err
>>> COMMAND out>e
>>> COMMAND o>err
>>> COMMAND o>e
>>> COMMAND 1>&2  # included for Bash compatibility

リダイレクトstdin

また、コマンドがコマンドラインからではなくファイルからコマンドを読み取るようにすることもできますstdin次の例は、これを達成する2つの方法を示しています。

>>> COMMAND < input.txt
>>> < input.txt COMMAND

I / Oリダイレクトの組み合わせ

これらのリダイレクションのすべてを組み合わせることができます。以下は、複雑なリダイレクトの一例です。

>>> COMMAND1 e>o < input.txt | COMMAND2 > output.txt e>> errors.txt

この行はfeddのCOMMAND1内容をinput.txtstdin 実行し、すべての出力(stdoutとstderr)をパイプしCOMMAND2ます。このコマンドの通常の出力はにリダイレクトされoutput.txt、エラー出力が追加されerrors.txtます。

バックグラウンドジョブ

通常、xonshで実行中のプログラムを起動すると、xonsh自体が一時停止し、そのプログラムが終了するのを待ちます。しかし、プログラムが実行されている間に、xonshにコマンドを与え続けることもできます。サブプロセスモードで&は、コマンドの末尾にアンパサンド()を追加することで、 "バックグラウンドで"(つまり、シェルの使用を継続できるように)プロセスを開始することができます。バックグラウンドジョブは、グラフィカルユーザーインターフェイスでプログラムを実行する場合に非常に便利です。

以下に例を示しますemacs

>>> emacs &
>>>

emacsの起動後、プロンプトが返されることに注意してください。

ジョブ制御

フォアグラウンド(アンパサンドなし)でプログラムを起動すると、そのプログラムの実行を一時停止し、Control-Zを押すことでxonshプロンプトに戻ることができます。これにより、端末の制御がxonshに戻され、プログラムはバックグラウンドで一時停止したままになります。

注意

Control-Zによるプロセスの中断は、Windowsで実行しているときはまだサポートされていません。

プログラムのポーズを解除してフォアグラウンドに戻すには、このfgコマンドを使用し ます。プログラムをポーズ解除すると、バックグラウンドで続行されます(xonshプロンプトに引き続きアクセスできます)bgこのコマンドを使用できます

このjobsコマンドを使用して、現在実行中のすべてのジョブのリストを取得できます

各ジョブには一意の識別子(1から始まり上向き)があります。デフォルトでは、fgand bgコマンドは直前に開始されたジョブで動作します。適切なIDを指定することで、古いジョブをフォアグラウンドまたはバックグラウンドにすることができます。たとえば、ID 1のジョブをフォアグラウンドにします。さらに、最新のジョブには「+」を指定し、直近の2番目のジョブには「 - 」を指定します。fg 1

サブプロセスモードでの文字列リテラル

文字列は、サブプロセスモードで特殊文字をエスケープするために使用できます。文字列の内容は、単一の引数としてサブプロセスコマンドに直接渡されます。だから疑問に思っているときや、ファイル名のためにxonshの構文エラーがあるときは、問題の部分を文字列で囲むだけです。

これの一般的な使用例は、名前にスペースを含むファイルです。この嫌な習慣は死ぬことを拒否します。「問題はない!」とxonshは言います。「私には文字列があります。

>>> touch "sp ace"
>>> ls -l
total 0
-rw-rw-r-- 1 snail snail 0 Mar  8 17:50 sp ace
-rw-rw-r-- 1 snail snail 0 Mar  8 15:46 xonsh

デフォルトでは、文字列内の環境変数の名前は、その変数の内容に置き換えられます(サブプロセスモードのみ)。例えば:

>>> print("my home is $HOME")
my home is $HOME
>>> echo "my home is $HOME"
my home is /home/snail

特定のコマンド内でこの拡張を避けるには、以下の@()構文を使用して文字列をPythonモードで評価するようにします。

>>> echo "my home is $HOME"
my home is /home/snail
>>> echo @("my home is $HOME")
my home is $HOME

また、設定することで、完全に環境変数の展開を無効にすることができます $EXPAND_ENV_VARSFalse

ファイル名展開*

*サブプロセスモードでは文字を含むファイル名のグロビングも許可されます。これは単純にPythonのglobモジュールを使っています。詳細はこちらをご覧ください。一例として、素敵なxonshsの束から始めましょう:

>>> touch xonsh conch konk quanxh
>>> ls
conch  konk  quanxh  xonsh
>>> ls *h
conch  quanxh  xonsh
>>> ls *o*
conch  konk  xonsh

乗算は非常に重要なので、これはPythonモードでは利用できません。

バックティックを使った高度なパス検索

xonshは、Pythonモードとサブプロセスモードの両方で、通常のグロビング以外のパス名を見つける追加の方法を提供します。

正規表現グローブ

正規のグロブリングがオクタンをもう少し使うことができると感じたことがあるなら、正規表現グロビングがあなたのためのツールです!`引用符(')の代わりにバッククォート(を使用する文字列は、"ファイル名と一致する正規表現として解釈されます。通常のglobbingと同様に、成功した一致のリストが返されます。Pythonモードでは、これは単なる文字列のリストです。サブプロセスモードでは、各ファイル名はサブプロセスコマンドの独自の引数になります。

簡単なファイル名でデモを見てみましょう:

>>> touch a aa aaa aba abba aab aabb abcba
>>> ls `a(a+|b+)a`
aaa  aba  abba
>>> print(`a(a+|b+)a`)
['aaa', 'aba', 'abba']
>>> len(`a(a+|b+)a`)
3

この同じ種類の検索は、バッククッキーが先行する場合に実行されrます。したがって、次の式は等価です。`test`r`test`

正規表現マッチング以外は、通常のグロビングと同じように機能します。詳細についてre は、Python標準ライブラリのモジュールのドキュメントを参照してください

警告

Xonshでは、バッククォートの意味はBashの意味とは大きく異なります。Bashでは、バック$()ティックとはキャプチャされたサブプロセス(Xonshで)を実行することを意味します

通常のグローブ

サブプロセスモードでは、通常のグロビングは特別な構文なしで行われます。しかし、バックティック構文には、Pythonモードとサブプロセスモードの両方で利用できる追加機能があります。

regex globbingと同様に、通常のグロビングは次のようにして(Pythonモードまたはサブプロセスモードで)実行できますg``

>>> touch a aa aaa aba abba aab aabb abcba
>>> ls a*b*
aab  aabb  aba  abba  abcba
>>> ls g`a*b*`
aab  aabb  aba  abba  abcba
>>> print(g`a*b*`)
['aab', 'aabb', 'abba', 'abcba', 'aba']
>>> len(g`a*b*`)
5

カスタムパスの検索

さらに、通常のグロビングと正規表現グロビングでは不十分な場合、xonshでは独自の検索機能を指定することができます。

検索関数は、その文字列に一致する可能性のあるリストを返す単一の引数(文字列)の関数として定義されます。検索機能は、以下の構文でバッククォートとともに使用することができます。@<name>`test`

次の例は、これらの関数の形式を示しています。

>>> def foo(s):
...     return [i for i in os.listdir('.') if i.startswith(s)]
>>> @foo`aa`
['aa', 'aaa', 'aab', 'aabb']

パス出力

pregexまたはglob backtick 修飾子を使用すると、戻り値の型が文字列のリストからpathlib.Pathオブジェクトのリストに変更されます。

>>> p`.*`
[Path('foo'), Path('bar')]
>>> [x for x in pg`**` if x.is_symlink()]
[Path('a_link')]

パスリテラル

パスオブジェクトは、p文字列構文を使用して直接インスタンス化できます。パスオブジェクトはstr()プレーンな文字列に変換され、この変換はサブプロセスモードで暗黙的に処理されます。

>>> mypath = p'/foo/bar'
>>> mypath
Path('/foo/bar')
>>> mypath.stem
'bar'
>>> echo @(mypath)
/foo/bar

ヘルプ&Superhelpで???

IPythonから、xonshは疑問符でオブジェクトを検査することを可能にします。?通常のレベルのヘルプを表示するには、単一の疑問符()を使用します。??superhelpと呼ばれるより高いレベルのヘルプを表示するには、二重疑問符()を使用します。オブジェクトが純粋なPythonで書かれていれば、スーパーヘルプには通常ソースコードが含まれています。

まず、int型のヘルプを見てみましょう。

>>> int?
Type:            type
String form:     <class 'int'>
Init definition: (self, *args, **kwargs)
Docstring:
int(x=0) -> integer
int(x, base=10) -> integer

Convert a number or string to an integer, or return 0 if no arguments
are given.  If x is a number, return x.__int__().  For floating point
numbers, this truncates towards zero.

If x is not a number or if base is given, then x must be a string,
bytes, or bytearray instance representing an integer literal in the
given base.  The literal can be preceded by '+' or '-' and be surrounded
by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.
Base 0 means to interpret the base from the string as an integer literal.
>>> int('0b100', base=0)
4
<class 'int'>

ここで、正規表現グロブを可能にするxonshビルトインのスーパーヘルパーを見てみましょう:

>>> __xonsh__.regexsearch??
Type:         function
String form:  <function regexsearch at 0x7efc8b367d90>
File:         /usr/local/lib/python3.5/dist-packages/xonsh/built_ins.py
Definition:   (s)
Source:
def regexsearch(s):
    s = expand_path(s)
    return reglob(s)


<function xonsh.built_ins.regexsearch>

ヘルプとスーパーヘルプの両方が、検査しているオブジェクトを返すことに注意してください。これにより、他の操作の内部でヘルプを連鎖させ、オブジェクト階層内で何度もヘルプを尋ねることができます。たとえば、dict型とkey()メソッドの両方のヘルプを同時に取得しましょう:

>>> dict?.keys??
Type:            type
String form:     <class 'dict'>
Init definition: (self, *args, **kwargs)
Docstring:
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
    (key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
    d = {}
    for k, v in iterable:
        d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
    in the keyword argument list.  For example:  dict(one=1, two=2)
Type:        method_descriptor
String form: <method 'keys' of 'dict' objects>
Docstring:   D.keys() -> a set-like object providing a view on D's keys
<method 'keys' of 'dict' objects>

もちろん、サブプロセスコマンドの場合でも、このmanコマンドを使用します。

コンパイル、評価、実行

PythonとBashのように、xonshはxonshコードの文字列をコンパイル、評価、実行するための組み込みのフックを提供します。ビルトインのPythonで深刻な名前の衝突を持っていることから、この機能を回避するにはcompile()eval()、およびexec()機能、xonshはすべてが「X」を付加当量です。だから、xonshコードのためにあなたが使用したいcompilex()evalx()execx() 機能を。これらが何をするのかわからない場合は、おそらくそれらを必要としません。

エイリアス

別の重要なxonshビルトインは、aliasesマッピングです。これは、サブプロセスコマンドの実行方法に影響する辞書のようなものです。あなたがBash aliasビルトインに精通しているなら、これは似ています。エイリアス・コマンド・マッチングは、サブプロセス・コマンドの最初の要素に対してのみ発生します。

のキーはaliases、サブプロセスモードでコマンドとして動作する文字列です。値は文字列のリストです。最初の要素はコマンドで、残りは引数です。値を文字列に設定することもできます。文字列には、次の2つのうちのいずれかが実行されます。

  1. 文字列がxonsh式の場合、xonshのLexer.split()メソッドで自動的にリストに変換されます。
  2. 文字列がより複雑な場合(xonshコードのブロックを表す)、エイリアスはExecAlias呼び出し可能なエイリアスとしてanとして登録されます。このコードブロックは、エイリアスが実行されるたびに実行されます。

たとえば、次の例では、git バージョンコントロールソフトウェアのエイリアスがいくつか作成されています両方のスタイル(文字列と単一文字列のリスト)が表示されます:

>>> aliases['g'] = 'git status -sb'
>>> aliases['gco'] = 'git checkout'
>>> aliases['gp'] = ['git', 'pull']

あなたが実行した場合の効果で上記の別名で、コマンドはに減らすことが実行される前に。gco feature-fabulous['git', 'checkout', 'feature-fabulous']

呼び出し可能なエイリアス

最後に、エイリアス値が関数(または他の呼び出し可能)である場合、この関数はサブプロセスコマンドに行く代わり呼び出されます。そのような関数は、次のシグネチャのいずれかを持つことができます。

def mycmd0():
    """This form takes no arguments but may return output or a return code.
    """
    return "some output."

def mycmd1(args):
    """This form takes a single argument, args. This is a list of strings
    representing the arguments to this command. Feel free to parse them
    however you wish!
    """
    # perform some action.
    return 0

def mycmd2(args, stdin=None):
    """This form takes two arguments. The args list like above, as a well
    as standard input. stdin will be a file like object that the command
    can read from, if the user piped input to this command. If no input
    was provided this will be None.
    """
    # do whatever you want! Anything you print to stdout or stderr
    # will be captured for you automatically. This allows callable
    # aliases to support piping.
    print('I go to stdout and will be printed or piped')

    # Note: that you have access to the xonsh
    # built-ins if you 'import builtins'.  For example, if you need the
    # environment, you could do to following:
    import builtins
    env = builtins.__xonsh__.env

    # The return value of the function can either be None,
    return

    # a single string representing stdout
    return  'I am out of here'

    # or you can build up strings for stdout and stderr and then
    # return a (stdout, stderr) tuple. Both of these may be
    # either a str or None. Any results returned like this will be
    # concatenated with the strings printed elsewhere in the function.
    stdout = 'I commanded'
    stderr = None
    return stdout, stderr

    # Lastly, a 3-tuple return value can be used to include an integer
    # return code indicating failure (> 0 return code). In the previous
    # examples the return code would be 0/success.
    return (None, "I failed", 2)

def mycmd3(args, stdin=None, stdout=None):
    """This form has three parameters.  The first two are the same as above.
    The last argument represents the standard output.  This is a file-like
    object that the command may write too.
    """
    # you can either use stdout
    stdout.write("Hello, ")
    # or print()!
    print("Mom!")
    return

def mycmd4(args, stdin=None, stdout=None, stderr=None):
    """The next form of subprocess callables takes all of the
    arguments shown above as well as the standard error stream.
    As with stdout, this is a write-only file-like object.
    """
    # This form allows "streaming" data to stdout and stderr
    import time
    for i in range(5):
        time.sleep(i)
        print(i, file=stdout)

    # In this form, the return value should be a single integer
    # representing the "return code" of the alias (zero if successful,
    # non-zero otherwise)
    return 0

def mycmd5(args, stdin=None, stdout=None, stderr=None, spec=None):
    """This form of subprocess callables takes all of the
    arguments shown above as well as a subprocess specification
    SubprocSpec object. This holds many attributes that dictate how
    the command is being run.  For instance this can be useful for
    knowing if the process is captured by $() or !().
    """
    import xonsh.proc
    if spec.captured in xonsh.proc.STDOUT_CAPTURE_KINDS:
        end = ''
    else:
        end = '\n'
    # Now we'll get a newline if the user is at the terminal, and no
    # newline if we are captured
    print('Hi Mom!', end=end)
    return 0

def mycmd6(args, stdin=None, stdout=None, stderr=None, spec=None, stack=None):
    """Lastly, the final form of subprocess callables takes a stack argument
    in addition to the arguments shown above. The stack is a list of
    FrameInfo namedtuple objects, as described in the standard library
    inspect module. The stack is computed such the the call site is the
    first and innermost entry, while the outer frame is the last entry.

    The stack is only computed if the alias has a "stack" argument.
    However, the stack is also accessible as "spec.stack".
    """
    for frame_info in stack:
        frame = frame_info[0]
        print('In function ' + frame_info[3])
        print('  locals', frame.f_locals)
        print('  globals', frame.f_globals)
        print('\n')
    return 0

エイリアスの追加、変更、削除

組み込みのマッピングを変更するだけで、存在する別名を動的に変更することができます。関数値を使用した例を次に示します。

>>> def _banana(args, stdin=None):
...     return ('My spoon is tooo big!', None)
>>> aliases['banana'] = _banana
>>> banana
'My spoon is tooo big!'

エイリアスを再定義するには、単純に新しい関数を割り当てます。ここでは、キーワード引数を持つPythonラムダを使用します:

>>> aliases['banana'] = lambda: "Banana for scale.\n"
>>> banana
Banana for scale.

エイリアスを削除するのは、エイリアス辞書からキーを削除するのと同じくらい簡単です。

>>> del aliases['banana']

注意

エイリアス関数は、一般に先頭のアンダースコアで定義する必要があります。さもなければ、xonshがコマンドを実行するときにPython変数がエイリアスよりも優先されるので、エイリアス自体をシャドウすることができます。

匿名エイリアス

上で述べたように、このマッピングの外の関数をエイリアスとして扱うことも可能@()です。例えば:

>>> @(_banana)
'My spoon is tooo big!'
>>> echo "hello" | @(lambda args, stdin=None: stdin.read().strip() + ' ' + args[0] + '\n') world
hello world

裂け目のないエイリアス

通常、呼び出し可能なエイリアスコマンドはバックグラウンドで実行できるように別のスレッドで実行されます。しかし、いくつかのエイリアスは、呼び出されたスレッド上で実行される必要があります。これは主にデバッガとプロファイラに便利です。エイリアスをフォアグラウンドで実行するには、その関数をxonsh.tools.unthreadableデコレータで飾ります。

from xonsh.tools import unthreadable

@unthreadable
def _mycmd(args, stdin=None):
    return 'In your face!'

aliases['mycmd'] = _mycmd

uncapturableエイリアス

また、デフォルトで呼び出し可能なエイリアスは、出力がキャプチャされるように実行されます(代替モードに入らないxonshのほとんどのコマンドのように)。ただし、一部のエイリアスでは、代替モードコマンド自体を実行することがあります。したがって、呼び出し可能なエイリアスは致命的な結果(tm)なしにキャプチャすることはできません。これを防ぐために、呼び出し可能な別名をuncapturableとして宣言することができます。これは、テキストエディタ、ポケベルなどを開いたエイリアスに最も役立ちます。別名をuncapturableにするには、その関数をxonsh.tools.uncapturableデコレータで飾ります。おそらくunthreadableデコレータと組み合わせて使用​​するのが最も良いでしょう例えば:

from xonsh.tools import unthreadable, uncapturable

@uncapturable
@unthreadable
def _binvi(args, stdin=None):
    vi -b @(args)  # Edit binary files

aliases['bvi'] = _binvi

@()Pythonリストargsをサブプロセスコマンドに渡す必要があることに注意してください


エイリアスは、xonshがPythonやサブプロセスとシームレスに対話できる強力な方法です。

警告

場合はFOREIGN_ALIASES_OVERRIDE、環境変数がFalse(デフォルト)をxonshエイリアスを上書きしようとする外国シェルのエイリアスは無視されます。この環境変数の設定は、xonshの場合、つまりxonshを開始するプロセスの外側で行う必要があります。

上、下、タブ

上と下のキーは、IPythonシェルと同じように、行の先頭から一致する履歴を検索します。

タブ補完も存在します。デフォルトでは、Python-modeでは、現在の組み込み関数、グローバル変数、ローカル変数、xonsh言語のキーワードと演算子、ファイルとディレクトリ、環境変数名の変数名に基づいて処理を完了できます。サブプロセスモードでは$PATH、エイリアスキー上の実行可能ファイルの名前と、コマンド自体の完全なBash補完を追加します。

xonshは、タブコンプリータの動作を変更する手段も提供します。詳細は、タブ補完ページを参照してください

プロンプトのカスタマイズ

$PROMPTおそらく環境変数を変更する最も一般的な理由は、変更によってプロンプトをカスタマイズすることです。

注意

$PROMPT変数が親プロセスから継承されることはないことに注意してください(その親が外部シェルかxonshのインスタンスかにかかわらず)。

$PROMPT変数は、文字列であってもよく、またはそれは、文字列を返す(引数なしの)関数であることができます。結果には、自動的に置き換えられるキーワード引数を含めることができます。

>>> $PROMPT = '{user}@{hostname}:{cwd} > '
snail@home:~ > # it works!
snail@home:~ > $PROMPT = lambda: '{user}@{hostname}:{cwd} >> '
snail@home:~ >> # so does that!

デフォルトでは、次の変数を使用できます。

  • user:現在のユーザのユーザ名
  • hostname:ホストコンピュータの名前
  • cwd:現在の作業ディレクトリ$DYNAMIC_CWD_WIDTHです。この変数の最大幅$DYNAMIC_CWD_ELISION_CHARを設定し、短縮パスで使用される文字を設定するために使用できます。
  • short_cwd:短縮された形式の現在の作業ディレクトリ。例えば、 /path/to/xonshとなり/p/t/xonsh
  • cwd_dir:例えば現在の作業ディレクトリのdirnameは、/path/to/path/to/xonsh
  • cwd_base:例えば現在の作業ディレクトリのベース名xonsh/path/to/xonsh
  • env_name:アクティブな仮想環境の名前(存在する場合)。
  • curr_branch:現在のgitブランチの名前(存在する場合)。
  • branch_color{BOLD_GREEN}現在のgitブランチがクリーンであれば、そうでなければ{BOLD_RED}ブランチ色を判別できなかった場合は黄色です。
  • branch_bg_color:のように{branch_color}、代わりに背景色を設定します。
  • prompt_end#ユーザーにroot / admin権限がある$場合
  • current_job:フォアグラウンドで現在実行されているコマンドの名前(存在する場合)。
  • vte_new_tab_cwd:いくつかのLinux端末の現在の作業ディレクトリに新しいタブを開くVTEエスケープシーケンスを発行します。これは通常は必要ありません。
  • gitstatus:参考gitのステータスは、のように[master|MERGING|+1…2]、あなたが使用することができます* $ XONSH_GITSTATUS_をスタイリングをカスタマイズします。

また、{GREEN} またはのようなキーワードを挿入することで簡単にプロンプ​​トの色を付けることもできます{BOLD_BLUE}色は以下のような形をしています:

  • NO_COLOR:以前に使用したカラーコードをリセットします。

  • COLORNAME:次の基本的な色のカラーコードを挿入します。これは、規則的な(濃い)色と強い(明るい)

    • BLACK または INTENSE_BLACK
    • RED または INTENSE_RED
    • GREEN または INTENSE_GREEN
    • YELLOW または INTENSE_YELLOW
    • BLUE または INTENSE_BLUE
    • PURPLE または INTENSE_PURPLE
    • CYAN または INTENSE_CYAN
    • WHITE または INTENSE_WHITE
  • #HEX#len-3またはlen-6の16進コード前のA は、その16進数の色、またはシェルとターミナルでサポートされている最も近い近似を使用します。たとえば、#fff#fafad2はどちらも有効です。

  • BACKGROUND_背景色を設定するために、色名または16進数の先頭に追加することができます。例えば、BACKGROUND_INTENSE_RED とのBACKGROUND_#123456両方を使用することができます。

  • bg#HEXまたはBG#HEX、背景の16進色を設定するためのショートカットです。したがってbg#0012ab、大文字のバージョンを設定することができます。

  • BOLD_任意のフォアグラウンドカラーで使用できる接頭辞修飾子です。例えば、BOLD_REDそしてBOLD_#112233OKです!

  • UNDERLINE_任意のフォアグラウンドカラーでも使用できる接頭辞修飾子です。たとえば、UNDERLINE_GREEN

  • または、BOLD_UNDERLINE_INTENSE_BLACKあなたが使用できる最もメタル色のような修飾子の組み合わせ

PROMPT_FIELDS環境変数に追加することで、これら以外の追加変数を使用することができ ます。この辞書の値は、文字列(プロンプトに挿入される)または引数のない関数(プロンプトが生成されるたびに呼び出され、それらの呼び出しの結果がプロンプトに挿入される)でなければなりません。例えば:

snail@home ~ $ $PROMPT_FIELDS['test'] = "hey"
snail@home ~ $ $PROMPT = "{test} {cwd} $ "
hey ~ $
hey ~ $ import random
hey ~ $ $PROMPT_FIELDS['test'] = lambda: random.randint(1,9)
3 ~ $
5 ~ $
2 ~ $
8 ~ $

環境変数と関数も$ 接頭辞とともに使用できます。例えば:

snail@home ~ $ $PROMPT = "{$LANG} >"
en_US.utf8 >

いくつかのエントリは$PROMPT_FIELDS必ずしも適用可能ではないことに注意してください。たとえば、現在のディレクトリがリポジトリに存在しない場合はcurr_branch戻りNoneます。これNoneは空の文字列として解釈されます。

しかし、問題を考えてみましょう:

snail@home ~/xonsh $ $PROMPT = "{cwd_base} [{curr_branch}] $ "
xonsh [master] $ cd ..
~ [] $

私たちはブランチを角括弧で表示したいが、ブランチがないときは角括弧(と余分なスペース)を表示したくない。解決策は、値が以下の場合にのみ呼び出されるネスト形式の文字列(コロンで区切られた)を追加することですNone

snail@home ~/xonsh $ $PROMPT = "{cwd_base}{curr_branch: [{}]} $ "
xonsh [master] $ cd ..
~ $

中括弧はプレースホルダとして機能します。追加部分は通常の書式文字列です。ここでやっていることは、次の表現と同じです:

" [{}]".format(curr_branch()) if curr_branch() is not None else ""

コマンドとスクリプトの実行

で開始すると-cフラグやコマンド、xonshではなく、コマンドループを入力すると、そのコマンドと終了を実行します。

$ xonsh -c "echo @(7+3)"
10

より長いスクリプトは、スクリプトを含むファイル名を指定するか、stdin経由でxonshに渡すことで実行できます。たとえば、次のスクリプトが格納されているとしtest.xshます。

#!/usr/bin/env xonsh

ls

print('removing files')
rm `file\d+.txt`

ls

print('adding files')
# This is a comment
for i, x in enumerate("xonsh"):
    echo @(x) > @("file{0}.txt".format(i))

print($(ls).replace('\n', ' '))

このスクリプトは、その内容をxonshにパイプすることで実行できます。

$ cat test.xsh | xonsh
file0.txt  file1.txt  file2.txt  file3.txt  file4.txt  test_script.sh
removing files
test_script.sh
adding files
file0.txt file1.txt file2.txt file3.txt file4.txt test_script.sh

ファイル名を引数としてxonshを呼び出すことによって、

$ xonsh test.xsh
file0.txt  file1.txt  file2.txt  file3.txt  file4.txt  test_script.sh
removing files
test_script.sh
adding files
file0.txt file1.txt file2.txt file3.txt file4.txt test_script.sh

xonshスクリプトは、コマンドライン引数とパラメータも受け入れることができます。これらの引数は、次の2つの方法でスクリプトで使用できます。

  1. いずれのモードにおいても、個々の変数$ARG<n>(例えば、$ARG1として
  2. Pythonモードでのみ、リストとして $ARGS

たとえば、上の例のスクリプトが、文字列ではなく、与えられた引数で動作するように少し変更したとします'xonsh'(how $ARGS$ARG1が使用されています)。

#!/usr/bin/env xonsh

print($ARGS)

ls

print('removing files')
rm `file\d+.txt`

ls

print('adding files')
# This is a comment
for i, x in enumerate($ARG1):
    echo @(x) > @("file{0}.txt".format(i))

print($(ls).replace('\n', ' '))
print()
$ xonsh test2.xsh snails
['test_script.sh', 'snails']
file0.txt  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  test_script.sh
removing files
test_script.sh
adding files
file0.txt file1.txt file2.txt file3.txt file4.txt file5.txt test_script.sh

$ echo @(' '.join($(cat @('file%d.txt' % i)).strip() for i in range(6)))
s n a i l s

さらに、コマンドが失敗した場合にスクリプトを終了する必要がある場合は、環境変数をファイルの先頭に設定します。Pythonモードのエラーは既に例外を発生させるので、これはBashのものとほぼ同じです。$RAISE_SUBPROC_ERROR = Trueset -e

さらに、and コマンドを使用してソースコード行を表示する機能を切り替えることもでき ます。これは、Bash やPythonのものとほぼ同じですが、わかります。trace ontrace offset -xpython -m trace

Xonsh(*.xsh)のインポート

*.xsh通常のPython構文を使用して、ファイル拡張子を持つxonshソースファイルをインポートできます。mine.xshしたがって、あなたはファイルを持っていたとします。したがって、次のようにして現在のシェルにBashのようなソースを実行することができます:

from mine import *

これは、すべての人々だ

xonshを出るには、ヒットするかCtrl-D、タイプするかEOF、タイプquitするか、タイプしexitます。Windowsでは、入力することもできますCtrl-Z

>>> exit

今はあなたの番です。