web-dev-qa-db-ja.com

コマンドラインからの最後の出力を再利用するにはどうすればよいですか?

コンソールからの最後の出力を再利用する方法を知りたい、つまり:

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**
43
methodofaction

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
39
jsbillings

まだ言及されていませんが、変数を使用してください:

dir=$( python -c ... )
cd "$dir"
13
glenn jackman

他のすべてのソリューションには、ワークフローの変更またはコマンドの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でpreexecprecmdフックを使用するか、bashで それらのエミュレーション を使用して、前のコマンドからの出力のみをキャプチャするように変更できますが、それはより複雑ですここで説明します。

9
Mikel

従来のシェルのワーキングドラフト:

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プログラムがあるのでしょうか。

批評:

  • 最初のコマンドが入力されると、線が移動します。さて-最後の3行目か何かを選ぶための単なる数値演習。主に別のウィンドウで作業しました。
  • 誰もが80x50の画面を持っているわけではありません。ええ、そうです。 $ COLUMNSと$ ROWSがあります。
  • 出力は常に下部にあるわけではありません。新鮮で若いシェルが上段にあるかもしれません。まあ-そのように単純です:シェルが実行しているものを評価します。使用されるプロンプト。プロンプトの検出を行い、シェルプロンプトで最後の行を見つけます。 before(または2. before)の行にはディレクトリが含まれている必要があります。

最初の図は explain.py で作成されています

8
user unknown

これを試して:

$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages
7
bahamat

だから、ええと、ここに答えがあります:

Xで実行している場合は、必要な出力をマウスで選択してコピーし、中マウスボタンでクリックして貼り付けます。

テキストコンソールで実行している場合は、 gpm を使用して同様のことができます。

6
mattdm

(残念ながらそれは有効な答えではありませんが、それでも奇妙なことです。興味のある人は、これから説明する機能の実装を完了しようとするでしょう。)

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回だけ呼び出すという利点があります。

0
Tobias Kienzler
$ cd \`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"\`

トリックを行います。

詳細については、こちらをご覧ください: コマンド置換

0
yasouser

ヒットする前に出力を再利用したい場合は 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

より良い解決策があります:

印刷するだけ!!コマンドを実行すると、出力が繰り返されます。

例えば。

enter image description here

元の:

https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash

0
Tebe