如何取得螢幕會話中視窗的資訊(標題、建立時間、可見內容)?我需要在腳本中執行此操作,因此我不需要尋找按鍵綁定或互動式命令。
像 tmux 這樣的東西list-windows
會很棒。
答案1
答案2
Ctrl-a w
按照說明嘗試順序這裡。
就我個人而言,我使用 .screenrc 檔案來始終將此資訊保留在螢幕底部(如 Windows 工作列)。我的螢幕配置(~/.screenrc)如下所示:
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
答案3
在 GNU Screen 中,取得所有視窗清單(並選擇要切換到的視窗)的預設鍵綁定是:
C-a "
答案4
最後我得到了它!
我需要在腳本中執行此操作...
介紹
我打開了 5 個窗口,關閉了窗口
#2
並開啟了一個名稱有問題的文件4$ esp32.pdf
在視窗中#3
…
screen -Q windows
0$ man screen 1*$ user@host$ 3$ pdfread: 4$ esp32.pdf 4-$ root@server#
該字串幾乎無法使用! (進一步查看,我的更快的功能.)
我的解決方案,作為一個函數
想要檢索開啟視窗的正確列表,即使某些視窗標題包含類似...2*$...
這樣的字串:
這是一個搜尋現有視窗號的函數,從0
到99
(預設)。
getWinList() {
if [[ $1 == -v ]]; then
local -n _outar="$2";shift 2
else local _outar
fi
_outar=()
local _string _pointer _maxid=${1:-99}
case $_maxid in
'' | *[!0-9]* )
cat <<EOUsage
Usage:
$FUNCNAME [-v <varname>] [INT]
-v varname Populate array "$varname" with window list
[INT] Optional last ID to check for existence (default 99)
EOUsage
return 1
;;
esac
for ((_pointer=0;_pointer<=_maxid;_pointer++)); do
_string=$(screen -p $_pointer -Q title) &&
printf -v _outar[_pointer] %s "$_string"
done
printf >&2 '\e[A\n\e[K'
[[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
for _pointer in ${!_outar[@]};do
printf ' %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
done
}
您可以使用-v
選項將結果儲存到大批變數並添加可選數量的視窗來測試:
我打開了 5 個窗口,關閉了窗口 #2,並在窗口 3 中打開了一個名稱有問題的文件...
getWinList
[0]: man screen
[1]: user@host$
[3]: pdfread: Little 4$ esp32.pdf
[4]: root@server#
getWinList 3
[0]: man screen
[1]: user@host$
[3]: pdfread: 4$ esp32.pdf
getWinList -v array 10
declare -p array
declare -a array=([0]="man screen" [1]="user@host\$" [3]="pdfread: 4\$ esp32.pdf" [4]="root@server#")
更快但不太可靠:
因為它是
- 基於
screen -Q windows
它的輸出受電流限制窗戶寬度, - 基於正規表示式,任何與此匹配的視窗標題關於可能會破壞結果數組。
getWinListFast() {
if [[ $1 == -v ]]; then
local -n _outar="$2";shift 2
else local _outar
fi
_outar=()
if [[ $1 ]]; then
cat <<EOUsage
Usage:
$FUNCNAME [-v <varname>]
-v varname Populate array "$varname" with window list
EOUsage
return 1
fi
. <(screen -Q windows |
sed '
:a;
s/^\(.*\n\|\)\([0-9]\+\)[*!-]*$ \(\([^ ]\| [^ ]\)\+\)\( \(.*\)\|\) *$/\1[\2]="\3"\n\6/;
ta;
s/[|$]/\\&/g;
s/.*/_outar=(&)\n/')
printf >&2 '\e[A\n\e[K'
[[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
for _pointer in ${!_outar[@]};do
printf ' %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
done
}