Quando uso o código abaixo no terminal SSH do CentOS, ele funciona bem:
paste <(printf "%s\n" "TOP")
Mas se eu colocar o mesmo código de linha em um script de shell (test.sh) e executar o script de shell do terminal, ele emitirá um erro, pois
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Como posso resolver este problema?
dash
vez debash
).#!/bin/sh
no topo. Eu executei comobash test.sh
mas também não funcionou.bash
no modo POSIX também não suporta essa sintaxe (quando chamado com--posix
ou como/bin/sh
). Use#!/bin/bash
.POSIXLY_CORRECT
variáveis definidas quando iniciabash
?#!/bin/bash
o topo corrigiu o problema.Respostas:
Substituição processo não é especificado por POSIX, por isso nem todos POSIX shell apoiá-lo, apenas alguns escudos como
bash
,zsh
,ksh88
,ksh93
apoio.No
Centos
sistema,/bin/sh
é um link simbólico para/bin/bash
. Quandobash
é chamado com o nomesh
,bash
entra no modo posix ( arquivos de inicialização do Bash - chamado com o nome sh ). No modo posix,process substitution
não é suportado, causa erro de sintaxe.Script deve funcionar, se você ligar
bash
diretamentebash test.sh
. Caso contrário, talvezbash
tenha entrado no modo posix. Isso pode ocorrer se você começarbash
com--posix
argumento ou variávelPOSIXLY_CORRECT
estiver definida quandobash
iniciar:Ou
bash
é construído com--enable-strict-posix-default
opção.Aqui, você não precisa de substituição de processo, pode usar tubos de shell padrão:
-
é a maneira padrão de dizerpaste
para ler os dados do stdin. Em algumaspaste
implementações, você pode omitir, embora isso não seja padrão.Onde seria útil ao colar a saída de mais de um comando, como em:
Em sistemas compatíveis
/dev/fd/n
, isso pode ser feitosh
com:(é o que
<(...)
faz internamente).fonte
Aqui está outra solução alternativa. Em vez de executar o comando, execute bash e passe o comando para bash usando -c:
fonte