Вызывать «универсальную оболочку» скорее всего возможно, если под ней понимать
sh, как определено согласно POSIX. При этом приведенное выше решение придется немного изменить, так как
read в POSIX работает не так, как в
bash. Но зато получим решение, которое работает в любой POSIX о.с., а не только в Linux.
Конкретнее, пусть переменная оболочки
term имеет значением имя терминального эмулятора (как этого добиться, скажу чуть позже). Пусть также переменная
pgm хранит имя программы, которую нужно выполнить в терминале. Тогда это выполнение можно сделать вызовом:
Code: Select all
$term -e sh -c "./$pgm; echo 'Press <Enter> to continue ... '; read -r x"
Здесь
read уже не функция, а команда, и читает всю строку до конца, так что для закрытия терминала нужно нажать именно Enter, а не, как прежде, «any key». (И подсказка выдается не самим
read, а отдельной командой
echo.)
Более досадна проблема с тем, какой терминальный эмулятор вызывать. Ни в POSIX, ни в Linux понятие стандартного или подразумевающегося терминального эмулятора не определяется. Оно есть в системах, производных от Debian (имя
x-terminal-emulator), что неплохо, но недостаточно универсально как решение для всех линуксов. Более универсальный, фактически очень близкий к полной универсальности метод – выполнить, опять-таки в
sh:
Code: Select all
for term in $TERMINAL x-terminal-emulator gnome-terminal xterm mate-terminal rxvt urxvt xfce4-terminal terminator termite terminology qterminal konsole guake; do
if command -v $term > /dev/null 2>&1; then break; fi
done
(Данный скрипт выберет первый имеющийся терминал из списка и присвоит его
term. Этот метод я позаимствовал
отсюда.)
Итак, для определения значения
term пользуемся этим скриптом, а потом выполняем то, что дал выше (дав
{FileNameNoExt} в качестве значения
pgm).
Отмечу, что пользуемся
sh дважды, на разных уровнях. Верхний уровень – выполнение двух указанных фрагментов, а нижний – тот
sh, который вызывается терминальным эмулятором, чтобы в свою очередь вызвал пользовательскую программу. Нижнему
sh терминал нужен, а верхнему – нет.
Остается отметить, что гораздо удобнее, если данное решение встроено в редактор (или в plug-in к нему), чем заставлять пользователя самому изобретать или даже копировать его. В конце концов, пользователю должно быть достаточно сказать: «выполнить эту программу» (понятно какую – ту, что в редакторе, и также понятно, что текущей директорией должна быть та, где сама программа лежит), возможно, задав лишь какие-нибудь аргументы вызова или перенаправливания ввода/вывода, а не заставлять его проходить через вышеописанные детали. Пользователю выполнять программы нужно, а подробности о том, как заставить Linux делать это, не его дело. То же относится и к Windows, только там этих подробностей не так много.