Bash:语法错误:重定向意外

Ope*_*way 120 bash ubuntu

我在脚本中这样做:

read direc <<< $(basename `pwd`)
Run Code Online (Sandbox Code Playgroud)

我得到:

Syntax error: redirection unexpected
Run Code Online (Sandbox Code Playgroud)

在ubuntu机器上

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

虽然我没有在另一台suse机器上得到这个错误:

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

为什么错误?

Joh*_*ica 202

您的脚本是引用/bin/bash还是/bin/sh哈希爆炸线?Ubuntu中的默认系统shell是破折号,而不是bash,所以如果你有,#!/bin/sh那么你的脚本将使用与你期望的不同的shell.Dash没有<<<重定向运算符.

  • @ibilgen 您是否使用“sh ./script.sh”运行它?不要使用显式 shell 运行脚本。只需输入脚本名称“./script.sh”,这样它就可以使用 shebang 行中声明的解释器。 (6认同)
  • 我的 sh 文件顶部有“#!/bin/bash”,但它仍然给出该错误。正如 @chris 所说,使用 bash ./script.sh 时它有效。 (2认同)

kem*_*ica 12

泊坞窗:

我从我的Dockerfile中得到了这个问题:

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

但是,根据这个问题,它解决了:

EXEC形式使得能够避免壳串改写(munging),并RUN 使用不包含基础图像命令/bin/sh.

注意

要使用不同的shell,请/bin/sh使用传递在所需shell中的exec表单.例如,

RUN ["/bin/bash", "-c", "echo hello"]
Run Code Online (Sandbox Code Playgroud)

解:

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

注意每个参数的引号.


Ami*_*ein 8

您可以获取该命令的输出并将其放入变量中。然后使用heredoc. 例如:

nc -l -p 80 <<< "tested like a charm";
Run Code Online (Sandbox Code Playgroud)

可以写成:

nc -l -p 80 <<EOF
tested like a charm
EOF
Run Code Online (Sandbox Code Playgroud)

像这样(这就是你想要的):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF
Run Code Online (Sandbox Code Playgroud)

容器busybox下的实际示例docker

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!
Run Code Online (Sandbox Code Playgroud)

  • ...或`回显'文本' | nc` 甚至更短。 (2认同)

Chr*_*ann 5

如果您使用以下命令来运行脚本:

sudo sh ./script.sh
Run Code Online (Sandbox Code Playgroud)

然后,您将要使用以下内容:

sudo bash ./script.sh
Run Code Online (Sandbox Code Playgroud)

原因是Bash不是Ubuntu的默认外壳。因此,如果您使用“ sh”,它将仅使用默认外壳程序;实际上是Dash。无论您是否#!/bin/bash位于脚本顶部,都将发生这种情况。结果,您将需要bash如上所示显式指定使用,并且脚本应按预期运行。

Dash不支持与Bash相同的重定向。