使用环境变量上的条件编写幂等shell脚本

时间:2015-11-03 11:25:05

标签: shell if-statement environment-variables undefined xmodmap

我正在尝试使用xmodmap来交换大写和转义。我将xmodmap ~/.Xmodmap命令放在我的.zshrc中。但每当我启动一个新的shell时,xmod设置会再次交换。所以我试图将xmodmap命令包装在一个检查全局变量的条件中,但是我无法让它工作。

if [ ! "$CAPS_MAPPED" = true ]; then     # check if CAPS_LOCKED is empty
    echo 'mapping'
    xmodmap ~/dotfiles/.xmodmap            # call xmodmap
    export readonly CAPS_MAPPED=true       # assign global var
fi

我尝试了不同的变体,但由于我对shell脚本相当缺乏经验,所以我不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

最好的方法是将xmodmap调用放在X init脚本而不是shell init脚本中。

您的每用户X init脚本为~/.xinitrc

创建~/.xinitrc如果它不存在并将xmodmap命令添加到最后。

~/.xinitrc文件记录在Debian的startx联机帮助页中。

xmodmap联机帮助页在其filename参数的描述下,表示它通常 保存在文件中< em>喜欢 .xmodmaprc。&#34;这似乎可能取决于分发或本地设置系统的方式。

答案 1 :(得分:1)

可能更适合设置:

good_value="true"
if [[ ! "${CAPS_MAPPED}" = "$good_value" ]]; then     # check if CAPS_LOCKED does not have the required value
    echo 'mapping'
    xmodmap ~/dotfiles/.xmodmap                   # call xmodmap
    export readonly CAPS_MAPPED="$good_value"       # assign global var
fi

请注意,我使用 How to compare strings in Bash script,即[ "$var" == "$another_var" ] [[ "$var1" = "$var2" ]]来比较zsh中的字符串,因为==是不是POSIX。请参阅zsh - 12 Conditional Expressions