Preferência padrão do executável sobre built-ins com o mesmo nome

6

Eu estava brincando um pouco com os nomes de alguns executáveis, colocando-os em uma pasta, ~/bin , que está no meu $PATH . Agora eu estou querendo saber como eu posso definir as preferências de um terminal bash-3.2 para que ele pegue esses executáveis em vez dos builtins ou aliases para executar.

Por exemplo, se eu colocar um script chamado cd em um diretório em $PATH , o arquivo interno para cd ainda será executado. No entanto, se eu criar um alias para cd , esse alias será executado, substituindo o incorporado.

$ type cd
cd is a shell builtin

Minhas perguntas

  1. Existe uma maneira de fazer com que um arquivo executável em $PATH tenha, por padrão, preferência sobre um shell embutido, executando apenas, por exemplo, cd sem precisar usar os comandos builtin ou command ?

  2. Também estou interessado em qualquer referência oficial que discuta essa preferência (não o raciocínio, que eu entendo).

Observação: Essa pergunta é puramente para fins educacionais pessoais. Estou me perguntando por que funciona da maneira como funciona.

    
por Bernhard 14.02.2014 / 13:40

2 respostas

3

My question is, is there a way to make an executable file in $PATH have preference over an shell builtin, by executing only, e.g. cd without builtin or command?

Você pode usar o enable incorporado para desabilitar / habilitar um arquivo incorporado. Diga:

enable -n cd

para desativar o cd incorporado. Diga enable cd para ativar o builtin.

O seguinte daria um exemplo de alternar entre o builtin e o comando:

$ type cd
cd is a shell builtin
$ enable -n cd
$ type cd
-bash: type: cd: not found
$ enable cd
$ type kill
kill is a shell builtin
$ enable -n kill
$ type kill
kill is /bin/kill
$ enable kill
$ type kill
kill is a shell builtin
    
por 14.02.2014 / 14:22
2

Desativar "comandos" um por vez

Você pode usar os comandos command e builtin para chamar um ou outro.

$ command cd

Desconsiderará qualquer built-in por esse nome e pesquisará o $PATH . O comando oposto a este que usará somente um builtin é builtin .

$ builtin cd

Desativar builtins

$ help enable
enable: enable [-a] [-dnps] [-f filename] [name ...]
    Enable and disable shell builtins.

    Enables and disables builtin shell commands.  Disabling allows you to
    execute a disk command which has the same name as a shell builtin
    without using a full pathname.

    Options:
      -a    print a list of builtins showing whether or not each is enabled
      -n    disable each NAME or display a list of disabled builtins
      -p    print the list of builtins in a reusable format
      -s    print only the names of Posix 'special' builtins

    Options controlling dynamic loading:
      -f    Load builtin NAME from shared object FILENAME
      -d    Remove a builtin loaded with -f

    Without options, each NAME is enabled.

    To use the 'test' found in $PATH instead of the shell builtin
    version, type 'enable -n test'.

    Exit Status:
    Returns success unless NAME is not a shell builtin or an error occurs.

Exemplo

$ type cd
cd is a shell builtin
$ enable -n cd
$ type cd
cd is /usr/bin/cd

$ enable cd
$ type cd
cd is a shell builtin
    
por 14.02.2014 / 14:02