एक बैश स्क्रिप्ट का उपयोग करके कंसोल की चौड़ाई प्राप्त करना


15

मैं एक समस्या का सामना कर रहा हूं जहां मैं स्क्रिप्ट का उपयोग करके एक टर्मिनल का आकार प्राप्त करने की कोशिश कर रहा हूं। आम तौर पर मैं tput colsकंसोल के अंदर कमांड का उपयोग करता हूं, हालांकि मैं स्क्रिप्ट्स का सख्ती से उपयोग करके इस सुविधा को पूरा करने में सक्षम होना चाहता हूं।

अब तक मैं चल रहे कंसोल का पता लगा सकता हूं और इसकी फाइल पा सकता हूं। हालाँकि मैं कंसोल की चौड़ाई प्राप्त करने के लिए इस जानकारी का उपयोग करने के लिए संघर्ष कर रहा हूं। मैंने कमांड का उपयोग करने का प्रयास किया है tput, लेकिन मैं लिनक्स / स्क्रिप्ट के लिए काफी नया हूं इसलिए वास्तव में नहीं पता कि क्या करना है।

ऐसा करने का कारण यह है कि मैं एक क्रोन प्रविष्टि को सेट करने में सक्षम होना चाहता हूं जो हर बार इसकी चौड़ाई / स्तंभों के कंसोल को सूचित करता है।

यह मेरा अब तक का कोड है:

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)

के सामान्य उत्पादन TERMINALऔर TERMINALPATHकर रहे हैं और उदाहरण के लिए, औरpts/terminalnumber/dev/pts/terminalnumberpts/0/dev/pts/0


1
unix.stackexchange.com/questions/16578/… आपकी मदद कर सकता है।
phk

@ मुझे नहीं लगता कि इससे मदद मिलती है। मुद्दा यह है कि कॉलम / रेखाओं के वास्तविक मूल्यों के tty ड्राइवर को कैसे बताया जाए। यहाँ यह निर्धारित करना है कि उन्हें टटी चालक से।
रोएमा

मुझे नहीं लगा कि cronनौकरियों में टर्मिनलों को नियंत्रित करना था।
TMN

जवाबों:


18

tputआदेश एक उत्कृष्ट उपकरण है, लेकिन दुर्भाग्य से यह एक मनमाने ढंग से चयनित टर्मिनल के लिए वास्तविक सेटिंग्स प्राप्त नहीं कर सकता।

इसका कारण यह है कि यह टर्मिनल विशेषताओं के लिए स्टडआउट पढ़ता है , और यह वह जगह भी है जहां यह अपना उत्तर लिखता है। तो जिस क्षण आप के उत्पादन पर कब्जा करने की कोशिश करते हैं, tput colsउसकी जानकारी के स्रोत को भी हटा दिया है।

सौभाग्य से, sttyपढ़ता stdin के बजाय stdout , टर्मिनल विशेषताओं की अपनी प्रतिबद्धता के लिए तो यह है कि कैसे आप आकार जानकारी की आवश्यकता है प्राप्त कर सकते हैं:

terminal=/dev/pts/1
columns=$(stty -a <"$terminal" | grep -Po '(?<=columns )\d+')
rows=$(stty -a <"$terminal" | grep -Po '(?<=rows )\d+')

वैसे, यह लिखने के लिए अनावश्यक रूप से बोझिल है echo $(/usr/bin/tput cols)

किसी भी निर्माण के लिए echo $(some_command)आप some_commandउसके आउटपुट को चला रहे हैं और कैप्चर कर रहे हैं , जिसे आप echoआउटपुट में पास करते हैं । लगभग हर स्थिति में आप कल्पना कर सकते हैं कि आप अभी-अभी चले हैं some_commandऔर इसे सीधे अपना आउटपुट देने दें। यह अधिक कुशल है और पढ़ने में भी आसान है।


कौन सा कार्यान्वयन / का संस्करण tput/ nurses? मेरा (ncurses 6.0.20160625) TIOCGWINSZ को stderr पर करता है अगर वह इसे stdout पर नहीं कर सकता है। cols=$(tput cols)या cols=$(tput cols 2<> /dev/ttyx) ठीक काम करता है।
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस ने मुझे 5.9 + 20140913-1 + b1 मूल रूप से डेबियन "साइड" से स्थापित किया है। बस अब एक नए संस्करण की तलाश है।
13:48 पर रोएमा

1
साथ ही ncurses 5.7.20100313यहां काम करता है। क्या आप सकारात्मक हैं आपके cols=$(tput cols 2<> /dev/tty1)लिए काम नहीं करता है?
स्टीफन चेजलस

@ स्टीफनचेज़लस आकर्षक। आप रहे हों तो सही: अगर मैं ले जाने के लिए stdout एक टर्मिनल से दूर, tput colsसे पढ़ा करता stderr । मैं अब ... बाहर काम करने के लिए कैसे मेरा उत्तर पुनर्लेखन करने की जरूरत है
roaima

1
मैं stty size <"$terminal" | read rows columnsपार्स करने की कोशिश करने के बजाय उपयोग stty -a
करूंगा

13

tput colsऔर tput linesटर्मिनल के आकार को टर्मिनल से (टर्मिनल डिवाइस ड्राइवर से, टर्मिनल से ही नहीं) अपने स्टडआउट पर टर्मिनल डिवाइस से क्वेरी करें, और अगर stdout टर्मिनल डिवाइस नहीं है, जैसे cols=$(tput cols)कि यह तब पाइप से होता है, जैसे स्टोडर से।

इसलिए, एक मनमाने ढंग से टर्मिनल डिवाइस से मूल्यों को पुनः प्राप्त करने के लिए, आपको उस डिवाइस को stderr पर खोलने की आवश्यकता है tput:

{ cols=$(tput cols) rows=$(tput lines); } 2< "$TERMINALPATH"

(यहाँ केवल पढ़ने के लिए मोड में खुला है तो tputवहाँ अपने त्रुटि संदेश उत्पादन नहीं करता है)।

वैकल्पिक रूप से, आप उपयोग करने में सक्षम हो सकते हैं stty sizesttyस्टडिन पर टर्मिनल का प्रश्न:

read rows cols < <(stty size < "$TERMINALPATH")

उनमें से कोई भी मानक नहीं है इसलिए सभी प्रणालियों पर काम नहीं किया जा सकता है (और व्यवहार में)। यह GNU / Linux सिस्टम के लिए काफी पोर्टेबल होना चाहिए।

stty sizeटर्मिनल आकार को क्वेरी करने के लिए या अन्य विधि के अलावा POSIX का अनुरोध किया गया था, लेकिन चर्चा कहीं भी नहीं हो रही है।


9

यह स्क्रिप्ट:

#!/bin/bash

echo "The number of columns are $COLUMNS"
echo "The number of lines are $LINES"

पूरी तरह से और कुछ नहीं के साथ यहां काम किया .....

आप डेटा के साथ पर्यावरण चर क्यों सेट कर रहे हैं? कॉलम = $ (/ घर / परीक्षण / दस्तावेज़ / get_columns.sh)

क्या आप अन्य स्क्रिप्ट या टैटी से कॉलम और लाइनें प्राप्त करने की कोशिश कर रहे हैं? क्या यही है? फिर भी मेरे लिए अजीब है क्योंकि आप स्थानीय स्क्रिप्ट के लिए कॉलम पर्यावरण चर सेट कर रहे हैं ...।


यह cronएक विशेष टर्मिनल के लिए ओपी की नौकरी के भीतर मूल्यों को पुनः प्राप्त करने में मदद नहीं करता है ।
रोज़ा

1
Ahn? क्या? अब मैं और अधिक उलझन में हूँ, कैसे cronjobs लिपियों की चौड़ाई हो सकती है ????? वे वास्तव में एक टर्मिनल में नहीं चलते हैं।
लुसियानो अंड्रेस मार्टिनी

मुझे पता है। cronकाम अपनी विशेषताओं के लिए एक विशेष टर्मिनल प्रश्नों। (मुझे पूरी तरह से यकीन नहीं है कि ऐसा करने की आवश्यकता क्यों है, लेकिन यही ओपी चाहता है।)
रोआमा

@LucianoAndressMartini $ COLUMNS और $ LINES बैश वैरिएबल हैं, यह डैश और पॉश में काम नहीं करता है (उदाहरण के लिए)
ingroxd

टी.के.एस। मैं वास्तव में जानता हूं, लेकिन मेरी स्क्रिप्ट हैशबंग / बिन / बाश के साथ है मुझे लगता है कि यह आपके लिए यह जानना चाहिए कि आपको इसका उपयोग करना चाहिए। यदि आप कुछ यूनिक्स बिना बैश का उपयोग कर रहे हैं, तो शायद मेरा जवाब आपके लिए नहीं है।
लुसियानो एंड्रेस मार्टिनी

1

मेरा उत्तर रोएमा की तुलना में अलग है, क्योंकि यह गतिशील है। उसका / हर्स का जवाब आपको निर्माण में टर्मिनल का आकार देता है। यदि आप उदाहरण के लिए एक टाइलिंग विंडो मैनेजर का उपयोग कर रहे हैं, जैसे i3 या bspwm, तो आप टर्मिनल की वर्तमान चौड़ाई चाहते हैं। इस प्रकार मैं coreutils पैकेज से ssty का उपयोग करता हूं:

#!/bin/bash
stty size | awk '{print $2}'

ल्यूसियानो का समाधान xterm और xfce4-terminal में निर्दोष कार्य करता है। मुझे नहीं पता कि सभी टर्मिनल $ COLUMNS चर सेट करते हैं या नहीं।


यह कोई और अधिक गतिशील तो मेरा जवाब है। दोनों आपको कमांड को चलाने वाले बिंदु पर टर्मिनल आकार देते हैं।
रोमीमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.