Попробуйте выполнить экспорт
в объеме вызова Eval
:
eval export ENV_${env}=some_param
Это гарантирует, что оболочка расширяется env _ $ {Env}
, соответствующим образом к одному из ваших ожидаемых имен, прежде чем пытаться присвоить.
Вам также необходимо использовать EVAL
При попытке получить значение, хранящееся в вашей переменной:
eval echo \$ENV_$env
Обратите внимание на обратную косание - это предотвращает попытки оболочки расширить несуществующую переменную $ Env_
, до тех пор, пока он не расширил $ env
часть со встроенным EVAL
. Это результат этого расширения, которая в конечном итоге передается в echo
, что получает полное имя вашей динамической переменной и расширяет его, чтобы привести к тому, что вы хранятся в нем значением.
То, что я делал до сих пор, это реализация привязки клавиш к окну в Sawfish - более или менее. Я определяю хуки, которые вызывают xmodmap
при смене фокуса. Это чревато гоночными условиями, но на практике это не было проблемой. Я переключаю keyym для keycode 133 при входе и выходе из окон класса VirtualBox
(это относится как к менеджеру, так и к виртуальным машинам, но это не имеет значения для того, что я делаю).
(define (add-window-class-matcher class-regexp . assignments)
"Declare properties for windows whose class matches CLASS-REGEXP.
The string matched against is the X class followed by a slash
followed by the X instance, e.g., \"XTerm/xterm\"."
(apply add-window-matcher 'WM_CLASS class-regexp assignments))
(define (per-window-keymap-hook window index)
(let ((xmodmap-expressions-property (window-get window 'xmodmap-expressions)))
(if (symbolp xmodmap-expressions-property)
(setq xmodmap-expressions-property
(symbol-value xmodmap-expressions-property)))
(when xmodmap-expressions-property
(let ((expressions (nth index xmodmap-expressions-property))
(args ()))
(when expressions
(while expressions
(setq args (cons (car expressions) (cons "-e" args))
expressions (cdr expressions)))
(apply call-process nil nil "xmodmap" (nreverse args)))))))
(define (per-window-keymap-in-hook window focus-mode)
(per-window-keymap-hook window 0))
(define (per-window-keymap-out-hook window focus-mode)
(per-window-keymap-hook window 1))
(add-hook 'focus-in-hook per-window-keymap-in-hook)
(add-hook 'focus-out-hook per-window-keymap-out-hook)
(define virtualbox-xmodmap-expressions
'(("keycode 133 = Super_L")
("keycode 133 = Hyper_L")))
(add-window-class-matcher "^VirtualBox/"
`(xmodmap-expressions . virtualbox-xmodmap-expressions))
Однажды я, возможно, переключу свою конфигурацию клавиатуры на XKB и запущу kbdd.
Вы можете попробовать написать сценарий bash, который можно использовать для загрузки виртуального бокса, и сделать так, чтобы при запуске сценария он возвращал LWIN к значениям по умолчанию, чтобы не возникало проблем с передачей кода клавиатуры. Затем вы можете использовать xmodmap на самой виртуальной машине, если вам это нужно.
Если мое решение не сработает, я бы порекомендовал вам взглянуть на следующие две темы. У парня там была похожая проблема, и я думаю, ты сможешь ею воспользоваться. Думаю, это может быть лучшее решение по сравнению с моим. Удачи!
VirtualBox передает коды клавиш виртуальной машине, а не интерпретируемое значение этих клавиш. Сопоставление кода клавиш находится на более высоком уровне, сообщая вашему хост-серверу X, что интерпретировать каждый код клавиш как значение.
Тем не менее, Virtualbox использует (или использовал?) Различные эвристики, чтобы попытаться идентифицировать клавиатуру, которую вы используете, и выполняет какое-то сопоставление. Основываясь на поданных билетах, я бы сказал, что это запутанный процесс, и в нем обычно участвуют люди, работающие с виртуальными боксами, которым необходимо точно знать, на что похожа задействованная клавиатура.
Это может направить вас в правильном направлении: https://forums.virtualbox.org/viewtopic.php?f=7&t=57120 . Похоже, у кого-то была похожая проблема, и он смог ее решить. Похоже, что они выполняли сопоставление xmodmap внутри гостя, что было бы иначе с окнами, но похоже, что они смогли заставить работать ранее неактивные ключи, поэтому он предлагает то, что вы хотите, возможно, и говорит что-то о вашем метод тестирования в linux vm.