LINUX.ORG.RU

Переопределение alias'oв в меню

 ,


0

1

Пытаюсь сделать меню и не совсем понимаю как использовать правильно алиасы. Должен оставаться доступ к вводу! 1 2 должны отражать следующие уровни меню и менять значение алиасов 1 и 2 на другие значения. В голову приходит такой костыль:

echo "
1 first
2 second
3 main menu"
alias 1="echo \"
1 child_first
2 child_second
3 main menu\"
alias 1=\"/bin/child_first\"
alias 2=\"/bin/child_second\"
alias 3=\"???\""

Не очень понятно, что ты делаешь и почему нельзя без алиасов. Посмотри примеры на этой страничке: https://devsrealm.com/bash/creating-multiple-menus-in-bash-scripts/

Алиас — это всего лишь способ задать удобное имя какой-то часто используемой команде. В скриптах навряд ли это вообще нужно. Обычно достаточно простых переменных и массивов.

anonymous
()
Ответ на: комментарий от anonymous

Алиасы позволяют избежать использование внешних скриптов. По ссылке примеры с циклом и это было для меня очевидным, но цикл не оставляет доступ к вводу. Программа внутри сессии должна обрабатывать ввод 1 2 3 4.. при этом доступ к вводу должен быть свободен. После каджого ввода должен выводится список доступных вариантов использования. Можно было бы назначить алиасу уникальное слово на выполнение его значения, но опыт мне дал понять что запоминать имена алиасов не намного легче чем целые команды, поэтому вывод списка доступных команд с привязкой к цифре гораздо проще для восприятия и поиска нужного инструмента. Команды заключены в категории что бы не раздувать количество цифр больше ~9 штук в категории.

vachicul
() автор топика
Ответ на: комментарий от vachicul

Идея интересная. Такой своего рода консольный mind map получается :) А нельзя ли использовать функции вместо алиасов?

цикл не оставляет доступ к вводу

Почему же? Вполне себе оставляет. Ввод же блокирующая операция и цикл будет приостановлен до тех пор пока ты не сделаешь выбор.

Я бы тебе всё-таки посоветовал взять какой-то более человечный язык вместо баша, где ты сможешь описать структуру того, что тебе хочется и потом всячески ей гибко оперировать, дополнять и изменять.

anonymous
()
Ответ на: комментарий от anonymous

Почему же? Вполне себе оставляет. Ввод же блокирующая операция и цикл будет приостановлен до тех пор пока ты не сделаешь выбор.

Верно, оставляет только ввод для read, а мне нужен доступ к оболочке что бы выполнять другую работу. Алиас в этой ситуации будет хранить информацию о том, что делать при следующем нажатии 1 2 3..

Я бы тебе всё-таки посоветовал взять какой-то более человечный язык вместо баша, где ты сможешь описать структуру того, что тебе хочется и потом всячески ей гибко оперировать, дополнять и изменять.

Невариант учить с нуля какой-то язык. К тому же баш более универсален, особенно когда речь идёт о взаимодействии с другими компонентами системы и пользовательстким софтом.

vachicul
() автор топика
Ответ на: комментарий от vachicul

доступ к оболочке что бы выполнять другую работу

Ой, слушай, тогда я наверное не знаю как такое сделать и возможно ли вообще. И всё же не до конца понимаю, если честно. Как ты хочешь вызывать свой скрипт? Это будет дочерний процесс? Тогда навряд ли ты сможешь из него получить алиасы и переменные. И как ты хочешь переключать контекст? Как компьютер поймёт, что ты сейчас вводишь: цифру для команды в оболочке или цифру для выбора алиаса? Мне пока не очень понятно как это сделать. Тут наверное нужно к какому-то более низкому уровню обращаться, типа самого терминала с его escape-последовательностями. С этим отлично справляется библиотека ncurses, но интерфейса под баш у неё к сожалению нет.

Насчёт универсальности баша, наверное, можно поспорить. Но я не буду :)

anonymous
()
Ответ на: комментарий от anonymous

Да скрипт можно вызвать как угодно. Суть такова что алиасы переопределяются когда вводишь ту или иную цифру. Если ввёл 1, то страктура меню уже должна быть другая, соответственно следующее нажатие 1 откроет уже пункт из подкатегории и назначит алиас уже для этой подкатегории и так далее вплоть до целевого скрипта который назначен в алиасе. Главное меню - 0, предыдущее меню - 9. Как ни странно но логично. Почему невозможно сделать? Запуск скрипта через алиас будет полностью переписывать назначение алиасов, только у меня перед глазами слишком грамоздкая и неуклюжая конструкция получается таким способом. Я бы хотел что-то более компактное и практичное.

Насчёт универсальности баша, наверное, можно поспорить. Но я не буду :)

Мне не с чем сравнить. Но знаю что нет ничего более высокоуровневого чем баш. Я пишу программы не зная английского языка и они работают. Похожий функционал на python замёт больше кода и соврешенно непонятный для меня синтаксис.

vachicul
() автор топика
Ответ на: комментарий от vachicul

Запуск скрипта через алиас будет полностью переписывать назначение алиасов

Если только выполнять скрипт через source, наверное. Но возможно, что я всё ещё не понял. Типа такого что-то?:

$ alias 1='alias 1=ls'

$ alias 1
1='alias 1=ls'

$ 1

$ alias 1
1=ls

Я бы хотел что-то более компактное и практичное.

Ну я бы для описания структуры меню взял какой-нибудь JSON и попробовал бы по ней гулять каким-то рекурсивным алгоритмом или лучше алгоритмом, использующим стек для хранения текущего положения пользователя в меню.

пишу программы не зная английского языка и они работают

Я бы не стал этим гордиться. Язык айтишнику необходим как воздух.

и соврешенно непонятный для меня синтаксис

Периодически пописываю на баше уже несколько лет и до сих пор его синтаксис для меня — как что-то инопланетное. Синтаксис того же питона я освоил за несколько часов. И это чистейшая правда. Но, конечно, у меня был уже хороший бекграунд в программировании на других языках.

anonymous
()
Ответ на: комментарий от anonymous

Через sources file можно, но это порождает нужду создавать и хранить файлы. Моя программа против создания лишнего мусора

vachicul
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.