Fare kullanmadan terminaldeki önceki hat çıkışını hızlı bir şekilde nasıl alabilirim?


13

Linux (örn. Ubuntu) terminali, son satırı almanın bir yöntemi var mı? Diyelim ki tdsistemime yüklü olmayan bir komutu rastgele yazıyorum, bu yüzden aşağıdaki gibi bir mesaj alacağım. sudo apt-get install textdrawHızlı bir şekilde çalıştırmak için bir "kısayol" istiyorum .

Böyle bir araç var mı veya son satırı fareyi kullanmadan panoya nasıl kopyalayabilirim?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$

Yukarı oka mı basın? Bunu denedin mi? Ayrıca Linux'ta sizin için de işe yarayabilecek olan geçmiş komutuna bakın.
Richie086

Terminal çoklayıcı programları, tmux ve ekran, panoya metin alma yeteneği sağlar. Ancak, Ubuntu'nun varsayılan GUI'sinde daha kolay bir yol olabilir, bu yüzden daha kolay bir yanıtın mevcut olduğundan şüpheleniyorum. PgUp, Shift-PgUp veya Ctrl-PgUp tuşlarına basıldığında kaydırma yapılabilir.
TOOGAM

3
@ Richie086 Lütfen dikkat, ihtiyacım olan şey sudo apt-get install textdrawdeğil td. yukarı ok sadece bana verecektd
Daniel

Yanıtlar:


6

Biraz müstehcenlik umursamıyorsanız (umrumda değil), tam olarak istediğiniz şeyi yapan bir araç olan fuck'i kullanmak isteyebilirsiniz .

Tam olarak değil, ama aynı sorunu çözüyor. En son satırı almak yerine, yazdığınız son komutla eşleşmeye çalışır.

Fuck önceki komut için bir kuralla eşleşmeye çalışır, eşleşen kuralı kullanarak yeni bir komut oluşturur ve çalıştırır.

Havuzda gösterilen örnekler, bahsettiğiniz senaryoların birkaçını gösterir.

resim açıklamasını buraya girin


2

Kısa cevap: hayır, muhtemelen bunu yapmak için uygun bir yönteminiz yok.

Uzun cevap:

  • o ise mümkün olanak tanıyan bir terminal emülatörü olması "sadece" nedeniyle bazı istenmeyen bir program klavye girdileri bilgi çalması verebilecek endişeleri genellikle yapılmaz uygulamada ekran içeriklerine ve düzenle onları geri okuyun.
  • bir kabuk olabilir yakalamalı komutlarınızın çıkışını tasarlanmış ve o (sadece komut geçmişi gibi) düzenlemek için izin edilecek. Komut gibi bir şey olsaydı karmaşık olurdu vi(çıktı güzel satır odaklı metin değildir). bash bunu yapmaz zaten.

Pratikte, insanların bu sınırlamaya geçici bir çözüm bulmak için yaptıkları, komut çıktısını yakalamak ve bunu düzenlemek için diğer programları kullanmaktır. Ama acil sorununuzu çözmez.

Örneğin, geçici kabuk komutları vermek için vi-benzeri-emacs kullanıyorum. Bunlar daha fazla girdi gerektirmezse, bunları bir pencerede çalıştırmak , komutun çıktısını yakalamak ve komutu düzeltmek için çıktıyı gerektiği gibi düzenlemek iyi çalışır. Emacs ayrıca vim gibi böyle bir şey yapmanıza izin verir.


2

Bu mesajı ubuntu'da bash'den var olmayan bir komutu çalıştırdıktan sonra aldıysanız, sisteminiz muhtemelen command_not_found_handleişlevi kullanıyor demektir . İçinde görebilirsiniz /etc/bash.bashrc.

Önemsiz bir saldırı bir seçenek olabilir: Ben sadece şu adlı bir komut dosyası oluşturdum cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

Sonra bu betiği kullanarak td komutunu çalıştırın:

# ./cnfh td

Ubuntu Kullanımı 14.04.2 LTS . Umarım bu yardımcı olur.


Bu gerçekten harika görünüyor ve belki de sistemime eklemek istediğim bir şey. Nasıl çalıştığı hakkında bilgi ekleyebilir misiniz? Tamamlamaları ve bunun gibi şeyleri işlemek için yerleşik kodu anlamak oldukça zordur.
Joe

2

Tmux v2.4 ve sonrasında (bu işlem https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 beri ) ile send-keys -X. Eski sürümlerde, farklı bir sözdizimi ile mümkün olabilir.

İçinde .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

Şimdi, prefix+!son satırı geçerli imleç konumuna kopyalar.

cursor-left dönüş yazmadan doğrudan yürütmek istiyorsanız, dışarıda bırakılabilir.

Not : son satır boşsa veya sarılmışsa işe yaramaz, ancak çoğu durumda hala yararlıdır


1

En son komuttan son çıkış satırını yürütmek için, bu komutu yeniden yürütmek istiyorsanız (tanı iletisi yayınlamak dışında hiçbir şey yapmadığı için),

$($(fc -ln -1) | tail -n 1)

Adım adım (katman katman):

  • fc ("Komutu Düzelt" anlamına gelebilir), komut geçmişine erişmek için bir kabuk yerleşik komutudur.

    • -ln
      • l- (küçük L) l önceki komut (s) ist
      • n- komutu içermez n umarası
    • 1 (one) - en son komut anlamına gelir

    fc -ln -1 komut numarası dahil değil, en son komutu listeler.

  • $(fc -ln -1) en son komutu yürütür .
  • $(fc -ln -1) | tail -n 1en son komutu yürütür ve çıktısının son satırını görüntüler. Örneğinizdeki sudo apt-get install textdrawçizgi budur .
  • $($(fc -ln -1) | tail -n 1)bu komutu yürütür .

Bunu takma adla yapabilirsiniz:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

Takma ad için daha kısa bir ad seçmenizi istiyorum.

Notlar:

  • Sadece basit komutlar için bu işleri - gibi hiçbir özel karakterler |, <, >, ;, &, hatta tırnak. Karmaşık komutları işlemeniz gerekiyorsa, muhtemelen bir ekleyerek yapabilirsiniz eval, ancak bu yaygın olarak önerilmez.
  • Son çıktı satırından başka bir şeye erişmeniz gerekiyorsa (örneğin, on yediden son son satıra), bir şeyler satırı yapabilirsiniz tail -n 17 | head -n 1.
  • En son komut dışında bir şeye erişmeniz gerekiyorsa, argümanlarını değiştirebilirsiniz fc. Bunun fc -ln -1kısa olduğunu unutmayın fc -ln -1 -1. En son üçüncü komutu almak için tuşunu kullanın fc -ln -3 -3.
  • Yukarıdaki gibi esnekliğe ihtiyacınız varsa, büyük olasılıkla takma ad yerine bağımsız değişkenler alan bir kabuk işlevi yazmalısınız.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.