Bash:语法错误:意外redirect

我在一个脚本中这样做:

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没有<<<redirect操作符。

泊坞窗:

我从我的Dockerfile得到这个问题,因为我有:

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

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

execforms使得可以避免shellstring转换,并使用不包含/bin/sh的基本映像RUN命令。

+> 注意 :+>要使用不同于'/ bin / sh'的shell,请使用exec窗体+>传入所需的shell。 例如,+> RUN ["/bin/bash", "-c", "echo hello"] + RUN指令caching在下一次​​构build时不会自动失效。 像RUN apt-get dist-upgrade -y这样的指令的caching将在下一个版本中被重用。 caching

解:

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

注意每个参数的引号。

做更简单的方法,

 direc=$(basename `pwd`) 

或者使用shell

 $ direc=${PWD##*/} 

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

在我的情况下,错误是因为我已经把“>>”两次

 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