cabeçalho de script de shell para melhor compatibilidade [duplicado]

Esta pergunta já tem respostas aqui :

Comentários

  • É realmente sobre o quão portátil você deseja ser . Apenas Unixes? Todas as caixas baseadas no kernel Linux? Todos os sistemas, mesmo antigos Win 3.0 e VMS (brincando)? /bin/sh geralmente é um bom mínimo, mas esteja ciente de que sh não é bash .. .esperado na maioria dos sistemas GNU / Linux .
  • Embora o Android use o kernel do Linux e o shell padrão seja derivado do bash via ash, a área de usuário não é muito semelhante ao Unix e sem muitas ferramentas padrão.

Resposta

Para portabilidade, você pode assumir com segurança que #!/bin/sh encontrará um shell compatível com POSIX em qualquer sistema Unix ou Linux padrão, mas isso é realmente sobre isso.

No FreeBSD, OpenBSD e NetBSD ( junto com o DragonFly, PC-BSD e alguns outros derivados), o bash está localizado em /usr/local/bin/bash (se estiver instalado), então o /usr/bin/env abordagem fornece portabilidade entre Linux e BSD.

O Android não é um sistema Unix ou Linux padrão. No meu telefone Android sem root, nenhum dos /usr/bin/env, /bin/bash o r até /bin/sh existem, e o shell do sistema é /system/bin/sh.

Um script de shell sem o #! (shebang) tentará executar no shell que o chamou em alguns sistemas ou pode usar um interpretador padrão diferente (/bin/bash por exemplo) , em outros sistemas. E embora isso funcione no Android, não é garantido que funcione em outros sistemas operacionais, onde os usuários podem optar por usar um shell interativo que não seja bash. (Eu uso tcsh no FreeBSD, onde é o shell padrão, e o script shebang-less é interpretado pelo shell de chamada.)

Então, de onde estou, parece que é não é possível criar um script de shell que seja portátil entre sistemas Android e não Android (Linux ou Unix), porque o Android faz as coisas de maneira diferente.

Comentários

  • Na minha experiência, /bin/sh deve apontar para algo mais como bsh ou dash do que bash, que é relativamente inchado e, portanto, preferido para uso interativo.
  • Alguns erros aqui. Ainda há muitos (principalmente comerciais) Unices por aqui (a maioria deles Solaris 10 e anteriores), onde /bin/sh é o shel Bourne l, não é um shell POSIX, o POSIX não ' t especifica o caminho de sh. A maioria dos shells (e execp / env / find -exec...) interpretará um she-bang- menos script com o sistema ' s sh, poucos interpretam com eles mesmos e quando o fazem, o fazem no modo de compatibilidade POSIX. Essa ' é a maneira padrão / POSIX de executar o script, mas assume que o chamador está em um ambiente POSIX .
  • Em relação a * BSD bash é opcional. Isso significa que há boas chances de que mesmo /usr/local/bin/bash não exista nos sistemas (para não mencionar sistemas proprietários como Solaris, AIX ou HP-Ux).
  • @ StephaneChazelas – re POSIX, concordo, é claro, e que ' é por isso que as palavras que usei eram " em sua maioria compatíveis com POSIX ". Mas essa questão era sobre portabilidade, ao invés de onde encontrar POSIX, e não se pode ' confiar em um shell sempre sendo encontrado em um local. Com relação ao interpretador padrão, um script shebang-less executado em tcsh é interpretado por tcsh no FreeBSD. Obviamente, há ' s inconsistência lá também, então ' atualizei a resposta de acordo.
  • @Ouki – sim, claro, eu não ' achei que isso fosse relevante para a pergunta. Mas eu ' acrescentei esse esclarecimento à resposta para maior clareza.

Resposta

Na minha experiência, #!/bin/sh e #!/bin/bash sempre acabaram encontrando o ambiente certo nos poucos sistemas em que trabalhei . Ainda não encontrei uma exceção. Também acho que é usado rotineiramente em textos relacionados a scripts de shell que suponho que tenham sido escritos tendo a portabilidade em mente devido ao público diverso.

Não posso dizer o mesmo com #!/usr/bin/env.Alguns sistemas o têm instalado como #!/bin/env e quebraram meus scripts Python no passado. Então, vou com o segundo item.

Aqui está um pouco de suporte para minha declaração acima:

No CentOS versão 5.7 eu obtenho o seguinte:

$ which env /bin/env 

No Ubuntu 12.04 Precise Pangolin:

$ which env /usr/bin/env 

Além disso, pelo menos em um sistema mais antigo, lembro-me dos administradores instalado coreutils em /opt por algum motivo (pode não ser uma prática recomendada). Desde env faz parte de coreutils, os usuários acabaram conseguindo em /opt/coreutils/bin/env. Reconheço que não usei todos os sistemas lá fora, então a resposta baseia-se na minha experiência limitada.

Comentários

  • Por exemplo /bin/bash definitivamente não é FreeBSD (seria seja /usr/local/bin/bash já que o bash não faz parte dos shells padrão).
  • É ' ao contrário: apenas alguns sistemas muito raros não têm /usr/bin/env (SCO que é barel y existente, NextStep que está quase extinto – além, é claro, dos sistemas não-unix mais comuns, como Android ou Windows). Por outro lado, /bin/bash praticamente só existe no Linux não integrado. /bin/sh é uma aposta segura em qualquer Unix, mas alguns sistemas mais antigos têm um shell Bourne não POSIX lá.
  • @Gilles Obrigado pela informação. Atualizei minha resposta fornecendo algumas evidências do que vi em alguns sistemas que encontrei.
  • which env isn ' t relevante: existem alguns sistemas em que /usr/bin é um link simbólico para /bin ou vice-versa, o que torna ambos /usr/bin/env e /bin/env utilizável. O que importa é que /usr/bin/env está presente, o que é o caso em todas as distribuições Linux que eu ' já vi ou ouvi falar (e removendo-o quebraria tantas coisas que ninguém faria).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *