Existe uma maneira de rotear todos os comandos através de um script de shell em vez de rodar diretamente?

2

Eu quero ser capaz de ter tudo sendo executado, em vez de executar o programa, executa um script de shell com o executável como o argumento. Seria bom poder fazer isso sem ter que selecionar individualmente todos os executáveis no sistema.

    
por MiseroMCS 04.06.2016 / 20:10

2 respostas

0

Mude o seu caminho, depois replique uma árvore de todos os seus executáveis, onde cada um é apenas outro nome para o seu script. Algo como:

$ mkdir ${HOME}/shell
$ OLDPATH=$PATH
$ PATH=${HOME}/shell:$PATH
$ echo $PATH | tr : \n \
  | while read P; do (mkdir -p $(echo $P | sed s':/::'); ls $P/* ) \
  | while read F; do ln master_script $(echo $F | sed s':/::'); done \
    done

Agora, escreva master_script . Remova $ {HOME} / shell do PATH, use command -v para localizar seu nome no caminho real e exec com $ @ como argumentos.

    
por 06.06.2016 / 01:44
0

Eu não sei de qualquer maneira de arquivar que o comando é completamente enviar para um script, mas no bash ou no zsh você pode adicionar um gancho usign a armadilha DEBUG que é chamada antes de cada comando.

Para mais detalhes, consulte link

Editar: Para parar um comando, você pode fazê-lo falhar alterando a variável PATH. Por exemplo:

preexec() {
  if [ "$1" = "ls" ] ; then echo STOP; SAVEDPATH="$PATH"; export PATH=/DoesNotExist; 
  fi 
}

preexec_invoke_exec () {
  if [ "$SAVEDPATH" != "" ] ; then export PATH="$SAVEDPATH" ; unset SAVEDPATH ; fi;
  [ -n "$COMP_LINE" ] && return  # do nothing if completing
  [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
  local this_command='HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"';
  preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Você verá que um comando como date funciona normalmente, mas ls falha com 'comando não encontrado'. Mas desta forma não funciona para shell embutido como echo .

    
por 04.06.2016 / 20:36