Sebagai contoh sederhana, saya ingin menulis skrip CLI yang dapat mencetak =
di seluruh lebar jendela terminal.
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
atau
#!/usr/bin/env python
print '=' * ???
atau
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
Jawaban:
tput cols
memberi tahu Anda jumlah kolom.tput lines
memberi tahu Anda jumlah baris.sumber
echo -e "lines\ncols"|tput -S
untuk mendapatkan garis dan cols lihat: linux.about.com/library/cmd/blcmdl1_tput.htmtput
adalah perintah yang bagus dengan banyak perintah untuk membaca keadaan terminal, mengendalikan kursor dan properti teks, dan sebagainya.alias dim="echo $(tput cols)x$(tput lines)"
:, yang mungkin menghasilkan80x50
.alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
Dalam bash, variabel
$LINES
dan$COLUMNS
lingkungan harus dapat melakukan trik. Ini akan diatur secara otomatis pada setiap perubahan ukuran terminal. (yaitu sinyal SIGWINCH )sumber
checkwinsize
opsi. Misalnya, skrip non-interaktif ini akan mencetak dimensi terminal tempat terminal dijalankan:shopt -s checkwinsize; (:); echo $LINES $COLUMNS
(checkwinsize
opsi hanya menginisialisasi variabel setelah menunggu subkulit selesai, itulah sebabnya kami memerlukan(:)
pernyataan)$LINES
dan$COLUMNS
diperbarui setelahSIGWINCH
dikirim, sebenarnya setelah eksekusi perintah interaktif. Jika Anda mencoba memperbaruiPS1
dengantrap SIGWINCH
Anda tidak dapat menggunakan$LINES
dan$COLUMNS
, mereka menyimpan nilai-nilai lama ((LINES
danCOLUMNS
hanya ditetapkan sebagai variabel shell oleh bash. Bash tidak akan menetapkan mereka sebagai variabel lingkungan , kecuali jika Anda mengekspor variabel shell ini.Dan ada
stty
, dari coreutilsIni akan mencetak jumlah baris dan kolom, atau tinggi dan lebar, masing-masing.
Kemudian Anda dapat menggunakan salah satu
cut
atauawk
untuk mengekstrak bagian yang Anda inginkan.Itu
stty size | cut -d" " -f1
untuk tinggi / garis danstty size | cut -d" " -f2
untuk lebar / kolomsumber
sumber
tr
perintah selama ini? (facepalm)yes '='
akan menampilkan jumlah baris '=' yang tak terbatas dan perintah berikut cukup mengatur untuk mengisi terminalUntuk melakukan ini di lingkungan Windows CLI, cara terbaik yang bisa saya temukan adalah dengan menggunakan perintah mode dan parsing output.
Semoga bermanfaat!
CATATAN : Tinggi yang dikembalikan adalah jumlah garis dalam buffer, itu bukan jumlah garis yang terlihat di dalam jendela. Adakah opsi yang lebih baik di luar sana?
sumber
Pada POSIX, pada akhirnya Anda ingin memohon panggilan
TIOCGWINSZ
(Get WINdow SiZe)ioctl()
. Sebagian besar bahasa seharusnya memiliki semacam pembungkus untuk itu. Misalnya dalam Perl Anda dapat menggunakan Term :: Size :sumber
:io.columns
Erlang:io:columns().
erlang.org/doc/man/io.html#columns-0TIOCGWINSZ
standar POSIX danioctl()
hanya ditentukan untuk fitur STREAMS usang.Seperti yang saya sebutkan dalam jawaban lyceus, kodenya akan gagal pada Windows lokal non-Inggris karena output dari
mode
mungkin tidak mengandung substring "kolom" atau "garis":Anda dapat menemukan substring yang benar tanpa mencari teks:
Perhatikan bahwa saya bahkan tidak peduli dengan garis karena tidak dapat diandalkan (dan saya sebenarnya tidak peduli dengan mereka).
Sunting: Menurut komentar tentang Windows 8 (oh Anda ...), saya pikir ini mungkin lebih dapat diandalkan:
Tapi cobalah mengujinya, karena saya tidak mengujinya.
sumber
---
baris. i.imgur.com/4x02dqT.png$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. Dan kemudian saya mengganti semuanya kecuali angka.CON device status:
? Mungkin mencocokkan sesuatu sepertiCON.*:
akan bekerja lebih baik.Terinspirasi oleh jawaban @ pixelbeat, ini adalah bilah horizontal yang muncul
tput
, sedikit penyalahgunaanprintf
padding / filling dantr
sumber
Ada beberapa kasus di mana baris / kolom dan kolom Anda tidak cocok dengan ukuran sebenarnya dari "terminal" yang digunakan. Mungkin Anda mungkin tidak memiliki "tput" atau "stty".
Berikut adalah fungsi bash yang dapat Anda gunakan untuk memeriksa ukuran secara visual. Ini akan bekerja hingga 140 kolom x 80 baris. Anda dapat menyesuaikan maksimum sesuai kebutuhan.
sumber