salin perintah terakhir di terminal

22

Saya dapat melihat perintah terakhir di terminal dengan menekan up arrowseperti pada contoh berikut:

Saya mengetik cd /:

Makss-Mac:~ maks$ cd /

... ditekan enter, perintah cd /dieksekusi dan sekarang saya dapat menekan up arrowdan melihat perintah cd /lagi:

Makss-Mac:/ maks$ cd /

Saya ingin tidak hanya melihat perintah terakhir tetapi menyalinnya ke clipboard.

Mungkin ada shortcut yang tidak hanya menampilkan perintah terakhir di terminal (seperti yang up arrowdilakukan) tetapi pada saat yang sama menyalinnya ke clipboard.

Atau mungkin ada jalan pintas untuk memilih semua dari jalur terminal saat ini. Jadi saya akan dapat menyalin perintah terakhir (setelah menekan up arrow) dengan menekan super+c. Tentu saja saya bisa memilihnya dengan mouse. Tetapi ketika perintah dalam 10 kali lebih lama dari cd /itu bisa terlalu memakan waktu, terutama jika Anda melakukannya setiap 30 detik.

Atau mungkin ada cara untuk menulis plugin untuk Terminal

Maxim Yefremov
sumber
Mungkin lebih mudah untuk menemukan solusi di sini jika Anda dapat menambahkan beberapa detail tentang apa yang ingin Anda lakukan dengan konten clipboard sesudahnya. Di mana Anda akan menempelkannya?
nohillside
ya untuk menempelkannya ke tab terminal lain
Maxim Yefremov

Jawaban:

17

Masukkan ini ke dalam ~/.bashrc ~/.bash_profileatau di mana pun Anda suka:

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

Setelah membuka jendela baru (atau menjalankan source ~/.bash_profile) Anda harus dapat menjalankan copyLastCmddan memiliki perintah di clipboard.

Untuk menjelaskan apa yang terjadi: pada dasarnya Anda menggunakan "perintah perbaikan" ( fc) untuk memberi Anda perintah terakhir, hapus spasi spasi awal dan akhir trailing untuk format yang lebih bagus, awklalu salin ke papan tulis Mac Anda pbcopy.

EDIT:

Sekarang kita tahu bahwa Anda ingin menyalin untuk menempel ke tab terminal lain, ada opsi lain: Tambahkan baris ini ke Anda ~/.bashrc ~/.bash_profileatau di mana pun Anda suka:

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

Kemudian, setelah Anda membuka beberapa tab baru (sebut saja "tab A" dan "tab B"):

  1. Jalankan perintah apa saja di tab A
  2. Beralih ke tab B, tekan enter pada baris kosong , memberi Anda baris baru "segar" (dan dengan demikian mengevaluasi kembali sejarah)
  3. gunakan panah atas sekali dan Anda harus memiliki perintah yang baru saja Anda masukkan di tab A.

EDIT 2: Saya telah mengganti penggunaan seddengan awkdalam jawaban asli di atas, untuk menjaga spasi putih terkemuka dan tertinggal.

Asmus
sumber
Itu alias hebat! Untuk memotong baris baru yang tertinggal, sehingga Anda dapat mengedit perintah setelah menempel, saya menggunakan awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler
@nwinkler: OH Anda benar, harus menggunakan awk: fc -ln -1 | awk '{$1=$1}1'akan menghapus spasi tambahan dan memimpin.
Asmus
1
harus memodifikasi alias untuk karakter khusus alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". masih mendapat upvote saya
Mike D
1
Saya menggunakan ini sampai saya melakukan "git -reset --hard" di satu terminal dan di "folder git yang tidak curiga" menekan panah dan masuk dengan tergesa-gesa karena saya pikir saya sedang menjalankan skrip yang saya gunakan sebelumnya. Anda dapat membayangkan apa yang terjadi, dan itulah terakhir kali saya menggunakan sejarah "global" yang dibagikan ini
MrGigu
@MrGigu terjadi pada saya dengan sejarah "lokal" di mana saya menekan panah "ke atas" dua kali, bukannya sekali, secara tidak sengaja - pelajarannya dipelajari dengan cara yang sulit, saya kira.
Asmus
5

Ini jawaban lain berdasarkan jawaban oleh @ Asmus. Untuk membuat aliasnya berfungsi di skrip bash saya, saya harus menggunakan sedikit kutipan, karena tanda kutip tunggal tidak berfungsi dalam alias yang dikutip tunggal tanpa beberapa kutipan tambahan:

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

Pada '\''dasarnya akan menutup kutipan saat ini, lalu menambahkan kutipan yang lolos, dan kemudian membuka kutipan yang sebenarnya lagi.

Versi di atas akan menyalin perintah terakhir ke clipboard Anda, dan setelah Anda menempelkannya, itu segera dieksekusi, karena itu akan memiliki baris baru di akhir.

Untuk menghilangkan baris baru di bagian akhir, sehingga Anda benar-benar dapat mengedit perintah sebelum menjalankannya, Anda dapat melakukan hal berikut:

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

The ORS=''(yang ini tanpa mengutip) akan menanggalkan karakter baris baru trailing, sehingga Anda dapat mengedit teks disisipkan sebelum menjalankannya.

nwinkler
sumber
5

Ini akan menggunakan ekspansi sejarah untuk mengambil perintah terakhir dan mengulanginya. Anda dapat pbcopymengirim ke untuk menyimpan perintah terakhir ke clipboard Anda.

> echo !! | pbcopy

Jika Anda menginginkan perintah dari riwayat Anda yang bukan yang terakhir , Anda dapat menjalankan:

> history

Dan referensi nomor perintah yang diinginkan seperti:

> echo !5 | pbcopy
Sam Berry
sumber
Ini mungkin menjadi favorit Anda, dan bahkan mungkin berhasil, tetapi Anda perlu memberikan sedikit penjelasan tentang apa yang sebenarnya dilakukan perintah , dan bagaimana OP (yang menerima salah satu jawaban lima tahun lalu) dapat menggunakannya secara efektif.
IconDaemon
@IconDaemon panggilan bagus. Saya pikir ini layak ditambahkan ke pertanyaan lama karena lebih sederhana daripada jawaban yang diterima karena tidak memerlukan penyesuaian profil.
Sam Berry
4

Saya datang ke sini karena mendapat jawaban yang sama persis dengan Sam Berry, tetapi itu tidak berhasil bagi saya (OSX 10.14.6).

Berhasil melakukannya dengan kutipan di sekitar !!:

echo "!!" | pbcopy

Chris Gillatt
sumber
3

Anda dapat mengatur riwayat Anda untuk mengabaikan perintah yang dimulai dengan spasi:

export HISTIGNORE=' *'

Dan kemudian jalankan perintah berikut untuk mengirimkan perintah terakhir ke clipboard (pastikan Anda memiliki spasi di awal):

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

Anda mungkin ingin menyimpan perintah sebagai alias untuk membuatnya lebih mudah diingat.

kidbrax
sumber