Расширение фигурной скобки не разворачивает переменные, потому что расширение фигурной скобки является самым первым шагом расширения оболочки, и переменные расширены позже.
Из страницы справочника удара:
Расширение фигурной скобки выполняется, прежде чем любые другие расширения и любые символы, особенные для других расширений, сохраняются в результате. Это является строго текстовым. Bash не применяет синтаксической интерпретации к контексту расширения или текста между фигурными скобками.
Так:
NUM=4
for i in {1..$NUM}
do
echo $i
done
печать
{1..4}
Если Ваш эмулятор терминала поддерживает его, можно сделать это использование того же механизма, используемого less
, vim
, и др., а именно, ti
и te
возможности termcap (smcup
и rmcup
в более современном terminfo). Они переключаются от основного устройства до вторичного экрана, и назад к основному устройству, соответственно.
Если Ваша система имеет tput
команда, можно использовать:
tput smcup # switch to secondary screen
...
tput rmcup # switch back to primary screen
Иначе, для xterm
, и вероятно для большинства других эмуляторов терминала, этого:
printf '\e[7\e[?47h'
должен переключиться на вторичный экран и это:
printf '\e[2J\e[?47l\e8'
должен переключиться назад на основное устройство (и отложить курсор, где это было).
tcsh имеет встроенное echotc
команда, таким образом, Вы могли сделать:
tcsh -c 'echotc ti'
...
tcsh -c 'echotc te'
(или просто используйте echotc
непосредственно, если Вы, оказывается, используете tcsh).
Это называют “альтернативным экраном” (и как topхиты Googleшоу , Вы необычны в симпатии этой функции). Некоторые терминалы поддерживают два экранных буфера, один используемый полноэкранными приложениями, другой используемый ориентированными на строку приложениями. Bash ничего не знает о них. Если команда просто испускает вывод к терминалу, можно использовать терминальные управляющие последовательности для переключения на вторичный экран, и назад (эти команды документируются в xterm ctlseqs).
printf '\e[?47h'; mycommand; printf '\e[?47l'
Обратите внимание, что нет никакого scrollback для альтернативного экрана, таким образом, Вы будете только видеть последний экранный из вывода. Если это - проблема, просто сделайте простую вещь:
mycommand | less
Существует только два экранных буфера. Если Вы хотите больше, используйте надлежащий экранный мультиплексор, такой как Screen или Tmux.
Bash ничего не знает об экранах (он может работать без того, чтобы быть замеченным, на самом деле). Можно перенаправить и стандартный вывод и стандартную погрешность в любой файл или канал, все же.
Ни один из текущих ответов, казалось, не работал над моей машиной, но я узнал о названной команде screen
, который, кажется, добивается цели для меня.
xterm
имеет опцию к (en|dis) способный те управляющие последовательности; другие, вероятно, делают также.
– Keith Thompson
31.12.2011, 05:53
tput smcup
иtput rmcup
кажется, делает задание. – Tyilo 01.01.2012, 15:37tput
, попробуйте современное1049
вместо47
. Это было представлено Xterm и поддерживается некоторыми другими эмуляторами терминала. Это очищает альтернативный экран при переключении на него и оставляет содержание на месте при переключении назад (таким образом, можно просматривать/копировать содержание после того, как полноэкранная программа вышла). – Chris Page 05.01.2012, 11:01trap 'tput rmcup' EXIT
. – Chris Page 05.01.2012, 11:05