Всегда досаждало держать скрипты в 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, а может как-то скрещу их. Если я изобретаю велосипед (что скорее всего так) предложите пожалуйста приложение с похожим функционалом. Отказываться от своей идеи я не буду, а постараюсь научиться на чужой реализации. Или можете указать на (концептуальные) ошибки / предложить функционал.