Saya menghadapi masalah ketika saya mencoba untuk mendapatkan ukuran terminal dengan menggunakan skrip. Biasanya saya akan menggunakan perintah tput cols
di dalam konsol, namun saya ingin dapat menyelesaikan fitur ini dengan ketat menggunakan skrip.
Sampai sekarang saya dapat mendeteksi konsol yang sedang berjalan dan mendapatkan path file-nya. Namun saya berjuang untuk menggunakan informasi ini untuk mendapatkan lebar konsol. Saya sudah mencoba menggunakan perintah tput
, tapi saya cukup baru di Linux / skrip jadi karena itu tidak benar-benar tahu harus berbuat apa.
Alasan untuk melakukan ini adalah saya ingin dapat mengatur entri cron yang memberitahukan konsol lebar / kolomnya sesering mungkin.
Ini kode saya sejauh ini:
tty.sh
#!/bin/bash
#Get PID of terminal
#terminal.txt holds most recent PID of console in use
value=$(</home/test/Documents/terminal.txt)
#Get tty using the PID from terminal.txt
TERMINAL="$(ps h -p $value -o tty)"
echo $TERMINAL
#Use tty to get full filepath for terminal in use
TERMINALPATH=/dev/$TERMINAL
echo $TERMINALPATH
COLUMNS=$(/home/test/Documents/get_columns.sh)
echo $COLUMNS
get_columns.sh
#!/usr/bin/env bash
echo $(/usr/bin/tput cols)
Output normal dari TERMINAL
& TERMINALPATH
are dan , misalnya &pts/terminalnumber
/dev/pts/terminalnumber
pts/0
/dev/pts/0
sumber
cron
pekerjaan memiliki terminal pengendali.Jawaban:
The
tput
perintah adalah alat yang sangat baik, tapi sayangnya tidak dapat mengambil pengaturan sebenarnya untuk terminal sewenang-wenang dipilih.Alasan untuk ini adalah bahwa ia membaca stdout untuk karakteristik terminal, dan ini juga tempat ia menulis jawabannya. Jadi saat Anda mencoba untuk menangkap output
tput cols
Anda juga telah menghapus sumber informasinya.Untungnya,
stty
bacalah stdin daripada stdout untuk penentuan karakteristik terminal, jadi inilah cara Anda dapat mengambil informasi ukuran yang Anda butuhkan:By the way, itu tidak perlu rumit untuk menulis ini sebagai
echo $(/usr/bin/tput cols)
.Untuk konstruk apa pun yang
echo $(some_command)
Anda jalankansome_command
dan menangkap outputnya, yang kemudian diteruskanecho
ke output. Dalam hampir setiap situasi yang dapat Anda bayangkan Anda mungkin juga baru saja menjalankansome_command
dan membiarkannya mengirimkan output secara langsung. Ini lebih efisien dan juga lebih mudah dibaca.sumber
tput
/ yang mananurses
? Milik saya (ncurses 6.0.20160625) melakukan TIOCGWINSZ di stderr jika tidak dapat melakukannya di stdout.cols=$(tput cols)
ataucols=$(tput cols 2<> /dev/ttyx)
bekerja dengan baik.ncurses 5.7.20100313
sini. Apakah Anda positifcols=$(tput cols 2<> /dev/tty1)
tidak bekerja untuk Anda?tput cols
apakah membaca dari stderr . Saya sekarang perlustty size <"$terminal" | read rows columns
alih-alih mencoba menguraistty -a
tput cols
dantput lines
menanyakan ukuran terminal (dari driver perangkat terminal, bukan terminal itu sendiri) dari perangkat terminal pada stdout-nya, dan jika stdout bukan perangkat terminal seperti dalam kasus dicols=$(tput cols)
mana itu kemudian pipa, dari stderr.Jadi, untuk mengambil nilai dari perangkat terminal yang sewenang-wenang, Anda harus membuka perangkat itu di stderr dari
tput
:(di sini terbuka dalam mode read-only sehingga
tput
tidak menampilkan pesan kesalahannya di sana).Atau, Anda mungkin dapat menggunakan
stty size
.stty
menanyakan terminal di stdin:Tidak ada yang standar sehingga mungkin (dan dalam praktiknya akan) tidak berfungsi pada semua sistem. Seharusnya ini cukup portabel untuk sistem GNU / Linux.
Penambahan
stty size
atau metode lain untuk meminta ukuran terminal diminta ke POSIX tetapi diskusi tampaknya tidak terjadi di mana saja.sumber
Skrip ini:
Bekerja di sini dengan tidak ada yang lebih .....
Mengapa Anda mengatur variabel lingkungan dengan data? COLUMNS = $ (/ home / test / Documents / get_columns.sh)
Apakah Anda mencoba mendapatkan kolom dan garis dari skrip atau tty lain? Itu saja? Masih aneh bagi saya karena Anda sedang mengatur variabel lingkungan kolom untuk skrip lokal ....
sumber
cron
untuk terminal tertentu.cron
pekerjaan query terminal tertentu untuk karakteristiknya. (Saya tidak sepenuhnya yakin mengapa perlu melakukan ini, tapi itulah yang diinginkan OP.)Jawaban saya berbeda dari jawaban Roaima, karena ini dinamis. Jawabannya memberi Anda ukuran terminal saat pembuatan. Jika Anda misalnya menggunakan tiling window manager, seperti i3 atau bspwm, Anda lebih suka memiliki lebar terminal saat ini. Jadi saya menggunakan ssty dari paket coreutils:
Solusi Luciano bekerja tanpa cela di terminal xterm dan xfce4. Saya tidak tahu apakah semua terminal menetapkan variabel $ COLUMNS.
sumber