2015-11-03 66 views
0

我正在嘗試使用xmodmap來交換大小寫和轉義。我把xmodmap ~/.Xmodmap命令放在我的.zshrc中。但是每當我啓動一個新的shell時,xmod設置就會再次交換。所以我試圖將xmodmap命令封裝在一個檢查全局變量的條件中,但我無法讓它工作。在環境變量上使用條件編寫冪等shell腳本

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腳本相當缺乏經驗。

+0

所以這個解決方法至少打印「映射」?意思是,.zshrc進入這個「if」狀態? – fedorqui

+0

當我刪除'!'時,它會打印'映射'。 –

+0

從'man test'中,'-z'選項表示'STRING的長度爲零'。我不確定你在這裏有什麼打算,但可能只有'-z'應該是這樣。否則,你正在檢查的是相反的,這也是'-n' - >'STRING的長度不爲零'。 – fedorqui

回答

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

+0

'+ xxx'表達式是bollocks。我從某處複製它。我在我的問題中刪除了它。但是,現在我得到'/home/jan/.zshrc:103:= not found',它對應於您提供的腳本的第二行。沒有當然的表達,也沒有花括號。儘管我們正在接近。謝謝。 –

+0

@FranzSkuffka啊你真的在'zsh'中。看到我的更新!我不得不將'if'更改爲'[[「$ var1」=「$ var2」]]',即只用一個'='。 – fedorqui

+0

不錯,這清除了錯誤。但是無論我插入哪個變量,條件仍然適用。當我刪除'!'時,無論使用哪個變量,它都是錯誤的。 –

2

最好的方法是將xmodmap調用放入X init腳本而不是shell初始化腳本。

您的每個用戶的X init腳本是~/.xinitrc

創建~/.xinitrc如果它不存在並將您的xmodmap命令添加到最後。

~/.xinitrc文件記錄在Debian的startx聯機幫助頁中。

xmodmap手冊頁,根據它的說明是filename參數,說這是「通常保存在一個文件 .xmodmaprc中。」這看起來可能取決於系統如何由分佈設置或本地設置。

+0

事實上 - 在這種情況下無需費心嘗試阻止重新運行。 –

+0

是不是'.xmodmaprc'重命名爲'.Xmodmap'?我的'.Xmodmap'沒有自動執行。如果我使用這個文件名,我會嘗試它的工作方式。 –