É possível restringir certos comandos de serem executados em um diretório?

4

Eu tenho dois diretórios: src e projects . Gostaria de evitar executar git ... , a menos que eu esteja especificamente dentro de src ou projects . Isso é possível?

    
por sdasdadas 30.05.2013 / 22:13

2 respostas

7

É difícil impedir que o binário seja executado, mas, para as situações típicas, existe um método de proteção fácil:

  1. Você define uma função de shell que sobrescreve o nome. Isso obviamente não funcionará em outro shell (também de outro usuário).
  2. Você tira o binário do $ PATH e o substitui por um script de wrapper. Isso é mais seguro, mas obviamente causará problemas com atualizações de software (o script é sobrescrito).

A função shell pode ter esta aparência:

git () {
  local cwd="$(pwd -P)"
  if ! [ "/path/to/src" = "$cwd" -o "/path/to/projects" = "$cwd" ]; then
    echo "The current working directory is: '${cwd}'"
    echo "git must not be run from here; from src and projects only."
    echo "Aborting."
  else
    command git "$@"
  fi
}
    
por 30.05.2013 / 22:25
3

Um incomum: se estiver usando zsh , você poderá usar o realce de região para sinalizar em negrito vermelho a git palavra, se usada, enquanto $PWD não estiver onde você deseja. Como:

self-insert() {
  zle .$WIDGET
  if [[ $BUFFER = git(| *) && $PWD != */src && $PWD != */projects ]]; then
    region_highlight=("0 3 fg=red,bold,standout")
  else
    region_highlight=()
  fi
}
zle -N self-insert

Dessa forma, ele não fica no seu caminho, mas avisa sobre um possível problema.

Para sinalizar git em qualquer lugar na linha:

self-insert() {
  zle .$WIDGET
  if [[ $BUFFER =~ '\<git\>' && $PWD != */src && $PWD != */projects ]]; then
    region_highlight=("$((MBEGIN-1)) $MEND fg=red,bold,standout")
  else
    region_highlight=()
  fi
}
zle -N self-insert

Exemplo:

    
por 30.05.2013 / 23:28