Como compartilhar um script do GNU sed entre o Linux e o Mac OS X

5

Eu tenho um script GNU sed que eu uso no Linux; está instalado em /bin/sed e parece que contém GNUisms. Tenho colaboradores usando o Mac OS X. Eles instalaram (não-GNU) sed , localizado em /usr/bin/sed , e usando o Homebrew ( link ) pode instalar o GNU sed as gsed com o pacote coreutils , localizado em /usr/local/bin/gsed .

Atualmente, o script começa com #!/bin/sed -f . Como posso modificá-lo para que possa ser executado no Mac OS X, quando o GNU sed está instalado como gsed ?

Outra opção seria remover os GNUisms, mas isso pode ser um pouco difícil, já que não tenho uma instalação do Mac OS X disponível e não posso pedir aos meus colaboradores para testar versões intermediárias.

    
por equaeghe 14.05.2013 / 10:50

3 respostas

5

Existem algumas opções:

  • Use #!/usr/bin/gsed -f (supondo que esteja em /usr/bin ) como o shebang em todos os lugares e certifique-se de que seus ambientes Linux sejam links simbólicos corretamente;
  • Remova os GNUisms;
  • Symlink sed to /usr/bin/gsed de um diretório anterior a /usr/bin no usuário $PATH (possivelmente perigoso);
  • Crie um script de wrapper com a seguinte aparência:
#!/bin/sh

script=/foo

type gsed >/dev/null 2>&1 && exec gsed -f "$script"
exec sed -f "$script"

Em última análise, é necessário que haja alterações em pelo menos um dos ambientes ou alterações no próprio script.

    
por 14.05.2013 / 11:02
5

Você pode ter seu script sed iniciado com isso:

\:;s=sed;type gsed >/dev/null 2>&1 && s=gsed; exec "$s" -f "$0" "$@";$:s/^//

Isso é um não operacional em sed (embora possa degradar um pouco seu desempenho de script) e quando interpretado por um shell seria executado com gsed se encontrado ou sed se não (ambos pesquisados em $PATH ) .

    
por 14.05.2013 / 12:35
1

(Dando uma resposta à minha própria pergunta, ou melhor, uma abordagem alternativa que funcione nessa situação.)

Um sed script ascript.sed , mesmo quando eles começam com um sha-bang, também pode ser aplicado a partir da linha de comando em um arquivo de destino target.txt as sed -f ascript.sed target.txt . Isso significa que, quando no Mac OS X, pode-se chamar o script como gsed -f ascript.sed target.txt .

    
por 14.05.2013 / 11:35