私はスクリプトでこれを行います:
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)
私は別のスーズマシンでこのエラーを受け取りませんが:
/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
なぜエラーですか?
私はDockerfileからこの問題を抱えていました。
RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
ただし、 この問題 によると、解決されました:
exec形式により、シェル文字列の改ざんを回避し、
RUN
コマンドを実行できます。/bin/sh
を含まないベースイメージを使用します。注意
/bin/sh
以外の別のシェルを使用するには、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)"]
eachパラメーターを囲む引用符に注意してください。
そのコマンドの出力を取得して、変数に入れることができます。次に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!
次を使用してスクリプトを実行している場合:
Sudo sh ./script.sh
次に、代わりに次を使用します。
Sudo bash ./script.sh
これは、BashがUbuntuのデフォルトのシェルではないためです。そのため、「sh」を使用すると、デフォルトのシェルが使用されます。これは実際にはダッシュです。これは、スクリプトの先頭に#!/bin/bash
があるかどうかに関係なく起こります。その結果、上記のようにbash
を使用するよう明示的に指定する必要があり、スクリプトは予想どおりに実行されるはずです。
DashはBashと同じリダイレクトをサポートしていません。
より簡単な方法で、
direc=$(basename `pwd`)
または、シェルを使用します
$ direc=${PWD##*/}
エラーのもう1つの理由は、Subversion作業コピーを更新するcronジョブを実行していて、更新後に競合状態にあるバージョン対応スクリプトを実行しようとした場合です。
私の場合、エラーは「>>」を2回入れたためです。
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
スクリプトを実行する前に、インタープリターのシェルスクリプトの最初の行を確認する必要があります。
例:スクリプトが/ bin/bashで始まる場合、以下のコマンド「bash script_name.sh」を使用してスクリプトを実行します
スクリプトが/ bin/shで始まる場合、以下のコマンド「sh script_name.sh」を使用してスクリプトを実行します
./sample.sh-スクリプトの最初の行からインタープリターを検出して実行します。
デフォルトとして異なるシェルを持つ異なるLinuxディストリビューション。
私のマシンでは、スクリプトを直接実行する場合、デフォルトはbash
です。
Sudo
で実行した場合、デフォルトはsh
です。
そのため、Sudo
を使用したときにこの問題が発生していました。