ターミナルの最後のコマンドをコピー


22

up arrow次の例のように押すと、ターミナルに最後のコマンドが表示されます。

私は入力しましたcd /

Makss-Mac:~ maks$ cd /

...押されたentercd /実行されたコマンド、今私はもう一度押しup arrowてコマンドを見ることができますcd /

Makss-Mac:/ maks$ cd /

最後のコマンドを見るだけでなく、クリップボードにコピーしたいです。

ターミナルに最後のコマンドを表示するだけでなくup arrow、クリップボードにコピーするショートカットが存在する場合があります。

または、現在の端末回線からすべてを選択するためのショートカットがあるかもしれません。そして、を押すことで(を押した後up arrow)最後のコマンドをコピーできますsuper+c。もちろん、マウスで選択できます。ただし、コマンドが10倍長い場合cd /、特に30秒ごとに実行する場合は時間がかかりすぎる可能性があります。

または、ターミナル用のプラグインを書く方法があるかもしれません


後でクリップボードのコンテンツをどうするかについての詳細を追加できれば、ここで解決策を見つける方が簡単かもしれません。どこに貼り付けますか?
nohillside

はい、別のターミナルタブに貼り付けます
マキシムYefremov

回答:


17

これをあなたの~/.bashrc ~/.bash_profile好きな場所に入れてください:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

新しいウィンドウを開く(または実行するsource ~/.bash_profile)とcopyLastCmd、クリップボードにコマンドを実行できるようになります。

何が起こっているのかを説明するには、基本的に「修正コマンド」(fc)を使用して最後のコマンドを取得し、より良い書式設定のために先頭と末尾の空白を削除awkし、でMacのペーストボードにコピーしますpbcopy

編集:

コピーして別のターミナルタブに貼り付けることがわかったので、別のオプションがあります。次の行を~/.bashrc ~/.bash_profile好きな場所に追加します。

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

次に、新しいタブをいくつか開いたら(「タブA」および「タブB」と呼びましょう):

  1. タブAのコマンドを実行します
  2. タブBに切り替え、空の行でEnter キーを押すと、「新しい」新しい行が表示されます(したがって、履歴が再評価されます)
  3. 上矢印を1回使用すると、タブAに入力したコマンドが表示されます。

編集2:先頭の空白と末尾の空白の両方を処理するために、上記の元の回答のsedwith の使用を置き換えましたawk


それは素晴らしいエイリアスです!あなたが貼り付けた後、コマンドを編集することができますので、末尾の新しい行を遮断するために、私が使用awkalias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler

@nwinkler:ああ、あなたは正しい、awkを使用すべきだった:fc -ln -1 | awk '{$1=$1}1'末尾と先頭の空白の両方を削除します。
アスマス

1
特殊文字のエイリアスを変更する必要がありましたalias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy"。まだ私の賛成票を取得
マイクD

1
ある端末で「git -reset --hard」を実行し、別の「unsuspecting git folder」で上向き矢印を押して、以前使用していたスクリプトを実行していると思ったので急いで入力するまでこれを使用しました。何が起こったのか想像できます。それは、この共有された「グローバル」な歴史を使用した最後の時間でした
MrGigu

@MrGiguは偶然に「上」矢印を1回ではなく2回押した「ローカル」履歴で私に起こりました-レッスンは難しい方法を学んだと思います。
アスマス

5

@Asmusの回答に基づく別の見解を以下に示します。bashスクリプトで彼のエイリアスを機能させるには、引用符を少し追加する必要がありました。引用符を追加しないと、単一引用符は単一引用符で囲まれたエイリアスでは機能しません。

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

'\''基本的には、現在の引用を閉じエスケープ引用符を追加して、再度、実際の見積もりを開きます。

上記のバージョンでは、最後のコマンドがクリップボードにコピーされ、貼り付けるとすぐに実行されます。末尾に改行があるためです。

最後に改行を削除して、コマンドを実行する前に実際に編集できるようにするには、次のようにします。

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

ORS=''あなたはそれを実行する前に、貼り付けたテキストを編集できるように(引用なしだという)、末尾に改行文字を取り除きます。


5

これは、履歴展開を使用して最後のコマンドを取得し、エコーします。にパイプしpbcopyて最後のコマンドをクリップボードに保存できます。

> echo !! | pbcopy

履歴から最後のコマンドではないコマンドが必要な場合は、次を実行できます。

> history

そして、次のような目的のコマンド番号を参照します。

> echo !5 | pbcopy

それはあなたのお気に入りかもしれませんし、うまくいくかもしれませんが、コマンドが実際に何をするのか、そしてOP(5年前に答えの1つを受け入れた)がそれを効果的に使用する方法について少し説明する必要があります。
IconDaemon

@IconDaemon良いコール。これは、プロファイルのカスタマイズを必要としないため、受け入れられた答えよりも簡単であるため、古い質問に追加する価値があると思います。
サム・ベリー

4

Sam Berryのまったく同じ答えを思いついたときにここに来ましたが、それは私には機能しません(OSX 10.14.6)。

の周りに引用符を付けてそうすることができました!!

echo "!!" | pbcopy


3

スペースで始まるコマンドを無視するように履歴を設定できます。

export HISTIGNORE=' *'

そして、次のコマンドを実行して、クリップボードへの最後のコマンドをgitします(先頭にスペースがあることを確認してください):

history 1 | cut -d " " -f 4- | pbcopy

おそらく、コマンドをエイリアスとして保存して、覚えやすくすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.