É recomendado usar scripts zsh em vez de bash?

20

Posso supor que pessoas suficientes tenham zsh instalado para executar scripts com um

#!/usr/bin/env zsh

como shebang?

Ou isso tornará meus scripts inutilizáveis em muitos sistemas?

Esclarecimento: estou interessado em programas / scripts que um usuário final possa querer executar (como no Ubuntu, Debian, SUSE, Arch & c).

    
por Profpatsch 24.03.2013 / 17:56

6 respostas

27

Para portabilidade, não. Enquanto zsh pode ser compilado em qualquer Unix ou Unix-like e até mesmo Windows pelo menos via Cygwin, e é empacotado para a maioria dos programas de código aberto e vários comerciais, geralmente não é incluído na instalação padrão.

bash na outra extremidade está instalado em sistemas GNU (como bash é o shell do projeto GNU) como a grande maioria de sistemas baseados em Linux não embarcados e algumas vezes em sistemas não-GNU como o Apple OS / X. No lado comercial do Unix, o shell Korn (a variante AT & T, embora mais o ksh88 one) é a norma e os dois bash e zsh estão em pacotes opcionais. Nos BSDs, o shell interativo preferido é geralmente tcsh , enquanto sh é baseado no shell Almquist ou pdksh e bash ou zsh também precisam ser instalados como pacotes opcionais.

zsh é instalado por padrão no Apple OS / X. Ele costumava ser o /bin/sh lá. Ele pode ser encontrado por padrão em algumas distribuições do Linux, como SysRescCD, Grml, Gobolinux e provavelmente outras, mas eu não acho nenhuma das principais.

Assim como para bash , há a questão da versão instalada e, como conseqüência, dos recursos disponíveis. Por exemplo, não é incomum encontrar sistemas com bash3 ou zsh3 . Além disso, não há garantia de que o script que você escreve agora para zsh5 funcionará com zsh6 , embora, como por bash , eles tentem manter a compatibilidade com versões anteriores.

Para scripts, minha visão é: use a sintaxe do shell POSIX como todos os Unices têm pelo menos um shell chamado sh (não necessariamente em /bin ) que é capaz de interpretar essa sintaxe. Então você não precisa se preocupar tanto com a portabilidade. E se essa sintaxe não for suficiente para sua necessidade, provavelmente você precisará de mais de um shell.

Então, suas opções são:

  • Perl, que é onipresente (embora você precise limitar-se ao conjunto de recursos de versões antigas e não pode fazer suposições sobre os módulos Perl instalados por padrão)
  • Especifique o interpretador e sua versão (python 2.6 ou superior, zsh 4 ou superior, bash 4.2 ou superior ...), como uma dependência para seu script, construindo um pacote para cada sistema de destino que especifica a dependência ou estipulando-o em um arquivo README enviado ao lado do seu script ou incorporado como comentários na parte superior do script ou adicionando algumas linhas na sintaxe Bourne no início do script, que verifica a disponibilidade do intérprete solicitado e sai com um erro explícito quando não é, como este script precisa de zsh 4.0 ou superior .
  • Envie o intérprete ao lado do seu script (cuidado com as implicações de licenciamento), o que significa que você também precisa de um pacote para cada sistema operacional visado. Alguns intérpretes facilitam o fornecimento de uma maneira de empacotar o script e seu interpretador em um único executável.
  • Escreva em uma linguagem compilada. Mais uma vez, um pacote por sistema direcionado.
por 24.03.2013 / 21:32
9

Não, você não pode. O que é garantido disponível é /bin/sh , essencialmente o shell Bourne original. Quase todos (note o "quase"!) As instalações do Linux terão o bash, mas nos sistemas * BSD é raro (a avaliação do BSD tem sérios receios sobre o código GPL, como o bash). Eu não sei o que é o shell padrão no Mac, mas, novamente, há dúvidas sobre a GPL. O mesmo para o Solaris.

O zsh é um shell de nicho, não está na instalação padrão do Fedora (e eu não acredito que seja padrão para qualquer grande distribuição).

    
por 24.03.2013 / 18:36
2

Eu acho que isso realmente depende de quais zsh recursos extras você está usando e onde. Se você planeja distribuir seu script pelos diferentes usuários e sistemas, sugiro usar bash ou até sh .

Ao mesmo tempo, se seu script foi projetado para ser executado em toda a organização e você tem a convenção de ter zsh em suas máquinas (por exemplo, a mesma AMI básica) e sua tarefa tem benefícios claros de extensões como seletores de arquivos avançados ou outras coisas do link , eu diria, vá em frente!

    
por 27.03.2013 / 18:52
1

Como afirmado, bash está normalmente disponível na instalação padrão para muitas distros. Seu script não alcançará a maior base de usuários confiando em zsh .

Uma pergunta importante a ser respondida antes de criar seu script é " Por que importa em qual shell um script é executado? "

Diferentes shells usam sintaxe diferente ou oferecem funções adicionais do shell que podem não ser suportadas por outros shells. Para escrever um script para o "mundo do usuário final do linux geral", determine se o seu script usa alguma sintaxe ou funções de shell que dependam de um determinado ambiente do shell.

Por exemplo, bash shell suporta certas expansões que não são suportado por dash , shell Bourne ou qualquer que seja o /bin/sh aponta para o sistema do usuário.

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

Tente executar echo {1..10} com /bin/sh em comparação com /bin/bash e você terá resultados muito diferentes.

O mesmo vale para zsh , que, embora suporte a maioria da sintaxe bash , oferece expansão e sintaxe adicionais que não são suportadas pelo shell bash . Veja estas tabelas comparando shells para exemplos específicos.

Você pode ampliar sua base de usuários em potencial além de bash aderindo a scripts que funcionam quando chamados com #!/bin/sh -u . No entanto, isso dá origem a outra pergunta importante a ser feita: " O que está sendo sacrificado em troca de maior portabilidade? "

Determine se as diferenças relacionadas a questões de segurança, funcionalidade, eficiência ou qualquer outra coisa que você sente como prioridade para o seu script valeria a pena. Talvez você não queira o uso disseminado de um script com uma vulnerabilidade de segurança conhecida apenas porque ele funciona em mais ambientes.

Tantos scripts são escritos para bash que o suporte para esses scripts é usado como um critério quando comparando shells de comando . Muito mais pessoas poderão executar seu script do que se ele confiar em zsh ou qualquer outra sintaxe exclusiva para um ambiente de shell.

Além disso, tenha em mente que você não tem controle sobre como o usuário executa o script (também é útil para depuração de scripts em diferentes shells ):

Remember that if you use a shell to read a shell script (“sh scriptname”), instead of executing it directly (“./scriptname”), the shell will treat all the comments at the start of the shell script as comments. In particular, the comment that specifies the interpreter to use when executing the script (“#!/bin/sh -u”) will be ignored, as will all of the options listed beside that interpreter.

Então, o melhor que você pode fazer sobre isso é tornar seus scripts portáveis, desde que não exista um grande sacrifício em como isso funciona.

Você também pode ver Convenções de codificação do Bash - estouro de pilha .

    
por 04.05.2015 / 03:08
1

A única coisa que você pode garantir é que existe um /bin/sh . Isso pode ser um shell vinculado de fato estático ou pode ser um link para outro shell. Esse outro shell geralmente detecta que é chamado sh e será executado no modo de compatibilidade.

Observe o quase na primeira sentença.

Todo sistema parecido com um unix que eu já trabalhei teve isto. Muitos deles também tinham o bash instalado (mas não todos deles. Por exemplo, o bash não é instalado por padrão em alguns BSDs. Alguns distribuição de distribuição do Linux com DASH , o shell do Debian Almquist.

O que você pode garantir são suas instruções de instalação. Você pode adicionar uma linha ao arquivo README informando que é necessário zsh. Se você criar um pacote, poderá marcar zsh como dependência. Você pode verificar isso com as ferramentas autoconf / automake. Você pode verificar se o zsh é encontrado no script de instalação (inicie com / bin / sh e tente localizar zsh, se encontrado continue. Se não exibir um erro. Ex. "Aviso: ZSH não está instalado. Por favor, leia o arquivo de instruções de instalação! ".)

Tenho certeza de que esqueci mais algumas opções. Mas os pontos principais são:

  • Você não pode garantir nada até verificar isso.
  • Você está quase garantido que / bin / sh está presente, e que você pode verificar com isso.
por 25.03.2013 / 15:37
0

Esta é uma boa pergunta. Eu tenho uma biblioteca de scripts tcsh que têm uso geral. No entanto, dada a reputação de tcsh .. Eu preciso reescrevê-los (caso contrário, eles funcionam bem). Eu acho que a resposta é bem simples: bash. Tem a base instalada mais ampla devido ao GNU / Linux.

    
por 03.05.2015 / 22:26