Bash: Sözdizimi hatası: yeniden yönlendirme beklenmedik


138

Bunu bir komut dosyasında yapıyorum:

read direc <<< $(basename `pwd`)

ve anladım:

Syntax error: redirection unexpected

bir ubuntu makinesinde

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

Başka bir suse makinesinde bu hatayı almazken:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Neden hata?


Başvuru için, komut cygwin üzerinde de çalışır (/ bin / bash --version GNU bash, sürüm 3.2.49 (23) -çalışma (i686-pc-cygwin) Telif Hakkı (C) 2007 Free Software Foundation, Inc.)
hlovdal

Yanıtlar:


243

Senin komut referans mu /bin/bashya /bin/shda karma patlama hattında? Ubuntu varsayılan sistem kabuk çizgi değil, bash var eğer öyleyse, #!/bin/shbeklediğinizden daha sonra komut farklı bir kabuk kullanacak. Dash'in <<<yeniden yönlendirme operatörü yok.


14

Liman işçisi:

Bu sorunu Dockerfile'mdan aldığım gibi alıyordum:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Ancak, bu konuya göre çözüldü:

Exec formu mümkün kabuk dize munging önlemek ve karşı kolaylaştırır RUN içermeyen bir baz görüntü kullanılarak komutları /bin/sh.

Not

Farklı bir kabuk /bin/shkullanmak için , istenen kabuktan geçen exec formunu kullanın . Örneğin,

RUN ["/bin/bash", "-c", "echo hello"]

Çözüm:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

Her parametrenin etrafındaki tırnaklara dikkat edin .


14

Komut dosyanızı çalıştırmak için aşağıdakileri kullanıyorsanız:

sudo sh ./script.sh

Ardından bunun yerine aşağıdakileri kullanmak istersiniz:

sudo bash ./script.sh

Bunun nedeni Bash'in Ubuntu için varsayılan kabuk olmamasıdır. Yani, "sh" kullanırsanız, sadece varsayılan kabuğu kullanacaktır; aslında Dash. #!/bin/bashSenaryonuzun en üstünde olursanız olun bu gerçekleşir. Sonuç olarak, bashyukarıda gösterildiği gibi açıkça belirtmeniz gerekir ve komut dosyanız beklendiği gibi çalışmalıdır.

Dash, Bash ile aynı yönlendirmeleri desteklemez.


6

Bu komutun çıktısını alıp bir değişkene koyabilirsiniz. sonra kullanın heredoc. Örneğin:

nc -l -p 80 <<< "tested like a charm";

şöyle yazılabilir:

nc -l -p 80 <<EOF
tested like a charm
EOF

ve bunun gibi (istediğiniz budur):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

Konteyner busyboxaltında pratik örnek 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!

... ya echo 'text' | ncda daha da kısadır.
phil294

2

daha basit bir yol yap,

direc=$(basename `pwd`)

Veya kabuğu kullanın

$ direc=${PWD##*/}

1

Hatanın bir başka nedeni, bir alt sürüm çalışan kopyasını güncelleyen ve daha sonra güncellemeden sonra çakışan bir durumda olan sürümlenmiş bir komut dosyasını çalıştırmaya çalışan bir cron işi çalıştırıyor olmanız olabilir ...


1

Makinemde, bir komut dosyasını doğrudan çalıştırırsam, varsayılan değerdir bash.

Eğer ile çalıştırırsam sudo, varsayılan değer sh.

Bu yüzden kullandığımda bu soruna değiyordum sudo.


0

Benim durumumda hata ben ">>" iki kez koymak çünkü

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

sadece şu şekilde düzeltirim

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH

0

Komut dosyasını çalıştırmadan önce, yorumlayıcı için kabuk komut dosyasının ilk satırını kontrol etmelisiniz.

Örneğin: komut dosyaları / bin / bash ile başlıyorsa, komut dosyasını aşağıdaki "bash script_name.sh" komutunu kullanarak çalıştırın

komut dosyası / bin / sh ile başlıyorsa, komut dosyasını aşağıdaki komut "sh script_name.sh" komutunu kullanarak çalıştırın.

./sample.sh - Bu, yorumlayıcıyı komut dosyasının ilk satırından algılar ve çalıştırır.

Varsayılan olarak farklı kabuklara sahip farklı Linux dağıtımları.


1
Cevabınız için teşekkür etmemize rağmen, diğer cevapların üzerine ek değer katması daha iyi olurdu. Bu durumda, başka bir kullanıcı bu çözümü zaten gönderdiğinden cevabınız ek değer sağlamaz. Önceki bir yanıt size yardımcı olduysa, aynı bilgileri tekrarlamak yerine oy vermeniz gerekir.
Toby Speight

Buradaki çözümü bir örnekle açıkladığımı düşünmüyor musunuz?
Sijeesh

Burada 8 yıl önce yazılan John Kugelman'ın cevabında yeterince ele alınmayan bir şey var mı ?
Toby Speight
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.