Косвенность на массиве Bash

user опция в fstab

Я думаю, что просто необходимо добавить опцию user к Вашему /etc/fstab запись, если Вы хотите, чтобы пользователи смогли смонтировать запись. Например:

/dev/cdrom  /cd  iso9660  ro,user,noauto,unhide

pmount

Также я думаю, что можно достигнуть того, что Вы хотите использовать приложение pmount.

выборка из страницы справочника

pmount - смонтируйте произвольные заменяемые в горячем режиме устройства как обычного пользователя

Смонтироваться:

$ pmount /dev/sda1 /media/somedir

Ссылки

4
25.07.2014, 23:46
4 ответа
[

] Возможно, это самый уродливый Bash-код, который я когда-либо писал, но...[

] [
IPv4_first=1.1.1.1
IPv4_second=2.2.2.2
IPv4_third=3.3.3.3

names=(${!IPv4_@})
eval "IPv4_all=(${names[@]/#/$})"
printf "'%s'\n" "${IPv4_all[@]}"
] [

]Смотри, Ма, никакого цикла![

] [

][][]${names[@]/#/$}[] предиктует[] []$[] к началу каждого элемента массива, сопоставляя пустую строку, привязанную к началу каждого элемента. Это дает массив разыменований переменных, который мы можем развернуть внутри []eval[], чтобы получить ссылки на переменные внутри инициализатора массива. Это должны быть две отдельные строки, так как нельзя применять несколько расширений параметров одновременно.[

] [

]Вывод:[

] [
'1.1.1.1'
'2.2.2.2'
'3.3.3.3'
] [

], как и ожидалось.[

] [

]Строку можно заменить на:[

] [
IPv4_all=($(eval "echo ${names[@]/#/$}"))
] [

]вместо []eval[]ling для присваивания массива. Не уверен, что это лучше или нет.[

] [

]Если значения переменных могут содержать пробелы или другие символы IFS, вы можете изменить eval:[

] [
eval "IPv4_all=($(printf '"$%s" ' "${names[@]}"))"
] [

]Это правильно удвоит все разыменования переменных.[

].
5
27.01.2020, 20:49

Вам не нужна IPv4_all переменная:

eval printf "\'%s\'\\\n" $(printf "$%s\n" ${!IPv4_@})

Выход:

'1.1.1.1'
'2.2.2.2'
'3.3.3.3'
1
27.01.2020, 20:49

Моя конкурсная заявка на самый уродливый/самый запутанный басовый код ;-):

eval 'declare(){ v=${2%%=*};[[ $v = IPv4_* ]]&&IPv4_all+=("${!v}");};'"$(declare -p)"
unset -f declare
1
27.01.2020, 20:49

Мне кажется, это работает, хотя я соглашусь с тем, что могу упустить какой-то фундаментальный момент:

IPv4_first=1.1.1.1
IPv4_second=2.2.2.2
IPv4_third=3.3.3.3

IPv4_all=( $(set | sed '/IPv4_.*[=)]/!d;s///') )

printf "'%s'\n" "${IPv4_all[@]}"

OUTPUT

'1.1.1.1'
'2.2.2.2'
'3.3.3.3'

Это лучше:

eval IPv4_all=( "$(set |
    grep -E '^IPv4_[_[:alnum:]]*=([^(]|$)' |
    sed 's/\([^=]*\).*/${\1+"$\1"} /')"
)

grep получает только безопасные линии, которые соответствуют вашей целевой var. sed окружает их маркерами расширения параметров, поэтому они ничего не оценивают, если на самом деле они не являются текущими именами переменных оболочки.

1
27.01.2020, 20:49

Теги

Похожие вопросы