Bashのデフォルトのコピーと貼り付けの動作を無効にする


9

端末セッションに貼り付けると、Enterキーを押さなくても、シェルがすぐにコマンドを実行します。

私はその振る舞いを無効にする方法を本当に知りません。

MacOS Yosemiteにプリインストールされているターミナルを使用しています。


9
もちろん、貼り付けバッファーに改行が含まれている場合にのみ、これが行われます。これは(ほとんど)bashとは関係ありません。(それは、readlineライブラリを使用する場合に限り、bashに関係します。)
Peter-Reonica Monica

...それでもbash(の助けを借りてreadline)修正されました。
アレクシス

回答:


16

bash4.4以降およびサポートは、ラを貼り付け括弧という端末でxterm、あなたが行うことができます。

bind 'set enable-bracketed-paste'

(または追加しset enable-bracketed-paste、あなたに~/.inputrc

これが原因となり、コピー&ペースト入力した場合(つまり、バッファは次のように文字が含まれている場合、あなたはまだ問題を抱えている可能性があると解釈される代わりに、その中に文字のプロンプトに挿入されるように、バッファ^C^Zおよびお使いの端末エミュレータは、それらを除外していません) 。

zsh バージョン5.1以降、デフォルトでこれが行われます。

他のシェルやターミナルについては、このようなクリップボードの乱用から自分を守るにはどうすればよいですか?も参照してください


私はそれを直視します
Opaldes

ブースウェイが機能しないようです
Opaldes

@オパルデス、何を試しましたか?どのシェルのどのバージョンで、どの端末にありますか?OS / Xにもが付属しているxtermと思いますが、代わりに試すことができます。perlリンクされた質問でスクリプトを試しましたか?
ステファンChazelas

1
@ Opaldes、Mac OS X OS / Xのターミナルウィンドウへのコードのvimへの貼り付けによると、OS / X Lion以降、ターミナルはブラケット貼り付けをサポートしています。したがって、必要なのはzshまたはbashの最新バージョンで十分です。古いzshバージョンでは、構成によっても実現できます。
ステファンChazelas

1
私たちは、バッシュ/ readlineにこの便利な機能を追加するためのダニエルColascioneに感謝することができますgnu-bash.2382.n7.nabble.com/...
アンソニーGeoghegan

6

これは、「改行」文字を貼り付けるときに発生します。たとえば、複数の行を貼り付ける場合や、行末に改行を知らないうちにコピーした場合などです。私の知る限り、この動作を実際に無効にする方法はありませんが、それを軽減する方法があります。

最も簡単な方法は、一度に1行ずつコピーして最後の文字を取り除き、後で手動で追加することです。

または、the_velour_fogが以下に示すように、印刷されていない文字を表示するエディターに貼り付けて、改行なしで再選択することもできます。

GNU / Linuxディストリビューションには1つまたは2つの回避策がありますが、その概念をMacOSに移植できるかどうかはわかりません。とにかく、ここを見て、変更できるMacに同様のファイルがあるかどうかを確認してください。残念ながら、私はそれを疑います。


印刷されていない文字を表示するエディターに貼り付け、改行なしで再選択します
the_velour_fog

含めるために編集された良い提案。
I_GNU_it_all_along 2016

それが常に起こるわけではないことを説明していることを知っておくと良いでしょう。私はあなたの答えを賛成しましたが、それは私への解決策としてより回避策です。
Opaldes

面倒ですが、一連のコマンドをコピーするときに役立ちます。
I_GNU_it_all_along 2016

私の「解決策」も一種のハック回避策ですが、IMOを個別に選択するよりも高速です。
Peter Cordes

5

貼り付ける前に、単一引用符を入力して貼り付けます。control-cと上矢印で1つの巨大な行として編集します。

テキストに単一引用符が含まれているが二重引用符は含まれていない場合は、二重引用符も機能します。$引用符で囲まれた巨大な行を1つのコマンドとして実際に実行していないので、二重引用符の中に展開されるものが含まれていても問題ありません。


改行は1つの大きな長い行を作成するのではなく、継続プロンプト(公式用語ではありません)を開始するため、実際にすべてを直接編集することはできません。

これらの4行を考えると:

echo
ls
foo
bar

私が提案するように貼り付けると、画面にこれが表示されます:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

次に、control-Cと上矢印を押します。(control-Cはカーソルと同じ行のすべてを破棄するので、そこに役立つテキストがある場合は、最初にReturnキーを押します。)

別の方法としては、見積もりを閉じてReturnキーを押し、上向き矢印を押します。

とにかく、上向き矢印の後

$ 'echo
ls
foo
bar

control-aと先頭のを削除し'ます。control-leftとcontrol-rightを使用して、貼り付けブロックをすばやく(ワード単位で)移動します。または、端末の設定がCtrl-矢印キー、alt-b、alt-fをサポートしていない場合。


リテラルの改行は実際にはコマンドを分離し、これらの4行はコマンド履歴に別々に記録されます;またはに変更することをお勧めします&&。(私はそのためのトリックを知りません、前方または後方ワードにキーリピートを使用してすばやくそこに到達し、手動でそれを行います。)


2

これは、貼り付けが改行で終わり、端末エミュレーターが基本的に貼り付けを1文字ずつbashに送るために発生します。このプロセスでは、bashは実際にはマシンから人間のタイピストを知りません。

私は通常、コピーと貼り付けを行うときに改行を含まないように特別な注意を払っていますが、試すことができる1つのトリックがありますC-x C-e。貼り付ける前に、bashに入力します。$EDITOR空のファイルで起動するはずです。そのファイルに何を保存して終了しても、bashが実行されます。そのため、コマンドをエディターに貼り付け、さらに操作して、すべてを一度に実行できます。


-1

私は会社とは関係ありません。非常に満足しています。次のターミナルプログラムを試してください:http : //www.emtec.com/zoc/index.html。Mac版もあります。

この回答に違反した場合は、SEルールを教えてください。回答を削除します。

編集:

他の回答を正しく理解した場合、この問題は端末プログラムが原因である可能性があります。ZOCターミナルプログラムは、作業用に完全に設計されたプロフェッショナルソフトウェアです。選択したテキストを追加の文字なしで貼り付けます。セッションを別のテキストファイルに記録できます。そしてもっとたくさん

更新:

端末プログラムにはオプションがありますPaste without final 'newline'。これが役立つかもしれません。


3
少なくとも、それは質問に答えるどのように言って下さい
ステファンChazelas

その端末で実行されているシェルのプロンプトで、改行または復帰文字を含む文字列を貼り付けるとどうなりますか?(ここで尋ねたように)シェルがコマンドをすぐに実行しない場合、どのように実行しますか?それらの文字を選択から削除しますか?bashでエスケープする前に^ V文字を挿入しますか?
ステファンChazelas

2
そのため、スパムのように見えます(このサイトにスパムを送信するつもりはなかったと思います)。質問には答えず、関連する商品の宣伝にすぎません。
ステファンChazelas

2
@AlBundy、お気に入りのターミナルクライアントがsecurity.stackexchange.com/q/39118で説明されているエクスプロイト(Stephaneの回答で述べられている)と、そこにあるリンクを試して、この問題を解決できるかどうかを確認してください。それがあなたを保護しているなら、あなたはそれを推奨する十分な根拠があります(答えの中にテストの詳細を提供してください。)
アレクシス2016

通常、問題はあなたが選択したものです した内容に改行含ま。「選択したテキストを貼り付ける」と、他の端末エミュレータの通常の動作とどう違うのですか?
Peter Cordes 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.