问题描述
我在脚本中执行此操作:
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相同的重定向。