![Ofrecer automáticamente establecer permisos de ejecución en scripts de shell](https://rvso.com/image/178478/Ofrecer%20autom%C3%A1ticamente%20establecer%20permisos%20de%20ejecuci%C3%B3n%20en%20scripts%20de%20shell.png)
Utilizo mucho los scripts de shell. Prácticamente cada vez, creo el script e intento ejecutarlo, y obtengo el error de permiso porque olvidé configurarlo +x
. Esto parece una gran molestia, ¿hay alguna manera de hacer que mi shell ( zsh
) pregunte automáticamente si deseo agregar el permiso de ejecución e intente nuevamente, en lugar de simplemente darme el error?
Sé que puedo simplemente source my.sh
, pero el abastecimiento no es lo mismo que ejecutar ./my.sh
y me gustaría lo último.
Respuesta1
En lugar de crear guiones, considere crearfunciones(y convertir scripts existentes en funciones). De esa manera, nunca más tendrás que preocuparte por los permisos.
Los scripts se convierten fácilmente en funciones:
- Elimine la
.sh
extensión del nombre del archivo. (Técnicamente opcional, peroesa es la convención.) - Asegúrese de que el directorio principal del archivo esté en su archivo
$fpath
. autoload
su función en su.zshrc
.
Si necesita diferentes funciones para diferentes proyectos, considere usarhttps://github.com/direnv/direnv. De esa manera, cada proyecto puede tener sus propias funciones $fpath
y ediciones.autoload
Respuesta2
Esto podría ayudar:
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