シェルと対話しながら同じセッションを開いたままにする方法はありますか?

シェルと対話しながら同じセッションを開いたままにする方法はありますか?

私はUnixのコマンドラインを使ったチュートリアルの教材(PDF)を準備しています。自動化を目指しているので(怠惰と呼ぶ人もいます)、\write18--shell-escape)とverbatimパッケージを使って、次のようなことができる小さなパッケージを作成しました。

  1. コマンドを実行する(例ls)コマンドその間私の.tex文書を編集し、私の文書にタイプセットします。
  2. 結果stdoutstderr外部ファイルにリダイレクトし、
  3. ドキュメントにstdoutと をタイプセットするために、これらの外部ファイルを入力します。stderr.tex

しかし、私の理解では、 の各呼び出しは\write18独自のシェルセッションを開いたり閉じたりするようです。これは残念なことです。なぜなら、いくつかの変更とコードの重複が必要になるからです。特に、

  • あるセッション中に定義されたすべてのシェル変数は次のセッションでは使用できません。
  • 前のコマンドの終了時にいたのとcd同じディレクトリに戻るには、各コマンドの開始時に同じディレクトリに移動する必要があります。\write18\write18

下の私のおもちゃの例をご覧ください。

実行中にシェルを操作しながら、ある呼び出しから次の呼び出しまでpdflatexシェル セッションを開いたままにする方法はありますか? または、私のニーズに合ったより良い方法はありますか?\write18

\documentclass{article}

\usepackage{lipsum}

\begin{document}

First, initialise the repository.

% pretend that the following is an environment that both
% - runs commands at the CL
% - typesets them in the .tex document
\immediate\write18{%
  cd $HOME/Desktop;
  mkdir myrepo;
  cd myrepo;
  git init;
}

Let's see what git has to say...

\immediate\write18{%
  # I'm back in $HOME :(
  # I have to cd to $HOME/Desktop/myrepo, here, but I'd like to avoid it...
  cd $HOME/Desktop/myrepo;
  git status
  # ...
}

\end{document}

答え1

ここに画像の説明を入力してください

\documentclass{article}

\begin{document}

\immediate\write18{echo pwd > /tmp/zzpipe}

\texttt{\input{result.txt}}

\immediate\write18{echo cd > /tmp/zzpipe}

\immediate\write18{echo pwd > /tmp/zzpipe}

\texttt{\input{result.txt}}

\immediate\write18{echo 'FOO=wibble' > /tmp/zzpipe}

\immediate\write18{echo 'echo FOO is $FOO' > /tmp/zzpipe}

\texttt{\input{result.txt}}

\end{document}

a) コマンドを受け入れるための「サーバー」を設定します。私は名前付きパイプを使用します。

$ cd /tmp


$ mkfifo zzpipe

$ while true ; do eval `cat /tmp/zzpipe` >/tmp/result.txt  ; done

次に、上記の tex ファイル (in/tmpまたは arrangement がresult.txt他の場所に書き込まれている) を実行すると、出力は次のようになります。

これは、cygwin bash を使用した Windows の場合です。他のコマンドラインも同様ですが、異なる引用規則が必要になる場合があります。また、ご覧のとおり、 とcdの設定は、FOO1 つの書き込みから別の書き込みに引き継がれます。

答え2

基本的なbashサポートを追加しましたpythontex...20行未満のコードで済みました。これを使用するには、最新バージョンが必要です。GitHubpythontex実行する必要がある新しい bash コードがある場合は、常に標準の 3 ステップ コンパイルを使用する必要があります(LaTeX の実行、PythonTeX スクリプトの実行、LateX の実行)。実行する必要がある新しいコードがない場合は、LaTeX を単独で実行できます。これは を使用しないため\write18、シェル エスケープは必要ありません (コードの実行は PythonTeX スクリプトによって処理されます)。

すべて正常に動作しているようですが、バグが見つかった場合はお知らせください。エラー行番号は、実行されるコードの行番号と正しく同期されている必要があります。

以下にサンプル ドキュメントを示します。出力は以下のとおりです。 はデフォルトでそのまま実行されるため、 (または同等の)\stdoutpythontexのように形式を指定する必要はありません。\printpythontex\stdoutpythontex

\documentclass{article}

\usepackage[makestderr, usefamily=bash]{pythontex}
\setpythontexfv{numbers=left, firstnumber=last}

\begin{document}

A block of bash...
\begin{bashblock}
myvar="myvar's value"
echo $myvar
\end{bashblock}
...with output:
\printpythontex[verbatim]

Another block, accessing the previous variable...
\begin{bashblock}
echo "In another LaTeX environment later on..."
echo $myvar
\end{bashblock}
...with output:
\printpythontex[verbatim]

A block with an error.
\begin{bashblock}
echo "In another LaTeX environment later on..."
echo $myvar
lsERROR
\end{bashblock}
Stdout:
\printpythontex[verbatim]
Stderr:
\stderrpythontex

\end{document}

ここに画像の説明を入力してください

関連情報