当前位置: 首页>>技术教程>>正文


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

,

问题描述

我在脚本中执行此操作:

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

我得到:

Syntax error: redirection unexpected

在Ubuntu机器上

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

虽然我没有在另一台suse机器上收到此错误:

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

为什么会出错?

最佳答案

您的脚本在其哈希行中是否引用了/bin/bash/bin/sh? Ubuntu中的默认系统 shell 是dash,而不是bash,因此,如果您有#!/bin/sh,则您的脚本将使用与预期不同的 shell 。 Dash没有<<<重定向运算符。

次佳答案

码头工人:

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

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

但是,根据this issue,它已解决:

The exec form makes it possible to avoid shell string munging, and to RUN commands using a base image that does not contain /bin/sh.

Note

To use a different shell, other than /bin/sh, use the exec form passing in the desired shell. For example,

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

解:

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

注意每个参数周围的引号。

第三种答案

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

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

可以这样写:

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

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

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

docker容器下的busybox中的实际示例:

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!

第四种答案

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

sudo sh ./script.sh

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

sudo bash ./script.sh

原因是Bash不是Ubuntu的默认 shell 。因此,如果使用”sh”,则它将仅使用默认 shell 程序;实际上是Dash。无论脚本顶部是否有#!/bin/bash,都会发生这种情况。如此一来,您将需要明确指定使用bash,如上所示,并且脚本应按预期运行。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7949.html,未经允许,请勿转载。