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


137

我在脚本中执行此操作:

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.

为什么会出错?


作为参考,该命令也可以在cygwin上使用(/ bin / bash --version GNU bash,版本3.2.49(23)-release(i686-pc-cygwin)版权所有(C)2007自由软件基金会,Inc.)
hlovdal 2010年

Answers:


242

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


14

码头工人:

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

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

但是,根据此问题,已解决:

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

注意

要使用除之外的其他外壳程序,请/bin/sh使用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)"]

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


14

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

sudo sh ./script.sh

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

sudo bash ./script.sh

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

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


6

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

busyboxdocker容器中的实际示例:

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!

... echo 'text' | nc或更短。
phil294

2

用更简单的方式做

direc=$(basename `pwd`)

或使用外壳

$ direc=${PWD##*/}

1

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


1

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

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

这就是为什么我使用时遇到这个问题的原因sudo


0

就我而言,错误是因为我两次输入“ >>”

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

我只是将其更正为

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

0

在运行脚本之前,应检查shell脚本的第一行以获取解释器。

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

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

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

默认情况下,具有不同外壳的不同Linux发行版。


1
尽管我们感谢您的回答,但如果它在其他答案的基础上提供附加价值,那会更好。在这种情况下,您的答案没有其他价值,因为另一个用户已经发布了该解决方案。如果以前的答案对您有所帮助,则应投票赞成,而不要重复相同的信息。
Toby Speight,

您难道不认为我在这里举例说明了解决方案吗?
Sijeesh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.