Oddity no script de shell ksh93 (“command -p mkdir t” falha)

3

Eu tenho um problema ao usar command -p mkdir em um script de shell ksh93 .

O command -p bit deve, de acordo com o POSIX ,

Perform the command search using a default value for PATH that is guaranteed to find all of the standard utilities.

O manual ksh93 tem uma redação semelhante:

The -p option causes a default path to be searched rather than the one defined by the value of PATH. Functions will not be searched for when finding name. In addition, if name refers to a special built-in, none of the special properties associated with the leading daggers will be honored. (For example, the predefined alias redirect='command exec' prevents a script from terminating when an invalid redirection is given.)

Eu reduzi meu script ao seguinte:

#!/usr/local/bin/ksh93 -x
echo "$PATH"
command -p mkdir t

Executando:

$ ./test.sh
+ echo /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
+ command -p mkdir t
./test.sh[3]: mkdir: not found [No such file or directory]

O valor padrão de $PATH para ksh93 (de acordo com o manual) é /bin:/usr/bin: e mkdir é encontrado em /bin :

$ command -v mkdir
/bin/mkdir

Se eu emitir o comando getconf PATH no script (para obter o valor do padrão definido pelo sistema $PATH ), antes de chamar mkdir , a chamada para mkdir é bem-sucedida .

Isso é visto em ksh93 , "Versão AJM 93u + 2012-08-01", pelo menos no Ubuntu, OpenBSD, macOS e Solaris, e também afeta pelo menos cat quando invocado da mesma maneira.

A pergunta: Eu senti falta de algo óbvio aqui?

Informações adicionais:

O comando builtin em ksh93 lista vários utilitários sob o caminho (inexistente) /opt/ast/bin . Isso tem algo a ver com isso?

$ builtin
:
.
[
/opt/ast/bin/basename
/opt/ast/bin/cat
/opt/ast/bin/chmod
/opt/ast/bin/cmp
/opt/ast/bin/cut
/opt/ast/bin/dirname
/opt/ast/bin/getconf
/opt/ast/bin/head
/opt/ast/bin/logname
/opt/ast/bin/mkdir
/opt/ast/bin/sync
/opt/ast/bin/uname
/opt/ast/bin/wc
alarm
alias

(etc.)

UPDATE: também enviei esta consulta para a lista de discussão ast-users .

    
por Kusalananda 01.03.2017 / 00:24

1 resposta

3

Com base no que você mostrou aqui e no ast-user , isso parece um bug, mas isso não é uma resposta para essa pergunta.

Re Builtin

Isso pode ser melhor respondido em uma pergunta separada, mas por enquanto isso deve ser suficiente:

O Ksh93 possui um recurso no qual comandos adicionais podem ser carregados de bibliotecas compartilhadas e, em seguida, vinculados a um diretório existente (ou inexistente) em $PATH

Os comandos com o caminho /opt/ast/bin/ são considerados ligados a /opt/ast/bin . Isso significa que se um $ PATH tiver /opt/bin/ast/bin antes /bin , o ksh93 invocará o cat embutido de preferência sobre /bin/cat .

Se /opt/ast/bin ou /opt/ast/bin/cat existe ou não, isso não afeta este mecanismo.

    
por 01.03.2017 / 21:30