首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xsetroot输出截断?

Xsetroot输出截断?
EN

Unix & Linux用户
提问于 2022-03-09 07:04:17
回答 1查看 469关注 0票数 0

我一直在为dwm 6.3开发一个配置,它有很多补丁(如果有关系的话,可以在GuixSD上使用)。它们中的大多数还没有更新到6.3版本上,所以为了解决所有问题都付出了很大的努力。

为了正确设置状态栏(双状态和pango补丁是相关的),我遇到了一个问题,它似乎是由xsetroot -name中的字符限制、shell行长度限制、pango处理限制等引起的。

首先是我的dwm构建,以防出现错误。我试图设置底部的条形文字,以包括股票的股票,颜色根据每天的变化标志。我找到了脚本,它在某个地方查询一些API以获取数字,并将它们格式化为终端。下面是我的脚本版本,通过将终端颜色命令替换为pango标记字段,对此进行了更改。

代码语言:javascript
复制
#!/usr/bin/env bash
set -e

LANG=C
LC_NUMERIC=C

SYMBOLS=("$@")

if ! $(type jq > /dev/null 2>&1); then
  echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)"
  exit 1
fi

if [ -z "$SYMBOLS" ]; then
  echo "Usage: ./ticker.sh AAPL MSFT GOOG BTC-USD"
  exit
fi

FIELDS=(symbol marketState regularMarketPrice regularMarketChange regularMarketChangePercent \
  preMarketPrice preMarketChange preMarketChangePercent postMarketPrice postMarketChange postMarketChangePercent)
API_ENDPOINT="https://query1.finance.yahoo.com/v7/finance/quote?lang=en-US®ion=US&corsDomain=finance.yahoo.com"



COLOR_BOLD=''
COLOR_GREEN=''
COLOR_RED=''
COLOR_RESET=''


symbols=$(IFS=,; echo "${SYMBOLS[*]}")
fields=$(IFS=,; echo "${FIELDS[*]}")

results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" \
  | jq '.quoteResponse .result')

query () {
  echo $results | jq -r ".[] | select(.symbol == \"$1\") | .$2"
}

for symbol in $(IFS=' '; echo "${SYMBOLS[*]}" | tr '[:lower:]' '[:upper:]'); do
  marketState="$(query $symbol 'marketState')"

  if [ -z $marketState ]; then
    printf 'No results for symbol "%s"\n' $symbol
    continue
  fi

  preMarketChange="$(query $symbol 'preMarketChange')"
  postMarketChange="$(query $symbol 'postMarketChange')"

  if [ $marketState == "PRE" ] \
    && [ $preMarketChange != "0" ] \
    && [ $preMarketChange != "null" ]; then
    nonRegularMarketSign='\*'
    price=$(query $symbol 'preMarketPrice')
    diff=$preMarketChange
    percent=$(query $symbol 'preMarketChangePercent')
  elif [ $marketState != "REGULAR" ] \
    && [ $postMarketChange != "0" ] \
    && [ $postMarketChange != "null" ]; then
    nonRegularMarketSign='*'
    price=$(query $symbol 'postMarketPrice')
    diff=$postMarketChange
    percent=$(query $symbol 'postMarketChangePercent')
  else
    nonRegularMarketSign=''
    price=$(query $symbol 'regularMarketPrice')
    diff=$(query $symbol 'regularMarketChange')
    percent=$(query $symbol 'regularMarketChangePercent')
  fi

  if [ "$diff" == "0" ] || [ "$diff" == "0.0" ]; then
    color=
  elif ( echo "$diff" | grep -q ^- ); then
    color=$COLOR_RED
  else
    color=$COLOR_GREEN
  fi

  if [ "$price" != "null" ]; then
    printf "%-10s$COLOR_BOLD%8.2f$COLOR_RESET" $symbol $price
    printf "$color%10.2f%12s$COLOR_RESET" $diff $(printf "(%.2f%%)" $percent)
    printf " %s" "${nonRegularMarketSign}"
  fi
done

为了将错误与状态脚本所做的其他12件事情隔离开来,我编写了以下测试脚本:

代码语言:javascript
复制
#!/bin/bash

set -f
ticker="$(bash /home/dnw/ticker.sh DIA) | $(bash /home/dnw/ticker.sh VOO) | $(bash /home/dnw/ticker.sh QQQ) | $(bash /home/dnw/ticker.sh BTC-USD)"
echo "${ticker}"
xsetroot -name ";${ticker}"

执行它会产生正确的回显文本,但是出现在状态栏上的文本几乎没有打印出QQQ值。我通过关闭pango标记并在xsetroot行的变量展开之前添加一个空格来确保它是长度--而不是基于时间的截断;输出丢失了一个字符(原以为它是基于时间的;我的status.sh现在是多线程的coprocess lol)。

你们知道这其中哪一部分有字符限制吗?我该怎么处理呢?

谢谢。

EN

回答 1

Unix & Linux用户

发布于 2022-03-10 12:16:51

我想我会给任何有类似问题的人发帖子。

这是一个dwm问题;Pango补丁使数组stext的大小加倍以适应标记字符,但该条外补丁并没有使其数组大小加倍。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/693662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档