Bash: Erro de sintaxe: redirecionamento inesperado

138

Eu faço isso em um script:

read direc <<< $(basename `pwd`)

e eu recebo:

Syntax error: redirection unexpected

em uma máquina ubuntu

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

enquanto eu não receber esse erro em outra máquina de suse:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Por que o erro?

Abra o caminho
fonte
Para referência, o comando também funciona no cygwin (/ bin / bash --version GNU bash, versão 3.2.49 (23) -release (i686-pc-cygwin) Copyright (C) 2007 Free Software Foundation, Inc.)
hlovdal 17/03/10

Respostas:

243

O seu script faz referência /bin/bashou /bin/shem sua linha de hash bang? O shell do sistema padrão no Ubuntu é dash , não bash , portanto, se você tiver #!/bin/sh, seu script usará um shell diferente do esperado. O Dash não possui o <<<operador de redirecionamento.

John Kugelman
fonte
14

Docker:

Eu estava recebendo esse problema do meu Dockerfile como havia:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

No entanto, de acordo com esse problema , foi resolvido:

O formulário exec torna possível evitar a interrupção da cadeia de caracteres da shell e RUN comandos usando uma imagem base que não contém /bin/sh.

Nota

Para usar um shell diferente /bin/sh, use o formulário exec que passa no shell desejado. Por exemplo,

RUN ["/bin/bash", "-c", "echo hello"]

Solução:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

Observe as aspas ao redor de cada parâmetro.

fantasma kemicofa
fonte
14

Se você estiver usando o seguinte para executar seu script:

sudo sh ./script.sh

Em seguida, você deseja usar o seguinte:

sudo bash ./script.sh

A razão para isso é que o Bash não é o shell padrão para o Ubuntu. Então, se você usar "sh", ele usará apenas o shell padrão; que na verdade é Dash. Isso acontecerá independentemente se você estiver #!/bin/bashno topo do seu script. Como resultado, você precisará especificar explicitamente para usar bashcomo mostrado acima, e seu script deverá ser executado conforme o esperado.

O Dash não suporta redirecionamentos da mesma forma que o Bash.

Chris Pietschmann
fonte
6

Você pode obter a saída desse comando e colocá-lo em uma variável. então use heredoc. por exemplo:

nc -l -p 80 <<< "tested like a charm";

pode ser escrito como:

nc -l -p 80 <<EOF
tested like a charm
EOF

e assim (é isso que você deseja):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

Exemplo prático em busyboxsob dockerrecipiente:

kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt!       => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.


/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!
AmirHossein
fonte
... ou echo 'text' | ncque é ainda mais curto.
phil294
2

faça da maneira mais simples,

direc=$(basename `pwd`)

Ou use o shell

$ direc=${PWD##*/}
ghostdog74
fonte
1

Outro motivo para o erro pode ser se você estiver executando um trabalho cron que atualiza uma cópia de trabalho do subversion e, em seguida, tentou executar um script com versão que estava em estado de conflito após a atualização ...

Motin
fonte
1

Na minha máquina, se eu executar um script diretamente, o padrão é bash.

Se eu executá-lo sudo, o padrão é sh.

É por isso que eu estava enfrentando esse problema quando usei sudo.

Michael Mather
fonte
0

No meu caso, o erro é porque eu coloquei ">>" duas vezes

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

eu apenas corrijo isso

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH
Mansur Ali
fonte
0

Antes de executar o script, você deve verificar a primeira linha do script shell para o intérprete.

Por exemplo: se os scripts começarem com / bin / bash, execute o script usando o comando abaixo "bash script_name.sh"

se o script começar com / bin / sh, execute o script usando o comando abaixo "sh script_name.sh"

./sample.sh - Isso detectará o intérprete da primeira linha do script e será executado.

Diferentes distribuições Linux com diferentes shells como padrão.

Sijeesh
fonte
1
Apesar de agradecermos sua resposta, seria melhor se ela fornecesse valor adicional além das outras respostas. Nesse caso, sua resposta não fornece valor adicional, pois outro usuário já postou essa solução. Se uma resposta anterior foi útil para você, você deve votar em vez de repetir a mesma informação.
Toby Speight
Você não acha que expliquei a solução aqui com um exemplo?
Sijeesh 02/02
Existe algo aqui que não esteja adequadamente coberto na resposta de John Kugelman escrita há 8 anos?
Toby Speight 02/02