Мне нужно написать сценарий оболочки POSIX, который изменит конфигурацию системы. Прежде чем сделать это, я хочу убедиться, что есть резервные копии любого файла, который я редактирую. Для этого сценария необходимо, чтобы он использовал dmenu
для запроса пользователя, если он установлен, и read
, если нет. Я хочу одну функцию (названную communicate
ниже), которая будет автоматически обрабатывать это для меня на основе переменной, которая устанавливается при запуске, $ dmenu .
У меня возникают проблемы с записью в переменная внутри переменной, как показано ниже:
#!/usr/bin/env sh
[ $(command -v dmenu 2>/dev/null) ] && dmenu='true'
communicate(){
description="$1"; options="$2"; outcome="$3"
if [ $dmenu ]; then
echo "$(printf "$options" | dmenu -i -p "$description")" >&0 | read $outcome
else
printf "$description $options "; read $outcome
fi
}
backup(){
[ $1 ] && file="$1" || communicate 'Enter file: ' '' 'file'
[ ! -f $file ] && backup "$1"
cp "$file" "$file.bak"
}
select_interface(){
[ $1 ] && interface="$1" || communicate 'Select interface:' "$interfaces" 'interface'
}
backup
хочет сохранить пользовательский ввод в переменную с именем $ file , тогда как позже select_interface
хочет сохранить в переменная с именем $ interface . если dmenu
не установлен, запись в $ result работает нормально с оператором else, тогда как если он установлен, я не могу заставить команду read
срабатывать при передаче результата dmenu
через перенаправление STDIN в чтение, которое работает вне сценария.
Может кто-то увидеть, что я делаю неправильно или как я мог бы сделать это лучше? Мне нужно, чтобы все было в одной функции общаться , выступая в качестве агента связи с пользователем.