web-dev-qa-db-ja.com

Linuxで入力を崇高なテキストにパイプする方法は?

Stdinからsublimetextエディターにテキストを受信するにはどうすればよいですか? vimでは次のように機能します:

echo "potato potato potato" | vim -

同じことがgeditでも機能し、コンテンツを含む新しいドキュメントを作成します。

Sublimetextは、新しいタブで「-」というファイルの編集を開始したようですが、他に機能するシェルトリックはありますか?

27
wim

崇高なインストールがSTDIN(Linuxの現在のバージョンなど)を開くことをサポートしていない場合の最も簡単な解決策は、出力を一時ファイルにダンプし、崇高なファイルを開いてからファイルを削除することです。次のように、binディレクトリにtosublというスクリプトを作成しました。

#!/bin/bash

TMPDIR=${TMPDIR:-/tmp}  # default to /tmp if TMPDIR isn't set
F=$(mktemp $TMPDIR/tosubl-XXXXXXXX)
cat >| $F  # use >| instead of > if you set noclobber in bash
subl $F
sleep .3  # give subl a little time to open the file
rm -f $F  # file will be deleted as soon as subl closes it

次に、次のようにして使用できます。

$ ifconfig | tosubl
13
tylerl

Sublime Textはわかりませんが、ファイル名を引数として受け入れるが、stdinからの読み取りを拒否するすべてのプログラムに適用されるという点で、問題は一般的であるはずです。

幸い、Bashを使用すると、stdoutをあるプロセスからある種の一時ファイルにパイプして、そのファイルの名前を別のプロセスに渡すことができます。

_man bash_から:

プロセス置換は、名前付きパイプ(FIFO)または開いているファイルに名前を付ける/ dev/fdメソッドをサポートするシステムでサポートされています。 <(リスト)または>(リスト)の形式を取ります。プロセスリストは、入力または出力をFIFOまたは/ dev/fd内のファイルに接続して実行されます。このファイルの名前は、次の結果として現在のコマンドに引数として渡されます。 >(list)形式を使用する場合は、ファイルに書き込むとlistの入力が提供されます。<(list)形式を使用する場合は、引数として渡されたファイルを読み取って、listの出力を取得する必要があります。

SomeProcessが、エディターでキャプチャしたい出力を生成すると仮定します。

_sublimetext <(SomeProcess)
_

または:

_SomeProcess | sublimetext <(cat)
_

これを手作業で頻繁に入力すると思われる場合は、sublimetext <(cat)をシェルスクリプトまたはエイリアスに挿入することをお勧めします。

OSがプロセス置換をサポートしていない場合に備えて、もちろん、いつでも自分で一時ファイルを指定できます。

_SomeProcess > /tmp/myoutput
sublimetext /tmp/myoutput
_
12
Ruud Helderman

moreutilsvipeが役立つ場合があります。 setEDITOR='subl --wait' 、次のことができます。

echo 'potato potato potato' | vipe
8
ændrük

https://stackoverflow.com/a/31035834/2429912 少しピギーバックします。私にとっては、90%を実行しますが、すべてではありません。

一時ファイルの使用は、事実上すべてのエディターで使用できる方法です。エディターがファイルが閉じられるまで待機することをサポートしている場合(SublimeTextの場合はsublime -w)、実際にその場で編集できるため、より用途が広くなります。これを行うには、提供されているスクリプト@tylerlを変更する必要があります-PATH内のtosublという名前のスクリプト:

#!/bin/bash

TMPDIR=${TMPDIR:-/tmp} # default to /tmp if TMPDIR isn't set
F=$(mktemp $TMPDIR/tosubl-XXXXXXXX)
cat >| $F # use >| instead of > if you set noclobber in bash
subl -w $F # waits until the file is closed
cat $F # prints out the contents of the file to stdout
rm -f $F # clean up the file

ここでecho "hello" | tosubl > local.fileを実行すると、Sublimeで最初のスクリプトの出力が開き、閉じたらlocal.fileに保存します。

0
Rauno56

ANSIエスケープシーケンス(ターミナルバッファなど)を使用して色付きのテキストを表示する場合は、パッケージ ANSIescape をインストールして、次のコマンドを使用できます。

F=$(mktemp); cat > $F; subl $F; subl --command ansi; sleep .5; rm -f $F

0
danmou