Ubah font dalam perintah gema

16

Apakah mungkin untuk mengubah atribut font dari output echo di zsh atau bash?

Apa yang saya inginkan adalah sesuatu yang mirip dengan:

echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".

sehingga mencetak: "Ini adalah font: normal, miring , tebal , kecil " dalam satu baris teks.

Sardathrion - menentang penyalahgunaan SE
sumber
Ini lebih berkaitan dengan emulator terminal yang dipertanyakan daripada dengan shell yang digunakan. Utas pertanyaan ini berisi beberapa petunjuk berharga, saya pikir
sr_
Biasanya, Anda tidak dapat mengubah ukuran font. Satu-satunya hal yang biasanya bisa Anda lakukan adalah mengubah warna dan terkadang atribut yang tebal / bergaris bawah. Untuk ini, Anda dapat menggunakan urutan pelarian ANSI. Lihat misalnya bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html untuk beberapa contoh.
jofel

Jawaban:

15

Pada sebagian besar, jika tidak semua emulator terminal, Anda tidak dapat menetapkan ukuran font atau font yang berbeda, hanya warna dan beberapa atribut (tebal, bergaris bawah, menonjol).

Di bash (atau di zsh atau shell lain), Anda dapat menggunakan urutan escape terminal secara langsung (selain dari beberapa yang eksotis, semua terminal mengikuti petunjuk xterm hari ini). CSIadalah ESC [, ditulis $'\e['dalam bash. Urutan melarikan diri untuk mengubah atribut adalah CSI Ps m.

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

Zsh memiliki fungsi yang nyaman untuk itu.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
Gilles 'SANGAT berhenti menjadi jahat'
sumber
16

Anda dapat memasukkan definisi warna ini dalam skrip atau file sumber. Bisa terlihat seperti ini.

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

Perhatikan bahwa Anda harus mereset kode warna ANSI setelah setiap contoh Anda meminta perubahan. The tput sgr0me-reset semua perubahan yang telah dibuat di terminal.

Saya percaya mengubah ukuran font atau huruf miring akan spesifik untuk terminal yang Anda gunakan.

Meskipun panduan ini khusus untuk menyesuaikan bash prompt Anda, ini adalah referensi yang baik untuk kode warna dan menghasilkan beberapa ide tentang apa yang dapat Anda lakukan.

George M.
sumber
5

Sepertinya tata letak tidak dapat menangani karakter- [0x1b]di depan [.

Baris pertama menjadi tebal:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Untuk tipe umum, saya hanya tahu

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

dan dari komentar, terima kasih manatwork dan GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

dan tidak tahu perbedaan antara io-std dan normal.

Saya belum melihat miring atau kecil di shell.

Anda dapat memasukkan mereka (terima kasih untuk manatwork juga) dengan Ctrl + v ESC di Bash, di mana ia akan ditampilkan sebagai ^[. Ini berarti seluruh urutan ANSI akan terlihat seperti ^[[1m boldatau ^[[1mbold(untuk menghindari yang kosong sebelum 'tebal').

Banyak editor mengalami masalah dengan (char) 0x1b. Alternatif: salin / tempel dari suatu tempat, atau gunakan

echo -e "\x1b[1m bold"

di bash, atau hex editor.

Pengguna tidak diketahui
sumber
1
Karakter melarikan diri dapat diketik: Ctrl + V, Esc. (Akan ditampilkan sebagai "^ [". Ini berarti seluruh rangkaian ANSI akan terlihat seperti "^ [[1mbold".)
manatwork
1
Ada lebih banyak atribut untuk disebutkan: \e[4mdigarisbawahi, \e[5mberkedip, \e[7mterbalik.
manatwork
@manatwork: menambahkannya.
pengguna tidak diketahui
@userunknown Terima kasih telah membantu, mengutak-atik kode Anda, saya menemukan italicecho -e "\x1b[3m italic"
GypsyCosmonaut
0

Sini:

http://en.wikipedia.org/wiki/ANSI_escape_code

(catatan: banyak dari mereka biasanya tidak berfungsi, tetapi sebagian besar ditandai demikian.)

Saya membuat game di terminal dan sangat bergantung pada tautan di atas. Ia bahkan memberi tahu Anda cara menyembunyikan / menyembunyikan kursor, membuat warna (30-an), "tebal" (lebih terang), lebih gelap, bergaris bawah, miring, warna latar belakang (40-an alih-alih 30-an), dll. Anda juga dapat mengubah lokasi kursor ( yang sangat membantu - misalnya, "\x1B[1A"memindahkan kursor ke atas satu baris, "\x1B[0;0H"memindahkan kursor ke baris 0, col 0, "\x1B[2J"membersihkan layar, "\x1B[2K"menghapus garis.

Untuk keperluan Anda seperti yang dikatakan orang:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

Catatan: Anda perlu yang -edi

echo **-e** "\x1b[35;1m Light purple \x1b[m"

atau Anda perlu menggunakan tanda kutip tunggal. Ketik man echountuk mengetahui alasannya (tanda kutip ganda biasanya menyulitkan saat mencetak; saat saya membutuhkan barang untuk tidak meluas atau saya perlu urutan pelarian ANSI, saya menggunakan tanda kutip tunggal karena mudah - walaupun saya sudah terbiasa melakukannya karena sering melakukannya) - untuk melupakan -e dalam hal ini Anda mendapatkan " box with numbers and letters[35; 1m").

Setiap kali Anda melihat CSImenggantinya dengan "\x1b["(atau "\e["atau "\u1b["). "\x1b["Saya pikir lebih standar, tetapi saya tidak benar-benar tahu apa perbedaan di antara mereka.

Dylan
sumber
Jika Anda suka mengacaukan string Anda dengan karakter tambahan, jangan gunakan \ e :-)
clearlight
@clearlight Saya tidak yakin apa yang Anda maksud. Saya pikir Anda mungkin bermaksud mengatakan "gunakan \ e". Namun, \ekurang didukung daripada yang \x1bsaya temukan. Hal optimal untuk dilakukan adalah salah satu esc=$'\e'atau esc=$'\x1b'(ini ada di bash) dan kemudian digunakan "${esc}[34;1m"(untuk, misalnya, biru cerah). Saya punya contoh semi-kompleks di sini ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) untuk string bash prompt;) Maafkan nama repo - Anda dapat berterima kasih kepada orang-orang di saluran freenode # archlinux-offtopic untuk itu.
Dylan
Alasan melakukannya esc=$'\e'adalah hal ini memungkinkan bash untuk membuat karakter ansi-escape di tempat, dan Anda mendapat manfaat darinya dalam beberapa cara. Kadang-kadang, pada kenyataannya, (seperti yang ditunjukkan dalam tautan github), Anda harus menggunakan metode ini untuk mendapatkan warna agar muncul dengan benar. Untuk versi bash yang lebih lama serta shell sh, Anda harus (tetapi tidak perlu) menggunakan metode ini untuk mendapatkan warna untuk muncul ... diberikan bahwa terminal menggunakan urutan melarikan diri yang dilakukan sebagian besar terminal modern.
Dylan