Existe algum sh
código que não seja código bash sintaticamente válido (não vomitará na sintaxe)?
Estou pensando em substituir sh
com bash
para certos comandos.
bash
shell-script
posix
Alexander Mills
fonte
fonte
((
vem à mente./usr/bin/sh
é apenas um link simbólico para/usr/bin/bash
(eu estou usando o CentOS 7.3 e é). Você deve verificar sesh
é realmentebash
a sua distribuição.#!/bin/sh
para#!/bin/bash
. Então tudo funcionou novamente, então você realmente precisa ter cuidado. Pode ter acontecido quando eles começaram a usar o traço em vez do bash para sh.Respostas:
Aqui está um código que faz algo diferente no POSIX sh e Bash:
Se isso é "inválido" para você, não sei.
Em Bash, ele redireciona ambos saída padrão e erro padrão a partir
hello
para o arquivoworld
. No POSIXsh
, ele é executadohello
em segundo plano e, em seguida, faz um redirecionamento vazio paraworld
, truncando-o (ou seja, é tratado como& >
).Existem muitos outros casos em que as extensões Bash funcionam quando executadas em baixo
bash
e têm efeitos diferentes em um POSIX purosh
. Por exemplo, a expansão de chaves é outra, e também opera da mesma forma no modo POSIX do Bash e não.No que diz respeito aos erros estáticos de sintaxe, o Bash possui as duas palavras reservadas (como
[[
etime
) não especificadas pelo POSIX, como[[ x
um código de shell POSIX válido, mas um erro de sintaxe do Bash e um histórico de vários erros de incompatibilidade do POSIX que podem resultar em erros de sintaxe, como o desta pergunta :Somente erros de sintaxe é uma definição bastante perigosa de "inválido" para qualquer circunstância em que isso importe, mas aí está.
fonte
{fd}>file
um problema semelhante), para que o bash possa ser novamente compatível (expansão entre chaves) permaneceria não especificado, mas os scripts compatíveis precisariam ser executados casoecho "{a,b}"
desejem{a,b}
ser gerados). Veja a discussão que começou/bin/sh
está o bash, então, se eu não estivesse ciente desse basismo, escrever uma linha de comando poderia acontecer facilmente. O espaçamento na resposta faz com que pareça improvável, mashello&>world
é menos abrangente.&>
diferença no mês passado!Um pequeno exemplo:
time
no Bash é uma palavra reservada e se comporta de maneira diferente dotime
programa. É bem provável que você quebre alguns scripts práticos tentando analisar o resultadotime
usando o bash. Mas tecnicamente não é um erro de sintaxe. Redefinirtime
como uma função seria raro, mas causa um erro de sintaxe, conforme esta pergunta especifica.Um exemplo mais curto:
Válido
dash
, mas não compatível com POSIX.fonte
time
, há coisas comodeclare
,function
,select
, ecoproc
. Embora alguns deles estejam explicitamente marcados como não especificados no padrão ( palavras - chave e componentes internos / utilitários ), mas não consigo ver, por exemplo,time
oucoproc
na lista. E o uso--posix
não parece ajudar.