Cara menyisipkan tab sebelum jalur output dari perintah yang dijalankan

16

Hanya pertanyaan singkat. Apakah mungkin untuk meng-tab output pada Ubuntu 16.04 LTS? Saya telah membuat dua gambar di bawah ini untuk mencoba dan menggambarkan apa yang saya maksud dengan ini.

img1

img2

Alex Ng
sumber
1
Apakah tidak apa-apa jika Anda harus menyalurkan output perintah melalui perintah lain seperti YOUR COMMAND | indentatau jika Anda harus mengetikkan perintah lain di depannya (bahkan mungkin hanya garis bawah) seperti _ YOUR COMMAND?
Byte Commander
1
@ByteCommander Saya telah mempertimbangkan itu, namun saya melakukan ini untuk kemudahan penggunaan dan untuk membuat keluaran konsol lebih mudah dibaca. Jadi saya tidak berpikir semua perintah saya adalah solusi. Terima kasih atas tanggapannya dan edit!
Alex Ng
1
[Tolong jangan memposting screeshots dari output teks. ] ( meta.askubuntu.com/q/8713/85695 )
terdon

Jawaban:

15

Anda dapat melakukan sesuatu seperti ini - dengan deskriptor file:

  1. simpan deskriptor keluaran saat ini sehingga kami dapat mengembalikannya nanti

    exec 3>&1
  2. mengarahkan aliran output ke substitusi proses yang menyisipkan tab - misalnya

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

Dari titik ini, setiap proses yang menulis ke output standar akan memiliki output yang 'difilter' melalui pasteperintah untuk memasukkan tab di awal.

  1. Setelah selesai, Anda bisa melanjutkan perilaku normal dengan mengembalikan deskriptor file yang disimpan dan menutup yang sementara

    exec 1>&3 3>&-
Steeldriver
sumber
Saya ingin mengucapkan terima kasih atas tanggapannya. Ini adalah solusi terdekat yang pernah saya gunakan meskipun tidak sempurna.
Alex Ng
@AlexNg terima kasih atas upvote - dalam hal apa ia tidak melakukan apa yang Anda minta? jika Anda memberi tahu saya, saya akan berusaha memperbaikinya
steeldriver
Untuk memberikan beberapa contoh: Setelah memasukkan perintah Anda, beberapa perintah berfungsi seperti yang dimaksud seperti 'php -v', 'hostname' dan lainnya. Namun, ketika menggunakan perintah seperti 'echo Hello World', output ditampilkan sesuai dengan input dan juga berdampak buruk pada tampilan visual input saat memasukkan perintah berikutnya. Beberapa perintah lain juga tidak terpengaruh oleh proses tabbing, seperti saat memasukkan perintah yang tidak valid seperti 'asdasd'.
Alex Ng
Akhirnya, itu tidak benar menampilkan output yang berubah (tidak yakin bagaimana menggambarkan ini dengan benar, permintaan maaf). Misalnya, jika perintah 'pembaruan apt-get' digunakan, ada perbedaan nyata ketika membandingkannya dengan konsol tanpa proses tab.
Alex Ng
Masalahnya adalah bahwa pendekatan ini hanya menangani STDOUT (stream 1), tetapi tidak STDERR (stream 2). Itu juga memecah output program yang menggunakan lessatau alat serupa untuk memungkinkan gulir output, seperti misalnya man.
Byte Commander
9

Saya mengerti jawaban ini tidak optimal untuk Anda, tetapi Anda bisa membuat fungsi Bash dengan nama sederhana _(atau apa pun yang belum digunakan) yang menjalankan perintah yang didapatnya sebagai argumen dan indentasi semua outputnya dengan sebuah tab.

Sebuah contoh:

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

Kode fungsi ini hanya berupa ini:

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

Anda dapat menambahkannya ke ~/.bashrcfile Anda sehingga akan tersedia di semua sesi Bash pengguna Anda dengan menjalankan:

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

Jika Anda ingin membuatnya tersedia untuk semua pengguna, tambahkan saja /etc/bash.bashrc(memerlukan hak admin):

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

Atau Anda juga bisa membuat file skrip seperti /usr/local/bin/_dengan konten berikut untuk mencapai yang sama tanpa fungsi Bash dan untuk semua pengguna:

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

Anda harus membuat skrip dapat dieksekusi setelah menyimpan file menggunakan

sudo chmod +x /usr/local/bin/_
Komandan Byte
sumber
5

Dengan echospesifik, Anda dapat mengartikan backslash lolos seperti \t( penghentian tab ) dengan -esakelar:

echo -e "\tHello World"

Tetapi hampir tidak mungkin (atau mungkin mungkin) untuk memodifikasi output dari setiap perintah dengan cara itu. Jika kemudahan membaca adalah tujuan Anda, Anda mungkin ingin melihat ke dalam menyesuaikan tampilan (misalnya pewarnaan) dari command prompt Anda, seperti yang ditunjukkan di sini:

Anda dapat menyesuaikan permintaan Anda dengan mengubah konten variabel lingkungan PS1. Anda dapat melihat sedikit contoh bagaimana melakukannya di posting blog dari tangkapan layar di atas. Cara menggunakan yang disebut urutan pelarian ANSI secara terperinci, cara menggunakan alat yang lebih nyaman, bagaimana agar perubahan diterapkan secara default di terminal baru dll. Berada di luar cakupan jawaban ini. Tetapi jika Anda memutuskan untuk menggunakan teknik itu, ada banyak tutorial dan informasi lebih lanjut di web.

Henning Kockerbeck
sumber
Terima kasih atas tanggapannya, namun saya sudah mengubah PS1 sesuai dengan keinginan saya.
Alex Ng