Automatisches Anbieten zum Festlegen der Ausführungsberechtigung für Shell-Skripte

Automatisches Anbieten zum Festlegen der Ausführungsberechtigung für Shell-Skripte

Ich verwende häufig Shell-Skripte. Fast jedes Mal, wenn ich das Skript erstelle und versuche, es auszuführen, erhalte ich den Berechtigungsfehler, weil ich vergessen habe, festzulegen +x. Das scheint ein riesiger Aufwand zu sein. Gibt es eine Möglichkeit, meine Shell ( zsh) automatisch fragen zu lassen, ob ich die Ausführungsberechtigung hinzufügen und es erneut versuchen möchte, anstatt mir einfach den Fehler anzuzeigen?

Ich weiß, dass ich einfach kann source my.sh, aber die Beschaffung ist nicht dasselbe wie das Ausführen mit ./my.shund ich hätte gerne Letzteres.

Antwort1

Anstatt Skripte zu erstellen, sollten SieFunktionen(und Konvertieren vorhandener Skripte in Funktionen). Auf diese Weise müssen Sie sich nie wieder um Berechtigungen kümmern.

Skripte lassen sich einfach in Funktionen umwandeln:

  1. Entfernen Sie die .shErweiterung aus dem Dateinamen. (Technisch optional, aberdas ist die Konvention.)
  2. Stellen Sie sicher, dass sich das übergeordnete Verzeichnis der Datei in Ihrem befindet $fpath.
  3. autoloadIhre Funktion in Ihrem .zshrc.

Wenn Sie für verschiedene Projekte unterschiedliche Funktionen benötigen, verwenden Siehttps://github.com/direnv/direnvAuf diese Weise kann jedes Projekt seine eigenen $fpathund autoloadseparaten Funktionen haben.

Antwort2

Das könnte helfen:

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

verwandte Informationen