systemd 用户服务如何运行 xclip 命令?

systemd 用户服务如何运行 xclip 命令?

我想在使用后几秒钟自动清除剪贴板。

#!/usr/bin/env bash

LOCKFILE=/tmp/.clearclip-lock
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
  exit 1
fi
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
touch ${LOCKFILE}
echo $$ > ${LOCKFILE}

if xclip -o -selection clipboard 1>&2 2>/dev/null; then
  if watch -n 0.5 -t --chgexit xclip -o -selection clipboard @>/dev/null; then
    sleep 10
    xsel -bc
  fi
fi

rm -f ${LOCKFILE}

我才刚刚开始使用这个粗略的可执行文件,~/mypath/clearclip我想用用户本地 systemd 计时器触发它。无论如何,服务会抛出错误Error opening terminal: unknown.

# ~/.local/share/systemd/user/clearclip.service
[Unit]
Description=clear the clipboard
ConditionFileIsExecutable=%h/_path/clearclip.sh

[Service]
Environment=DISPLAY=:0
ExecStart=%h/_path/clearclip.sh
Type=oneshot

我的主要问题是:

是否有一个工具可以执行与 相同但非交互的功能watch -g?你的方法是什么?您是否会在 while 循环中将输出写入 tmp 文件以比较它们、恢复到预期或执行其他操作?

另一个问题是:双定时器设置是什么样的?

例如,计时器将检查剪贴板何时发生变化,并触发(或重新启动)另一个清除剪贴板选择的计时器

编辑 2018 年 7 月 25 日:

本周我已经放弃将此脚本与用户计时器一起使用。我正在使用 zpty 来模拟终端来消除opening terminal错误,但最终我只是clearclip &~/.config/zsh/.zlogin.

#!/usr/bin/env zsh
# zmodload zsh/zpty

oclip=""
let count='-1'
let timeout=70

clipchanged() {
  if ! xclip -o -selection clipboard 2>/dev/null 1>&2; then
    count='-1'
    return 1
  fi
  clip="$(xclip -o -selection clipboard)"
  if [[ -z "$clip" ]] || [[ "$oclip" == "$clip" ]]; then
    return 1
  elif [[ -z "$oclip" ]]; then
    oclip="$clip"
    return 1
  else
    (( count=timeout ))
    oclip="$clip"
    return 0
  fi
}

while true; do
  if (( count > 0 )); then
    ((count--))
    # echo -n "\r\033[K$count"
  fi
  if (( count == 0 )); then
    xsel -bc
  fi
  if clipchanged; then
    (( count=timeout ))
  fi
  sleep .5
done

编辑 2020 年 9 月 7 日:

我在标题中添加了一个适当的问题,尽管我很快就放弃了这个想法。要清除剪贴板或对更改进行操作,我使用--watch以下选项wl-copy(1)

--watch command...
    Instead of pasting once and exiting, continuously watch the clipboard for changes, and run the specified command each time a new selection appears. The spawned process can read the clipboard contents from its standard input. This mode requires a compositor that supports the wlroots data-control protocol.

相关内容