コンソールからの最後の出力を再利用する方法を知りたい、つまり:
pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/Library/Python/2.6/site-packages
pv-3:method Xavier$ cd **LASTOUTPUT**
Bashを想定:
% python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.7/site-packages
% cd $(!!)
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
% pwd
/usr/lib/python2.7/site-packages
まだ言及されていませんが、変数を使用してください:
dir=$( python -c ... )
cd "$dir"
他のすべてのソリューションには、ワークフローの変更またはコマンドの2回の実行が含まれます。実行に長い時間がかかる場合や、再現できない場合(ファイルを削除するなど、ファイルを再実行すると異なる結果が生じる場合)は、この方法は適切ではありません。
したがって、必要に応じて、より複雑なアイデアを以下に示します。
。bashrc
exec > >(tee -a ~/$$.out)
Prompt_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)'
trap 'rm ~/$$.out' EXIT
bashプロンプト
$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.6/dist-packages
$ cd $LASTLINE
$ pwd
/usr/lib/python2.6/dist-packages
これにはいくつかの問題があるため、これは開始点としてのみ意図されています。たとえば、出力ファイル(~/<pid>.out
)が非常に大きくなり、ディスクがいっぱいになる可能性があります。また、tee
が停止すると、シェル全体が機能しなくなる可能性があります。
Zshでpreexec
とprecmd
フックを使用するか、bashで それらのエミュレーション を使用して、前のコマンドからの出力のみをキャプチャするように変更できますが、それはより複雑ですここで説明します。
従来のシェルのワーキングドラフト:
ttyid=$(readlink /proc/$$/fd/1)
\___/ \______/ \___/ | | |
| | | | | \- 0: stdin
| | | | | 1: stdout <- our interest
| | | | | 2: stderr
| | | | \- fd is, maybe, filedescriptor
| | | |
| | | \- $$ is the PID of the current process (Shell,
| | | in our case)
| | |
| | \- you know, much runtime stuff is here
| |
| \- readlink extracts the symbolic link of /proc/$$/fd/1
| lrwx------ 1 stefan stefan 64 2011-03-18 09:11
| /proc/22159/fd/1 -> /dev/pts/4
|
\- /dev/tty3 for real Shell, /dev/pts/3 for xterm
これで、画面をファイルに割り当てることができます。 Sudoが必要です。
id=${ttyid//\/dev\/tty}
Sudo cat /dev/vcs$id > screen.dump
該当screendump
:名前付きプログラムは、私にはもう機能しません。たぶん、古いカーネルのみです。/dev/pts/Nも私にとってはうまくいきませんでした。/devのオプションのMKDEVが必要かもしれません-いくつかの/dev/cuaN
、しかし私は間違っているかもしれません。
Screen.dumpを使用する代わりに、出力をパイプ処理したいと思います。しかし、どういうわけかそれは機能しません-時々それはENTERを待ちます。
キャプチャは、改行のある通常のテキストファイルではありませんが、たとえば、1つのシーケンスに80x50文字が含まれています。
コマンドの出力用の1行とプロンプト行用の1行の最後の2行を選択するには、それを元に戻し、160文字を選択し、再び元に戻して80を選択します。
rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'
疑問に思った方のために、なぜrev
プログラムがあるのでしょうか。
批評:
最初の図は explain.py で作成されています
これを試して:
$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages
だから、ええと、ここに答えがあります:
Xで実行している場合は、必要な出力をマウスで選択してコピーし、中マウスボタンでクリックして貼り付けます。
テキストコンソールで実行している場合は、 gpm を使用して同様のことができます。
(残念ながらそれは有効な答えではありませんが、それでも奇妙なことです。興味のある人は、これから説明する機能の実装を完了しようとするでしょう。)
Emacs内のeshell
では、そのような機能が必要でしたが、完全には実装されていません(ただし、これは ドキュメントに反映されています )。
例えば:
~ $ pwd
~
~ $ /bin/echo $$
~
~ $ /bin/pwd
/home/imz
~ $ /bin/echo $$
~ $
ご覧のとおり、$$
変数にキャプチャできるのは、組み込みの出力のみです。
しかし、いくつかのelispプログラミング(「esh-mode.el」のeshell-mark-output
実装を参照)、および最後の出力を「マーク」し、それを関数の結果として返す関数を実装することもできます。そのため、求めているeshellコマンドでその関数を使用できます-elisp関数は、次のように、通常のelisp構文でeshellコマンドで使用できます(括弧内など)。
~ $ /bin/echo (buffer-name)
*eshell*
~ $ /bin/echo (car '(a b c))
a
~ $
_cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1))
_
( 4485の答え に基づいて構築)
これは多くの入力が必要なため、エイリアスを作成します。
_alias tee2tty='tee $(readlink /proc/$$/fd/1)'
_
次に、単にcd $(python -c ... | tee2tty)
を呼び出します
もちろんこれには、出力で何をしたいかをすでに知っている必要がありますが、コマンドを1回だけ呼び出すという利点があります。
$ cd \`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"\`
トリックを行います。
詳細については、こちらをご覧ください: コマンド置換 。
ヒットする前に出力を再利用したい場合は Enter、変数に保存できます。addtmp=$(
行の先頭と)
最後に。 (これにより、コマンド出力の最後にある空白行が削除され、実際には最後の改行が削除されます。これはほとんど問題になりません。)
tmp=$(python -c …)
echo "$tmp"
cd "$tmp"
シェルがkshまたはzshの場合、これをより自動化するために使用できる便利な関数を次に示します。 (パイプラインの最後のコマンドを親シェルで実行する必要があるため、bashでは役に立ちません。これは、ksh(pdkshではなく)とzshの場合のみです。)
keep () {
local line IFS=$'\n'
kept=
while read -r line; do
printf '%s\n' "$line"
kept=$kept$line$IFS
done
}
alias keep=k
次のように使用します。
python -c … |k
cd $kept
より良い解決策があります:
印刷するだけ!!
コマンドを実行すると、出力が繰り返されます。
例えば。
元の:
https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash