[O] comportamento parece consistente entre todos os cartuchos de reclamação POSIX. Não vejo necessidade de espaço de manobra aqui.
Você não está olhando o suficiente.
Na década de 1980, esse mecanismo não era de fato padronizado. Embora Dennis Ritchie a tivesse implementado, essa implementação não havia atingido o público no lado AT&T do universo. Ele era efetivamente disponível apenas publicamente e conhecido no BSD; com scripts de shell executáveis não disponíveis no AT&T Unix. Portanto, não era razoável padronizá-lo. O estado de coisas é exemplificado por este doco contemporâneo, um de muitos:
Observe que o BSD permite que arquivos que começam com #! interpreter
sejam executados diretamente, enquanto o SysV permite que apenas arquivos a.out sejam executados diretamente. Isso significa que uma instância de uma das exec…()
rotinas em um programa BSD pode ter que ser alterada no SysV para executar o intérprete (tipicamente /bin/sh
) para esse programa.
- Stephen Frede (1988). "Programando no System X Release Y". Boletim informativo do grupo de usuários do Australian Unix Systems . Volume 9. Número 4. p. 111
Um ponto importante aqui é que você está observando shells, enquanto a existência de scripts de shell executáveis é realmente uma questão de exec…()
função. O que os shells fazem inclui os precursores do mecanismo de script executável, ainda hoje encontrado em alguns shells (e também hoje em dia é obrigatório para o exec…p()
subconjunto de funções), e é um tanto enganador. O que o padrão precisa abordar a esse respeito é como, exec…()
em um script interpretado, funciona e, no momento em que o POSIX foi criado, ele simplesmente não funcionava em primeiro lugar em grande parte do espectro dos sistemas operacionais de destino .
Uma pergunta subordinado é por que isso não foi padronizado, já que, sobretudo porque o mecanismo número mágico para intérpretes de script tinha alcançado o público no lado AT & T do universo e foi documentado para exec…()
na Definição do Sistema 5 de interface , na virada da década de 1990 :
Um arquivo de intérprete começa com uma linha do formulário#! nome do caminho [arg]
em que caminho é o caminho do intérprete e arg é um argumento opcional. Quando você exec
cria um arquivo de intérprete, o sistema exec
é o intérprete especificado.
- exec
. System V Interface Definition . Volume 1. 1991.
Infelizmente, o comportamento permanece hoje quase tão divergente quanto na década de 1980 e não existe um comportamento verdadeiramente comum para padronizar. Alguns Unices (famosos HP-UX e FreeBSD, por exemplo) não suportam scripts como intérpretes. Se a primeira linha é um, dois ou muitos elementos separados por espaço em branco varia entre o MacOS (e versões do FreeBSD antes de 2005) e outros. O comprimento máximo do caminho suportado varia. ␀
e os caracteres fora do conjunto de caracteres de nome de arquivo portátil POSIX são complicados, assim como os espaços em branco à esquerda e à direita. O argumento do 0º, 1º e 2º também é complicado, com variação significativa entre os sistemas. Alguns atualmente em conformidade com POSIX, mas nãoOs sistemas -Unix ainda não suportam nenhum mecanismo desse tipo e exigir que os convertesse para não serem mais compatíveis com POSIX.
Leitura adicional