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

时间:2010-03-17 12:58:55

标签: bash ubuntu

我在脚本中执行此操作:

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.

为什么会出错?

8 个答案:

答案 0 :(得分:187)

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

答案 1 :(得分:11)

泊坞:

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

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

然而,根据this issue,它已经解决了:

  

exec 表单可以避免shell字符串重叠,以及   使用不包含RUN的基本图像的/bin/sh命令。

     

注意

     

要使用/bin/sh以外的其他shell,请使用 exec 表单   传入所需的外壳。例如,

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)"]

请注意每个参数附近的引号。

答案 2 :(得分:2)

以更简单的方式做到,

direc=$(basename `pwd`)

或者使用shell

$ direc=${PWD##*/}

答案 3 :(得分:2)

您可以获取该命令的输出并将其放入变量中。然后使用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

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!

答案 4 :(得分:2)

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

sudo sh ./script.sh

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

sudo bash ./script.sh

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

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

答案 5 :(得分:1)

错误的另一个原因可能是您运行的cron作业更新了subversion工作副本,然后尝试运行更新后处于冲突状态的版本化脚本...

答案 6 :(得分:0)

在我的机器上,如果我直接运行脚本,则默认为bash

如果我使用sudo运行,则默认为sh

这就是我使用sudo时遇到此问题的原因。

答案 7 :(得分:0)

在运行脚本之前,您应该检查解释器的shell脚本的第一行。

例如: 如果脚本以/ bin / bash开头,请使用以下命令运行脚本 “bash script_name.sh”

如果脚本以/ bin / sh开头,请使用以下命令运行脚本 “sh script_name.sh”

./ sample.sh - 这将从脚本的第一行检测解释器并运行。

默认情况下具有不同shell的不同Linux发行版。