我在脚本中执行此操作:
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.
为什么会出错?
答案 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发行版。