从 GUI 运行时,Shell 脚本不会运行某些命令

从 GUI 运行时,Shell 脚本不会运行某些命令

我有以下脚本:

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip
echo "OTP Copied!"
sleep 2

oathtool当我进入终端并输入类似./VIP或 的内容时,就会运行sh ./VIP。但是,当我双击 sh 文件并选择在终端中运行时,只有echosleep命令执行,oathtool什么也不做。

答案1

如果您已选中每次都询问为了可执行文本文件在里面Nautilus 偏好设置,那么您将有两个选项Run in Terminal,并且Run,当您用鼠标(双击)单击一个可执行文件时:

在此处输入图片描述

您需要做出选择Run才能实现您想要的结果。如果您已设置,这也是默认行为打开时运行可执行文本文件在 Nautilus 偏好设置中。

这两个选项Run in TerminalRun不同的行为,但不幸的是我没有找到任何其他文档。第一个选项可能创建一个临时环境,当终端关闭时该环境就会消失。我们可以通过exec sh在脚本底部添加以下内容来证明这一点:

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip
echo "OTP Copied!"
sleep 2
exec sh

该命令exec sh将用新 shell 替换当前 shell(脚本的 shell)sh,因此终端窗口将保持打开状态,并且剪贴板将处于活动状态,直到您关闭终端窗口。另一个选项是延长时间sleep,然后剪贴板将处于活动状态,而终端窗口睡觉

如果您使用Run选项或自定义快捷方式我建议您按以下方式修改脚本:

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip \
&& notify-send "OTP Copied!"

因此,notify-send仅当前一个命令返回时,才会在 GUI 环境中向您发送通知真的,这就是 的含义&&


我已经在 Ubuntu 16.04 和 19.04 中测试了上述内容,没有区别——相同的行为和提出的解决方案在两个操作系统中都有效。

相关内容