【问题标题】:Bash script works in terminal emulator, but not as i3 keybindBash 脚本在终端模拟器中工作,但不能作为 i3 键绑定
【发布时间】:2018-11-30 18:45:08
【问题描述】:

我有一个锁屏脚本(通过 i3lock)可以在终端窗口中正确运行,但在 i3 配置中用作键绑定时却不能。

脚本非常简单:

# Take screenshot
scrot /tmp/screenshot.png

# Pixelate and add central logo
magick /tmp/screenshot.png -scale 10% -scale 1000% -gravity center /home/user/bin/archlogo.png -composite /tmp/lock.png

# Lock using pixelated image & logo
i3lock -e -f -c 000000 -i /tmp/lock.png

脚本保存到~/bin/lock 并且可执行。该目录也已在我的~/.bash_profile 中标识。

没有错误信息,只是终端光标短暂闪烁。

~/.config/i3/config中的相关行:

# lock screen
bindsym $mod+l exec lock

($mod+l 的默认键绑定已删除,i3 已重新启动)。

【问题讨论】:

    标签: linux bash archlinux i3


    【解决方案1】:

    ~/.bash_profilebash 的配置文件,因此仅在bash 启动时加载(作为交互式登录shell 或由其他bash 配置文件显式获取,例如~/.bashrc)。 i3 本身不会从~/.bash_profile 加载任何内容,X.org 也不会。因此,除非您从 bash shell 启动 X 会话(例如使用控制台中的 startx),否则不会加载对 PATH 的任何更改,并且 i3 不会知道 ~/bin 被添加到 PATH

    如果您想将PATH 修改为i3 本身,那么~/.bash_profile 不是正确的位置。不幸的是,对于 X 会话,“正确的位置”很大程度上取决于您如何启动它(例如,从控制台使用 start 或使用一些桌面管理器,如 lightdmkdm)。

    您可以将PATH 的设置添加到~/.pam_environment,这 - 至少在 Arch 上 - 应该将给定值添加到系统默认设置 PATH。例如,如果您将以下内容放入您的 ~/.pam_environment

    PATH=/home/soundscape/bin
    

    默认值是

    /usr/local/sbin:/usr/local/bin:/usr/bin
    

    你最终会得到

    /home/soundscape/bin:/usr/local/sbin:/usr/local/bin:/usr/bin
    

    当然,当您启动bash 时,~/.bash_profile 或类似文件中的任何设置可能会进一步修改此值。

    注意:~/.pam_environment不支持任何参数扩展,所以添加类似

    PATH=${PATH}:${HOME}/bin
    

    工作。

    【讨论】:

    • 感谢您的解释。这很有道理。考虑到您的注意,我使用了以下指定exec ${HOME}/bin/lock 的建议,效果很好。我将保留 $PATH 环境变量,以供将来与 WM 无关的脚本使用。
    【解决方案2】:

    我记得类似的东西...尝试像这样指定绝对路径,可能是exec 不尊重$PATH 环境变量:

    # lock screen
    bindsym $mod+l exec "${HOME}/bin/lock"
    

    【讨论】:

    • 感谢您的建议。这是一种享受,并且与上面提到的 Adaephon 合情合理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2015-09-29
    • 2016-07-21
    • 2018-05-27
    相关资源
    最近更新 更多