O “sh” precisa estar no diretório “/ bin”?

15

Eu li que sistemas operacionais compatíveis com POSIX (por exemplo: Linux) devem ter o sh shell.

Mas é necessário que sh esteja no diretório /bin ou pode estar em algum diretório?

    
por user270294 13.01.2018 / 03:09

3 respostas

21

POSIX apenas exige que os diretórios /dev e /tmp existam , e os arquivos /dev/null , /dev/tty e /dev/console . Os utilitários padrão devem existir, mas não há nenhum local específico especificado. Pode não haver /bin , e se houver, pode não conter sh e, se isso acontecer, pode não ser um POSIX sh .

Você pode obter uma variável PATH válida que inclua as ferramentas POSIX, incluindo sh , com o getconf comando :

$ PATH=$(getconf PATH)
$ sh

Isso pode ser útil, por exemplo, no Solaris, onde padrão sh não é compatível com POSIX , mas um sh compatível é fornecido e acessível dessa forma (porque O Solaris é um Unix certificado . getconf PATH incluirá /usr/xpg4/bin na frente, que contém POSIX sh e várias outras ferramentas necessárias ( incluindo os inúteis como cd ).

    
por 13.01.2018 / 03:25
11

Não, não é necessário que sh esteja em /bin . Ele menciona explicitamente /bin , /usr/bin e /usr/xpg4/bin como locais possíveis. A especificação POSIX requer apenas que sh esteja no PATH.

A especificação POSIX afirma:

Applications should note that the standard PATH to the shell cannot be assumed to be either /bin/sh or /usr/bin/sh, and should be determined by interrogation of the PATH returned by getconf PATH, ensuring that the returned pathname is an absolute pathname and not a shell built-in.

For example, to determine the location of the standard sh utility:

command -v sh

On some implementations this might return:

/usr/xpg4/bin/sh

    
por 13.01.2018 / 03:24
2

Como outros aqui disseram, isso não é estritamente necessário para a conformidade POSIX.

Mas, sem dúvida, a compatibilidade com software existente é muito mais importante (afinal, o objetivo do POSIX é que certas coisas funcionem em todos os sistemas operacionais em conformidade) e se um SO não fornecer sh% em /bin/sh , isso quebrará alguns coisas.

Mais obviamente, os scripts com #!/bin/sh dependem do caminho padronizado. Isso não é necessário para o trabalho; POSIX não requer sequer que #! linhas sejam suportadas, apesar de mencionar que tal funcionalidade é comum :

Another way that some historical implementations handle shell scripts is by recognizing the first two bytes of the file as the character string "#!" and using the remainder of the first line of the file as the name of the command interpreter to execute.

Mas se isso não for suportado, muitos softwares existentes quebrarão ou exigirão trabalho adicional para a porta.

    
por 13.01.2018 / 23:33