Я прочитал это: Скобки для subshell не работают, когда хранятся в переменной
и это: http://mywiki.wooledge.org/BashFAQ/048
и они были проницательны и поучительны, и я любил их читать.
Я не нашел в этом решения рецидивирующей проблемы, связанной с желанием переработанного кода в оболочке, который eval
, вплоть до того момента, пока я не хотел бросать в оболочку подоболочки, мог (грязно) ответить.
Таким образом, я вынужден согласиться с тем, что eval является злом и имеет технические недостатки помимо недостатков безопасности.
Как вы решаете следующее:
В соответствии с распределением переключателей между различными дистрибутивами Linux у вас есть разные вторые потоки для вашего скрипта, открытого в другом терминале, с совпадающим синтаксисом закрытия.
Тело такое же, но использует переменные, заполненные в первом потоке. И НЕ является единственной командой
Тело само по себе работает подоболочками
Заменяющее решение должно быть не последовательным, а "синхронным", как eval. (он не заставляет завершающие команды ждать своего возврата для выполнения)
Вот что мы получаем:
Наш переключатель if и elif, запускающий наши скрипты для второго терминала или "второго потока":
if [[ "$operating_system" = "Ubuntu" || "$operating_system" = "Debian GNU/Linux" ]]
then
eval "$gnome_opening_faf_script $faf_script $gnome_closing_faf_script"
elif [ "$operating_system" = "Kubuntu" ]
then
eval "$konsole_opening_faf_script $faf_script $konsole_closing_faf_script"
elif [ "$operating_system" = "elementary OS" ]
then
eval "$io_opening_faf_script $middlescript $io_closing_faf_script"
else
eval "$xterm_opening_faf_script $faf_script $xterm_closing_faf_script"
fi
Переменная основного тела второй нити:
faf_script='echo "expecting you to type in Forged Alliances Launch options";
echo "reminder : look in your home folder, theres a file there with the contents to be pasted";
echo "once thats done edit steam settings in order to enable Proton for all games";
steam -login '$steam_user_name' '$steam_password' -applaunch 9420 &
echo "waiting for Forged Alliance to be installed, Game.prefs to exits and Forged Alliance to be shut down";
echo "you may also type \"continue\" to exit this while loop"
echo -n "if you feel the conditions for continuing sucessfully have been met... ";
( i=1;
sp="/-\|";
no_config=true;
while $no_config;
do printf "\b${sp:i++%${#sp}:1}";
[[ ! $(pidof SupremeCommande) && -f $origin/steamapps/compatdata/9420/pfx/drive_c/users/steamuser/Local\ Settings/Application\ Data/Gas\ Powered\ Games/Supreme\ Commander\ Forged\ Alliance/Game.prefs ]] && no_config=false;
sleep 1;
done;
kill $$;
) &;
child_pid=$!;
while $no_config;
do read -r typed_continue;
[[ "$typed_continue" = "continue" ]] && no_config=false;
sleep 1;
done;
kill $child_pid;
echo "";
'
И открытие закрывающих переменных, которые позволяют запускать второй поток скрипта различными терминалами в зависимости от распределения.
gnome_opening_faf_script='gnome-terminal --tab --active --title="install & run steam, steamcmd, FA" -- bash -c '"'"''
konsole_opening_faf_script='konsole -e /bin/bash --rcfile <(echo '"'"''
io_opening_faf_script='io.elementary.terminal -e "bash -c '"'"'curl wttr.in/bydgoszcz'"'"';'"'"'sleep 3'"'"''
xterm_opening_faf_script='xterm -T "install & run steam, steamcmd, FA" -e '"'"''
gnome_closing_faf_script='gnome-terminal -- bash -c "cd faf; ./downlords-faf-client";'"'"''
konsole_closing_faf_script='konsole -e /bin/bash --rcfile <(echo "cd faf; ./downlords-faf-client; exit 0") &'"'"') &'
io_closing_faf_script='io.elementary.terminal -e "cd faf; ./downlords-faf-client";'"'"''
xterm_closing_faf_script='xterm -T "FAF" -e "cd faf; ./downlords-faf-client";'"'"' &'
Обычно, когда люди предлагают замены для оценки, контексты не упрощаются. eval работает один echo "hello world"
.
здесь это не мой случай, и я не смог применить ни одно из решений.