Yürütülen bir komuttan çıktı satırlarından önce sekmeler nasıl eklenir


16

Kısa bir soru. Çıktıyı Ubuntu 16.04 LTS'de sekmek mümkün mü? Bununla ne demek istediğimi göstermek için aşağıda iki resim oluşturdum.

img1

img2


1
Komut çıkışını benzer bir komutla iletmeniz YOUR COMMAND | indentveya önüne başka bir komut yazmanız gerekiyorsa (sadece bir alt çizgi olabilir) iyi olur _ YOUR COMMANDmu?
Byte Komutanı

1
@ByteCommander Bunu düşündüm, ancak bunu kullanım kolaylığı ve konsol çıktısının okunmasını kolaylaştırmak için yapıyorum. Bu yüzden tüm komutlarımın borularının çözüm olduğunu düşünmüyorum. Yanıtınız için teşekkür ederiz ve düzenleyin!
Alex Ng

1
[Lütfen metin çıktısının ekran görüntülerini göndermeyin. ] ( meta.askubuntu.com/q/8713/85695 )
terdon

Yanıtlar:


15

Dosya tanımlayıcılarıyla böyle bir şey yapabilirsiniz:

  1. daha sonra geri yükleyebilmemiz için mevcut çıkış tanımlayıcısını kaydet

    exec 3>&1
  2. çıkış akışını sekmeyi ekleyen bir işlem ikamesine yönlendirin - örneğin

    exec 1> >(paste /dev/null -)

Bu noktadan itibaren, standart çıktıya yazan herhangi bir işlem, o çıktıyı pastebaşlangıçta sekme ekleme komutuyla 'filtrelendi' .

  1. İşiniz bittiğinde, kaydedilen dosya tanımlayıcısını geri yükleyip geçici olanı kapatarak normal davranışa devam edebilirsiniz.

    exec 1>&3 3>&-

Yanıtınız için teşekkür ederim. Mükemmel olmasa da bir çözüme en yakın geldiğim budur.
Alex Ng

@AlexNg upvote için teşekkürler - özellikle ne istediğini yapmaz? bana bildirirsen ben onu geliştirmeye çalışacağım
steeldriver

Birkaç örnek vermek gerekirse: Komutlarınızı girdikten sonra, 'php -v', 'hostname' ve diğerleri gibi bazı komutlar istendiği gibi çalışır. Bununla birlikte, 'echo Hello World' gibi bir komut kullanıldığında, çıktı girişle birlikte görüntülenir ve sonraki komutu girerken giriş görsel görünümünü de olumsuz etkiler. Sekme işleminden, örneğin 'asdasd' gibi geçersiz bir komut girerken, diğer bazı komutlar da etkilenmez.
Alex Ng

Son olarak, değişen çıktıyı doğru şekilde göstermez (bunu nasıl doğru bir şekilde açıklayacağınızdan emin değil, özür dileriz). Örneğin, 'apt-get update' komutu kullanılırsa, sekme işlemi olmadan bir konsolla karşılaştırılırken fark edilir farklılıklar vardır.
Alex Ng

Sorun, bu yaklaşımın sadece STDOUT'u (akış 1) işlemesi, ancak STDERR'yi (akış 2) ele almamasıdır. Ayrıca, lessörneğin, örneğin, çıkışın kaydırılmasına izin veren benzer araçları kullanan programların çıktısını da keser man.
Byte Commander

9

Bu cevabın sizin için en uygun olmadığını anlıyorum, ancak _argüman olarak aldığı ve çıkışının tamamını bir sekme ile girintili olarak çalıştıran basit bir adla (veya henüz kullanılmamış başka bir şeyle) bir Bash işlevi yapabilirsiniz .

Bir örnek:

$ _ lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 16.04 LTS
        Release:    16.04
        Codename:   xenial

Bu işlevin kodu yalnızca şu olurdu:

_(){ sed "s/^/\t/" <($*); }

~/.bashrcDosyanıza ekleyerek , kullanıcının aşağıdaki Bash oturumlarında çalışmasını sağlayabilirsiniz:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

Tüm kullanıcılar tarafından kullanılabilir olmasını istiyorsanız, /etc/bash.bashrcbunun yerine ekleyin (yönetici hakları gerektirir):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

Alternatif olarak /usr/local/bin/_, Bash işlevleri olmadan ve tüm kullanıcılar için aynı şeyi elde etmek için aşağıdaki içeriğe benzer bir komut dosyası oluşturabilirsiniz :

#!/bin/bash
sed "s/^/\t/" <($*)

Kullanarak dosyayı kaydettikten sonra komut dosyasını çalıştırılabilir yapmalısınız

sudo chmod +x /usr/local/bin/_

5

İle echospesifik olarak, bunu gibi ters eğik çizgi kaçar yorumlamak olabilir \t(bir sekme durağı ile) -eanahtarı:

echo -e "\tHello World"

Ancak her komutun çıktısını bu şekilde değiştirmek mümkün değildir (veya muhtemelen mümkün değildir). Hedefiniz okuma kolaylığı ise, burada gösterildiği gibi komut isteminizin görünümünü (ör. Renklendirme) özelleştirmeyi düşünebilirsiniz:

Ortam değişkeninin içeriğini değiştirerek isteminizi özelleştirebilirsiniz PS1. Yukarıdaki ekran görüntüsünün blog yazısında bunun nasıl yapılacağına dair küçük bir örnek görebilirsiniz. ANSI kaçış dizileri ayrıntılı olarak nasıl kullanılır, daha rahat araçlar nasıl kullanılır, değişikliklerin yeni terminallerde varsayılan olarak nasıl uygulanması vb. Bu cevabın kapsamı dışındadır. Ancak bu tekniği kullanmaya karar verirseniz, web üzerinde birçok öğretici ve daha fazla bilgi vardır.


Yanıt için teşekkürler, ancak PS1'i zaten beğenime değiştirdim.
Alex Ng
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.