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