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.sh
und 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:
- Entfernen Sie die
.sh
Erweiterung aus dem Dateinamen. (Technisch optional, aberdas ist die Konvention.) - Stellen Sie sicher, dass sich das übergeordnete Verzeichnis der Datei in Ihrem befindet
$fpath
. autoload
Ihre 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 $fpath
und autoload
separaten 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