![Oferecer automaticamente a permissão de execução em scripts de shell](https://rvso.com/image/178478/Oferecer%20automaticamente%20a%20permiss%C3%A3o%20de%20execu%C3%A7%C3%A3o%20em%20scripts%20de%20shell.png)
Eu uso muito scripts de shell. Praticamente todas as vezes, eu crio o script e tento executá-lo, mas recebo o erro de permissão porque esqueci de configurar o +x
. Isso parece um grande incômodo, existe uma maneira de fazer meu shell ( zsh
) perguntar automaticamente se eu gostaria de adicionar a permissão de execução e tentar novamente, em vez de apenas me dar o erro?
Eu sei que posso source my.sh
, mas sourcing não é o mesmo que trabalhar com ./my.sh
e eu gostaria do último.
Responder1
Em vez de criar scripts, considere criarfunções(e convertendo scripts existentes em funções). Dessa forma, você nunca mais terá que se preocupar com permissões.
Os scripts são facilmente convertidos em funções:
- Remova a
.sh
extensão do nome do arquivo. (Tecnicamente opcional, masessa é a convenção.) - Certifique-se de que o diretório pai do arquivo esteja em seu arquivo
$fpath
. autoload
sua função no seu.zshrc
.
Se você precisar de funções diferentes para projetos diferentes, considere usarhttps://github.com/direnv/direnv. Dessa forma, cada projeto pode ter funções próprias $fpath
e ed.autoload
Responder2
Isso pode ajudar:
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