我在脚本中执行此操作:
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.
为什么会出错?
如果您使用以下内容运行脚本:
sudo sh ./script.sh
然后,您将要使用以下内容:
sudo bash ./script.sh
原因是 Bash 不是 Ubuntu 的默认 shell。因此,如果您使用“sh”,那么它将只使用默认 shell;这实际上是 Dash。无论您的脚本顶部是否有 #!/bin/bash
,都会发生这种情况。因此,您需要明确指定使用 bash
,如上所示,并且您的脚本应该按预期运行。
Dash 不支持与 Bash 相同的重定向。
码头工人:
我从我的 Dockerfile 中遇到了这个问题:
RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
但是,根据this issue,它已解决:
exec 形式可以避免 shell 字符串修改,并使用不包含 /bin/sh 的基本映像运行命令。注意 要使用 /bin/sh 以外的其他 shell,请使用传入所需 shell 的 exec 形式。例如,运行 ["/bin/bash", "-c", "echo hello"]
解决方案:
RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]
注意每个参数周围的引号。
ssh-keygen -q -t rsa <<< ""$'\n'"y"
,参见 stackoverflow.com/a/43235320/11154841)。
您可以获取该命令的输出并将其放入变量中。然后使用 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!
echo 'text' | nc
更短。
用更简单的方法,
direc=$(basename `pwd`)
或者使用外壳
$ direc=${PWD##*/}
该错误的另一个原因可能是如果您正在运行更新颠覆工作副本的 cron 作业,然后尝试运行在更新后处于冲突状态的版本化脚本......
在我的机器上,如果我直接运行脚本,默认为 bash
。
如果我使用 sudo
运行它,则默认值为 sh
。
这就是我在使用 sudo
时遇到此问题的原因。
在我的情况下,错误是因为我放了两次“>>”
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
在运行脚本之前,您应该检查解释器的 shell 脚本的第一行。
例如:如果脚本以 /bin/bash 开头,请使用以下命令“bash script_name.sh”运行脚本
如果脚本以 /bin/sh 开头,请使用以下命令“sh script_name.sh”运行脚本
./sample.sh - 这将从脚本的第一行检测解释器并运行。
不同的 Linux 发行版默认具有不同的 shell。
不定期副业成功案例分享
sh ./script.sh
运行它?不要使用显式 shell 运行脚本。只需键入脚本名称./script.sh
,它就可以使用在 shebang 行中声明的解释器。dash
更改为bash
吗?