我有以下脚本:
#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip
echo "OTP Copied!"
sleep 2
oathtool
当我进入终端并输入类似./VIP
或 的内容时,就会运行sh ./VIP
。但是,当我双击 sh 文件并选择在终端中运行时,只有echo
和sleep
命令执行,oathtool
什么也不做。
答案1
如果您已选中每次都询问为了可执行文本文件在里面Nautilus 偏好设置,那么您将有两个选项Run in Terminal
,并且Run
,当您用鼠标(双击)单击一个可执行文件时:
您需要做出选择Run
才能实现您想要的结果。如果您已设置,这也是默认行为打开时运行可执行文本文件在 Nautilus 偏好设置中。
这两个选项Run in Terminal
有Run
不同的行为,但不幸的是我没有找到任何其他文档。第一个选项可能创建一个临时环境,当终端关闭时该环境就会消失。我们可以通过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 中测试了上述内容,没有区别——相同的行为和提出的解决方案在两个操作系统中都有效。