【问题标题】:notify-send command issue in shell scriptshell 脚本中的 notify-send 命令问题
【发布时间】:2019-01-31 15:41:10
【问题描述】:

我有一个包含以下文本的文本文件 b.txt:

notify-send -i gtk-info "你好吗" -h string:x-canonical-private-synchronous:anything

我有一个带有以下代码的 shell 脚本:

#!/bin/sh

while true;
do if [ -s b.txt ]
then
value="$(cat b.txt)"
exec $value
sleep 0.1
fi
done

当我运行脚本时,它会抛出以下错误并且不显示通知:

选项数量无效。

但是当文本文件包含只有这样两个单词的命令时:

notify-send -i gtk-info "你好吗" -h 字符串:x-canonical-private-synchronous:任何东西

通知显示完美。

仅当我通过 shell 脚本执行 notify-send 时才会出现此问题。 如何显示包含任意字数消息的通知?

【问题讨论】:

  • 您可能对exec 的含义感到奇怪。

标签: bash shell notifications ubuntu-16.04 notify-send


【解决方案1】:

exec 在这里使用是完全错误的。可以试试

#!/bin/sh

while true;
do
  if [ -s ./b.txt ]
  then
    . ./b.txt
    sleep 0.1
  fi
done

但是在一个紧密的循环中运行它似乎是一件奇怪的事情,并且执行一个未知来源的文件充其量是可疑的。您确定此文本文件将始终包含您期望的内容并且不能被任何人修改吗?为什么首先要将此命令放在单独的文件中?

【讨论】:

  • ./b.txt:文本文件繁忙,有时会出现此错误
  • 文件由 docker 容器生成。由于docker不支持notify-send所以我使用这种方法将命令写入txt文件并在主机上执行
  • docker exec whatever | sh 将避免临时文件和相关问题。 “文本文件忙”表示 Docker 尚未(还?)关闭该文件。这似乎仍然是一个相当……奇特的设计。
【解决方案2】:

尝试将exec $value 替换为eval $value

【讨论】:

  • 虽然这可能会解决眼前的问题,但它通常是可疑的建议。至少,您应该有一些注意事项。
  • @tripleee 这个解决方案似乎可以完美运行,没有任何问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2016-11-14
  • 2013-02-17
相关资源
最近更新 更多