Всегда досаждало держать скрипты в root(!) директории /usr/local/bin/. Мало того, что они действуют для всех пользователей, так и выгружать их туда и изменять надо под рутом, а любое действие под ним не самым лучшим образом сказывается на безопасности системы. Да и неудобно это.
Поэтому меня заинтерисовало как Luke Smith через
se
смотрел свои скрипты в каталоге .scripts. После этого я полез в его .bashrc и увидел там как он изменил переменную PATH, а позже посмотрел видел про fzf, где он всё доходчиво объяснил как достиг своего результата.
В его репозитории я не увидел se(), что разогрело интерес самому реализовать нечто похожее на менеджмент пользовательских скриптов, пока макет выглядит так:
Хочется описать посредством чего я бы хотел достичь поставленной цели:
- Количество аргументов
"$#" - Проверка значения аргумента
case "$number" in - Чтение с консоли посредством
read VAR - Проверка на исполняемость в данный момент
if [ "$(type "$VAR" 2> /dev/null)" ]; then... - Создание файла
touch "$VAR" - Внесение строки
echo "#!/bin/bash# Можно вместо последних двух пунктов сделать шаблоныcp base-bash "$VAR"илиcp base-perl "$VAR" - Возможность запуска
chmod +x "$VAR" - Запуск в редакторе
"$EDITOR" "$VAR" - Чтение выхлопа fzf
VAR="$(fzf)" - Открытие скрипта через fzf
fzf | xargs -r "$EDITOR" - Вывод первых 10 строк
head -n 10 "$VAR" - Удаление
rm "$VAR" - Просмотр скриптов
ls "$SCRIPT" | less - Проверка существования директории
if ! [ -d /path/directory/ ]; then... - Создание директории
mkdir -p "$VAR" - Добавление новой переменной
echo "export SCRIPT="$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')" >> ~/.zshrc - Изменение существующей
echo "export PATH="$PATH:$SCRIPT" >> ~/.zshrc
Если выполню все выше написанное собираюсь встроить во всё это дело git, что бы каждое исправление и поправка фиксировались локальным коммитом. Может быть заменю fzf на dmenu, а может как-то скрещу их. Если я изобретаю велосипед (что скорее всего так) предложите пожалуйста приложение с похожим функционалом. Отказываться от своей идеи я не буду, а постараюсь научиться на чужой реализации. Или можете указать на (концептуальные) ошибки / предложить функционал.


