Автоматически предлагать установить разрешение на выполнение для сценариев оболочки

Автоматически предлагать установить разрешение на выполнение для сценариев оболочки

Я часто использую скрипты оболочки. Практически каждый раз, когда я создаю скрипт и пытаюсь его запустить, я получаю ошибку разрешения, потому что я забыл установить +x. Это кажется огромной проблемой, есть ли способ заставить мою оболочку ( zsh) автоматически спрашивать, хочу ли я добавить разрешение на выполнение и повторить попытку, вместо того, чтобы просто выдавать мне ошибку?

Я знаю, что могу просто source my.sh, но поиск поставщиков и работа с ними — это не одно и то же, ./my.shа мне бы хотелось последнее.

решение1

Вместо создания сценариев рассмотрите возможность созданияфункции(и преобразование существующих скриптов в функции). Таким образом, вам больше никогда не придется беспокоиться о разрешениях.

Скрипты легко преобразуются в функции:

  1. Удалите .shрасширение из имени файла. (Технически необязательно, ноэто соглашение.)
  2. Убедитесь, что родительский каталог файла находится в вашем $fpath.
  3. 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

Связанный контент