Сzsh
:
${(P)varname}
расширяется до значения переменной, имя которой хранится в $varname
. Итак, если $varname
содержит var
, ${(P)varname}
расширяется до того же, что и $var
. ${(e)var}
расширяется до содержимого $var
, но также выполняет расширение параметров, подстановку команд и арифметическое расширение внутри. Итак, если $var
содержит $othervar
, ${(e)var}
расширяется до того же, что и $othervar
. ${(P)${var:-something}}
работали ${:-content}
— это один из способов расширить расширение параметра до произвольного текста (здесьcontent
)(подробнее см. в руководстве )
Так что можно было:
_v1=windows
_v2_windows=/mnt/d
printf '%s\n' ${(P)${:-_v2_$_v1}}
Или:
printf '%s\n' ${(e)${:-\$_v2_$_v1}}
Или сделать это в два этапа:
varname=_v2_$_v1
printf '%s\n' ${(P)varname}
Или:
expansions_to_evaluate=\$_v2_$_v1
printf '%s\n' ${(e)expansions_to_evaluate}
Или вы можете использовать стандартный синтаксис POSIX:
eval 'printf "%s\n" "${_v2_'"$_v1"'}"'
Имейте в виду, что если значение $_v1
не находится под вашим контролем, все это представляет собой уязвимость, связанную с внедрением произвольных команд, вам необходимо сначала очистить значение.
Также обратите внимание, что zsh
поддерживает ассоциативные массивы (и задолго до bash
), так что вы можете сделать:
typeset -A mnt
mnt=(
windows /mnt/d
osx /Volumes/d
)
os=windows
printf '%s\n' $mnt[$os]
Это было бы намного более разборчиво и не имело бы никаких последствий для безопасности.
Сам по себе,sudo -i
запустит оболочку входа целевого пользователя(root
по умолчанию ). История в этой оболочке будет храниться в соответствии с настройками этой оболочки. Если оболочка входа root
— bash, она будет сохранена в $HISTFILE
, что по умолчанию ~/.bash_history
. Так что ищите .bash_history
в домашнем каталоге root
(/root
, обычно ). Или проверьте их настройки по умолчанию для входа в систему и файлы rc, чтобы определить, где (если )хранится история.