Como obter o comando original do sistema após sobrescrevê-lo com uma função?

3

Eu estou em um Hackathon agora, então se alguém responder isso em breve, você estará me fazendo um enorme favor.

Eu escrevi uma função chamada ls () no meu .bashrc que se parece com isso:

ls() {

  if(some condition);
    do something
  else
    ls; #(CALL TO ORIGINAL ls SYSTEM CALL)
  fi

}

Mas aqui quando vai para a parte else, ele simplesmente entra em um loop infinito

Como posso chamar a chamada original do sistema ls? Ou, como posso fazer com que o comportamento do lse seja diferente em uma pasta e normalmente nas outras.

    
por Programming Noob 16.06.2013 / 20:01

2 respostas

7

Você está procurando por command :

  

comando [-pVv] comando [arg ...]

     

Execute o comando com args suprimindo a pesquisa normal da função shell. Apenas comandos incorporados ou comandos encontrados no PATH   são executados. Se a opção -p é dada, o                     A busca pelo comando é executada usando um valor padrão para o PATH que garante a localização de todos os valores padrão.   Serviços de utilidade pública. Se a opção -V ou -v for fornecida, um                     descrição do comando é impressa. A opção -v faz com que uma única palavra indique o comando ou o nome do arquivo usado para   invocar comando para ser exibido; a opção -V pro‐                     duces uma descrição mais detalhada. Se a opção -V ou -v for fornecida, o status de saída será 0 se o comando for encontrado e 1   se não. Se nenhuma das opções for fornecida e um                     erro ocorreu ou o comando não pode ser encontrado, o status de saída é 127. Caso contrário, o status de saída do comando builtin é   o status de saída do comando.

Exemplo:

$ pwd() {
> echo 'command test'
> command pwd
> }
$ pwd
command test
/etc

Há também builtin , que é mais restritivo:

  

construído em shell [argumentos]

     

Executa o shell especificado, passando os argumentos e retornando seu status de saída. Isso é útil ao definir um   função cujo nome é o mesmo que um shell                 builtin, mantendo a funcionalidade do builtin dentro da função. O cd embutido é comumente redefinido dessa maneira.   O status de retorno é falso se o shell-builtin                 não é um comando interno do shell.

    
por Nykakin 16.06.2013 / 20:31
1

Você também pode estar interessado em which , que fornece o caminho para o programa em $PATH com esse nome.

$ which ping
/bin/ping

(Embora eu recomende a resposta de Nykakin, pois resolve o seu problema. Esta é apenas mais uma ferramenta para qualquer pessoa interessada)

    
por jackweirdy 16.06.2013 / 20:48