最後に実行したコマンド何行かをクリップボードにコピーする

最後に実行したコマンドをクリップボードにコピーするのが
、面倒なので作成した。
シェルを対話的に実行して少しずつ、
スクリプトを作成するときに使う。

最後に実行したコマンドだけ実行する場合は下のようになる
$ history | tail -n 2 | head -n 1 | sed 's/^ *[0-9]* *//' |  xsel --clipboard --input

(#macの人はxsel --clipboard --inputをpbcopyに置き換えてくだしあ。)

  1. tail -n 2 | head -n 1はhistoryの最後から2番めの行を取得している。最後の行にはhistoryコマンドそのものが入るため。
  2. sed で行番号を消している。先頭何文字か空白スペース、その後に何文字か数字が続き、そのあと何文字か空白スペースになるのでこれらを消す。

更に、最後に実行したコマンドを何行か取得したい場合もあるはずなので、
引数を受け取ったら最後からその行分をクリップボードに取得するようにも書きたい。

最終的には下のような関数になる。

function cliplastcommands() {
    local n
    n=$1
    if [ -z $1 ]; then
        n=1
    fi
    history | tail -n $(( $n + 1)) | head -n $n | sed 's/^ *[0-9]* *//' | xsel --clipboard --input
}

要所だけ説明すると
  1. localで変数がグローバルを汚染しないようにしておく。(ほぼ決まり文句)
  2. bashでは足し算、引き算等は$(( $n + 1))のようにカッコを二重に書く必要がある。
  3. if文で引数を受け取らなかった場合は、最後の一行だけ実行するように書いている。

である。
これを~/bin/myfunctions

ファイルに書いておく。

~/.bashrcに
source ~/bin/myfunctions
と書いておくと
ログイン後に

$ cliplastcommands  指定の行数

で実行できるようになるはずだ。

コメント

人気の投稿