我在脚本中这样做:
read direc <<< $(basename `pwd`)
Run Code Online (Sandbox Code Playgroud)
我得到:
Syntax error: redirection unexpected
Run Code Online (Sandbox Code Playgroud)
在ubuntu机器上
/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
虽然我没有在另一台suse机器上得到这个错误:
/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
为什么错误?
Joh*_*ica 202
您的脚本是引用/bin/bash
还是/bin/sh
哈希爆炸线?Ubuntu中的默认系统shell是破折号,而不是bash,所以如果你有,#!/bin/sh
那么你的脚本将使用与你期望的不同的shell.Dash没有<<<
重定向运算符.
kem*_*ica 12
我从我的Dockerfile中得到了这个问题:
RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
Run Code Online (Sandbox Code Playgroud)
但是,根据这个问题,它解决了:
在EXEC形式使得能够避免壳串改写(munging),并
RUN
使用不包含基础图像命令/bin/sh
.注意
要使用不同的shell,请
/bin/sh
使用传递在所需shell中的exec表单.例如,Run Code Online (Sandbox Code Playgroud)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)"]
Run Code Online (Sandbox Code Playgroud)
注意每个参数的引号.
您可以获取该命令的输出并将其放入变量中。然后使用heredoc
. 例如:
nc -l -p 80 <<< "tested like a charm";
Run Code Online (Sandbox Code Playgroud)
可以写成:
nc -l -p 80 <<EOF
tested like a charm
EOF
Run Code Online (Sandbox Code Playgroud)
像这样(这就是你想要的):
text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF
Run Code Online (Sandbox Code Playgroud)
容器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!
Run Code Online (Sandbox Code Playgroud)
如果您使用以下命令来运行脚本:
sudo sh ./script.sh
Run Code Online (Sandbox Code Playgroud)
然后,您将要使用以下内容:
sudo bash ./script.sh
Run Code Online (Sandbox Code Playgroud)
原因是Bash不是Ubuntu的默认外壳。因此,如果您使用“ sh”,它将仅使用默认外壳程序;实际上是Dash。无论您是否#!/bin/bash
位于脚本顶部,都将发生这种情况。结果,您将需要bash
如上所示显式指定使用,并且脚本应按预期运行。
Dash不支持与Bash相同的重定向。
归档时间: |
|
查看次数: |
92455 次 |
最近记录: |