![Автоматически предлагать установить разрешение на выполнение для сценариев оболочки](https://rvso.com/image/178478/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%B0%D0%B3%D0%B0%D1%82%D1%8C%20%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%BB%D1%8F%20%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8.png)
Я часто использую скрипты оболочки. Практически каждый раз, когда я создаю скрипт и пытаюсь его запустить, я получаю ошибку разрешения, потому что я забыл установить +x
. Это кажется огромной проблемой, есть ли способ заставить мою оболочку ( zsh
) автоматически спрашивать, хочу ли я добавить разрешение на выполнение и повторить попытку, вместо того, чтобы просто выдавать мне ошибку?
Я знаю, что могу просто source my.sh
, но поиск поставщиков и работа с ними — это не одно и то же, ./my.sh
а мне бы хотелось последнее.
решение1
Вместо создания сценариев рассмотрите возможность созданияфункции(и преобразование существующих скриптов в функции). Таким образом, вам больше никогда не придется беспокоиться о разрешениях.
Скрипты легко преобразуются в функции:
- Удалите
.sh
расширение из имени файла. (Технически необязательно, ноэто соглашение.) - Убедитесь, что родительский каталог файла находится в вашем
$fpath
. autoload
ваша функция в вашем.zshrc
.
Если вам нужны разные функции для разных проектов, рассмотрите возможность использованияhttps://github.com/direnv/direnv. Таким образом, каждый проект может иметь свои собственные $fpath
и autoload
редактируемые функции.
решение2
Это может помочь:
function command_permission() {
# Get the command being run
local cmd="${1}"
local cmd=$(echo "${cmd}" | awk '{print $1}' )
# Check if it starts with "./" and if the file doesn't have execute permission
if [[ "${cmd}" =~ ^\./ && ! -x "${cmd#./}" ]]; then
# Prompt for permission to chmod +x the file
read -rq "REPLY?${cmd#./} is not executable. Do you want to make it executable (y/n)? "
"$cmd" "$@"
if [[ "${REPLY}" =~ ^[Yy]$ ]]; then
# Make the file executable
chmod +x "${cmd#./}"
fi
# Add a newline after the prompt
echo ""
fi
}
# Set the preexec function to be called before running each command
autoload -Uz add-zsh-hook
add-zsh-hook preexec command_permission