간단한 예로 =
터미널 창의 전체 너비에 걸쳐 인쇄 할 수있는 CLI 스크립트를 작성하려고합니다 .
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
또는
#!/usr/bin/env python
print '=' * ???
또는
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
간단한 예로 =
터미널 창의 전체 너비에 걸쳐 인쇄 할 수있는 CLI 스크립트를 작성하려고합니다 .
#!/usr/bin/env php
<?php
echo str_repeat('=', ???);
또는
#!/usr/bin/env python
print '=' * ???
또는
#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo
답변:
tput cols
열 수를 알려줍니다.tput lines
행 수를 알려줍니다.echo -e "lines\ncols"|tput -S
줄과 열을 모두 얻으려면 linux.about.com/library/cmd/blcmdl1_tput.htm
tput
터미널의 상태를 읽고, 커서와 텍스트 속성을 제어하는 등 많은 명령을 가진 훌륭한 명령입니다 .
alias dim="echo $(tput cols)x$(tput lines)"
,이 발생할 수 있습니다 80x50
.
alias dim='echo Terminal Dimensions: $(tput cols) columns x $(tput lines) rows'
배쉬에서 $LINES
와 $COLUMNS
환경 변수 트릭을 할 수 있어야합니다. 터미널 크기가 변경되면 자동으로 설정됩니다. (즉, SIGWINCH 신호)
checkwinsize
옵션 을 설정하면 비 대화식 스크립트에서 작동합니다 . 예를 들어,이 비 대화식 스크립트는 실행되는 터미널의 크기를 인쇄합니다. shopt -s checkwinsize; (:); echo $LINES $COLUMNS
( checkwinsize
옵션은 서브 쉘이 완료되기를 기다린 후에 만 변수를 초기화하므로 (:)
명령문이 필요합니다 )
$LINES
그리고 $COLUMNS
이후에 업데이트됩니다 SIGWINCH
실제로 대화 형 명령 실행 후, 전송됩니다. PS1
와 업데이트를 시도 trap SIGWINCH
하면 $LINES
and를 사용할 수 없으며 $COLUMNS
이전 값을 유지합니다 ((
LINES
및 COLUMNS
전용으로 설정되어 쉘 변수 떠들썩한 파티에 의해. 이 셸 변수를 내 보내지 않으면 Bash는 환경 변수 로 설정하지 않습니다 .
그리고 거기 stty
에서, 로 coreutils
$ stty size
60 120 # <= sample output
행과 열의 수 또는 높이와 너비를 각각 인쇄합니다.
그럼 당신은 사용할 수 있습니다 cut
또는 awk
당신이 원하는 부분을 추출 할 수 있습니다.
그것은 stty size | cut -d" " -f1
높이 / 라인과 stty size | cut -d" " -f2
너비 / 열을위한 것입니다.
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
tr
몇 년 동안 내가 명령을 어떻게 그리워 했 습니까? (facepalm)
yes '='
는 무한한 양의 '='줄을 출력하고 다음 명령은 터미널을 채울만큼 충분히 구성됩니다
Windows CLI 환경 에서이 작업을 수행하려면 가장 좋은 방법은 mode 명령을 사용하고 출력을 구문 분석하는 것입니다.
function getTerminalSizeOnWindows() {
$output = array();
$size = array('width'=>0,'height'=>0);
exec('mode',$output);
foreach($output as $line) {
$matches = array();
$w = preg_match('/^\s*columns\:?\s*(\d+)\s*$/i',$line,$matches);
if($w) {
$size['width'] = intval($matches[1]);
} else {
$h = preg_match('/^\s*lines\:?\s*(\d+)\s*$/i',$line,$matches);
if($h) {
$size['height'] = intval($matches[1]);
}
}
if($size['width'] AND $size['height']) {
break;
}
}
return $size;
}
도움이 되길 바랍니다.
참고 : 반환 된 높이는 버퍼의 줄 수이며 창에 표시되는 줄 수는 아닙니다. 더 나은 옵션이 있습니까?
POSIX에서는 궁극적으로 TIOCGWINSZ
(Get WINdow SiZe) ioctl()
호출을 호출 하려고 합니다. 대부분의 언어에는 일종의 래퍼가 있어야합니다. 예를 들어 Perl에서는 Term :: Size를 사용할 수 있습니다 .
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
:io.columns
얼랭 : io:columns().
erlang.org/doc/man/io.html#columns-0
TIOCGWINSZ
는 POSIX 표준과 ioctl()
쓸모가 기능을 스트림에서만 정의된다.
내가 lyceus answer에서 언급했듯이, 영어가 아닌 로케일 Windows에서는 그의 출력에 mode
하위 문자열 "columns"또는 "lines"가 포함되지 않을 수 있기 때문에 코드가 실패합니다 .
텍스트를 찾지 않고 올바른 하위 문자열을 찾을 수 있습니다.
preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
신뢰할 수 없기 때문에 줄을 귀찮게하지 않습니다 (실제로 신경 쓰지 않습니다).
편집하다: Windows 8 (oh you ...)에 대한 의견에 따르면 이것이 더 신뢰할 수 있다고 생각합니다.
preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
$cols = $matches['cols'];
테스트하지 않았으므로 테스트 해보십시오.
---
줄 이상을받습니다 . i.imgur.com/4x02dqT.png
$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
입니다. 그런 다음 숫자 이외의 모든 것을 바꿉니다.
CON device status:
. 어쩌면 비슷한 CON.*:
것을 일치시키는 것이 더 좋을 것입니다.
행 / LINES 및 열이 사용중인 "터미널"의 실제 크기와 일치하지 않는 경우가 있습니다. "tput"또는 "stty"가 없을 수도 있습니다.
다음은 크기를 시각적으로 확인하는 데 사용할 수있는 bash 함수입니다. 이것은 최대 140 열 x 80 행까지 작동합니다. 필요에 따라 최대 값을 조정할 수 있습니다.
function term_size
{
local i=0 digits='' tens_fmt='' tens_args=()
for i in {80..8}
do
echo $i $(( i - 2 ))
done
echo "If columns below wrap, LINES is first number in highest line above,"
echo "If truncated, LINES is second number."
for i in {1..14}
do
digits="${digits}1234567890"
tens_fmt="${tens_fmt}%10d"
tens_args=("${tens_args[@]}" $i)
done
printf "$tens_fmt\n" "${tens_args[@]}"
echo "$digits"
}