Я только что нашел одно решение:
gconf-editor
, если необходимоgconf-editor
("ConfigurationEditor" в меню)/apps/nm-applet
в левой панелиdisable-vpn-notifications
(или других уведомлений)Предположительно другие уведомления Gnome 3 похожи.
Надеюсь, кто-то знает более удобный способ сделать это.
Чтобы ответить на более общий вопрос о копировании ассоциативных массивов.
Сопровождающие bash
приняли неудачное решение скопировать API ksh93, а не zsh, когда они представили свои собственные ассоциативные массивы в версии 4.0.
ksh93
/ bash
поддерживают установку ассоциативного массива в целом, но это с:
hash=([k1]=v1 [k2]=v2)
синтаксис. В то время как с zsh
это
hash=(k1 v1 k2 v2)
(поддержка синтаксиса ([k]=v...)
ksh93 также была добавлена позже для совместимости ).
Однако это означает, что с ksh93 и bash очень сложно создать хеш таким образом из произвольного списка ключей и значений.
С синтаксисом zsh
,вам просто нужно передать список как чередующиеся ключи и значения. Например, чтобы скопировать два ассоциативных массива:
h2=("${(@kv)h1}")
Или из CSV с двумя столбцами:
IFS=$'\n,'; h=($(<file.csv))
Или из массивов ключей и значений:
h=("${(@)keys:^values}")
С синтаксисом ksh93
/ bash
, хотя есть "${!h[@]}"
и "${h[@]}"
для расширения до списка ключей и значений (, таких как "${(@k)h}"
и "${(@v)h}"
в zsh
), нет оператор для расширения до ключей и значений в синтаксисе [key]=value
, ожидаемомh=(...)
("${(@kv)h}"
вzsh
).
Уловка, которую вы можете использовать в этих оболочках для копирования ассоциативных массивов, хотя (помимо копирования элементов в цикле ), заключается в использовании вывода typeset -p
.
Например, эквивалент zsh
's h2=("${(@kv)h1}")
для копирования h1
в h2
может быть выполнен в ksh93
или bash
с:
h1_definition=$(typeset -p h1) &&
eval "typeset -A h2=${h1_definition#*=}"
Который с bash
вы можете сократить до:
h1_definition=$(typeset -p h1) &&
typeset -A h2="${h1_definition#*=}"
(Хотя, как и в ksh93, typeset -A h=value
является сокращением от typeset -A h=([0]=value)
в bash
, если value
начинается с (
и заканчивается на )
, то содержание интерпретируется как составное ассоциативное присвоение, как если бы передается в eval
(, даже если (
заключены в кавычки или являются результатом некоторого расширения )).
В конце концов, так же просто использовать цикл:
for k in "${!h1[@]}"; do h2[$k]=${h1[$k]}; done
это должно сделать это (также можно добавить дополнительный ключ -значение):
declare -A origDict=( [keya]=value_a [keyb]=value_b [keyc]=value_c )
declare -a newDict=( echo ${origDict[*]} [keynew]=new_value )