Bash: Kesalahan sintaks: pengalihan tidak terduga


138

Saya melakukan ini dalam sebuah skrip:

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

dan saya mendapatkan:

Syntax error: redirection unexpected

di mesin ubuntu

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

sementara saya tidak mendapatkan kesalahan ini di mesin suse lain:

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

Mengapa kesalahan?


Sebagai referensi, perintah juga berfungsi pada cygwin (/ bin / bash --versi GNU bash, versi 3.2.49 (23) -release (i686-pc-cygwin) Hak Cipta (C) 2007 Free Software Foundation, Inc.)
hlovdal

Jawaban:


243

Apakah referensi skrip Anda /bin/bashatau /bin/shdalam hash bang line? Shell sistem default di Ubuntu adalah dash , bukan bash , jadi jika Anda memilikinya #!/bin/shmaka skrip Anda akan menggunakan shell yang berbeda dari yang Anda harapkan. Dash tidak memiliki <<<operator pengalihan.


14

Buruh pelabuhan:

Saya mendapatkan masalah ini dari Dockerfile saya seperti yang saya alami:

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

Namun, menurut masalah ini , diselesaikan:

The exec memungkinkan untuk menghindari shelling string hijauing, dan untuk RUN perintah menggunakan gambar dasar yang tidak mengandung /bin/sh.

Catatan

Untuk menggunakan shell yang berbeda, selain itu /bin/sh, gunakan formulir exec lewat di shell yang diinginkan. Sebagai contoh,

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

Larutan:

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

Perhatikan kutipan di sekitar setiap parameter.


14

Jika Anda menggunakan yang berikut untuk menjalankan skrip Anda:

sudo sh ./script.sh

Maka Anda akan ingin menggunakan yang berikut ini sebagai gantinya:

sudo bash ./script.sh

Alasan untuk ini adalah bahwa Bash bukan shell default untuk Ubuntu. Jadi, jika Anda menggunakan "sh" maka itu hanya akan menggunakan shell default; yang sebenarnya Dash. Ini akan terjadi terlepas dari apakah Anda memiliki #!/bin/bashdi bagian atas skrip Anda. Akibatnya, Anda perlu menentukan secara eksplisit untuk digunakan bashseperti yang ditunjukkan di atas, dan skrip Anda harus berjalan sesuai harapan.

Dash tidak mendukung pengalihan yang sama dengan Bash.


6

Anda bisa mendapatkan output dari perintah itu dan memasukkannya ke dalam variabel. lalu gunakan heredoc. sebagai contoh:

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

dapat ditulis seperti:

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

dan seperti ini (ini yang Anda inginkan):

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

Contoh praktis di busyboxbawah dockerwadah:

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!

... atau echo 'text' | ncyang lebih pendek.
phil294

2

lakukan dengan cara yang lebih sederhana,

direc=$(basename `pwd`)

Atau gunakan cangkangnya

$ direc=${PWD##*/}

1

Alasan lain untuk kesalahan ini adalah jika Anda menjalankan tugas cron yang memperbarui copy pekerjaan subversi dan kemudian telah mencoba untuk menjalankan skrip versi yang berada dalam keadaan yang bertentangan setelah pembaruan ...


1

Di mesin saya, jika saya menjalankan skrip secara langsung, defaultnya adalah bash .

Jika saya menjalankannya sudo, defaultnya adalah sh.

Itu sebabnya saya memukul masalah ini ketika saya menggunakan sudo.


0

Dalam kasus saya kesalahan adalah karena saya telah meletakkan ">>" dua kali

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

saya hanya memperbaikinya sebagai

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

0

Sebelum menjalankan skrip, Anda harus memeriksa baris pertama skrip shell untuk juru bahasa.

Misalnya: jika skrip dimulai dengan / bin / bash, jalankan skrip menggunakan perintah di bawah ini "bash script_name.sh"

jika skrip dimulai dengan / bin / sh, jalankan skrip menggunakan perintah di bawah "sh script_name.sh"

./sample.sh - Ini akan mendeteksi penerjemah dari baris pertama skrip dan jalankan.

Distribusi Linux yang berbeda memiliki cangkang yang berbeda sebagai default.


1
Meskipun kami berterima kasih atas jawaban Anda, akan lebih baik jika memberikan nilai tambahan di atas jawaban lainnya. Dalam hal ini, jawaban Anda tidak memberikan nilai tambahan, karena pengguna lain sudah memposting solusi itu. Jika jawaban sebelumnya bermanfaat bagi Anda, Anda harus memilihnya alih-alih mengulangi informasi yang sama.
Toby Speight

Tidakkah Anda berpikir bahwa saya menjelaskan solusinya di sini dengan sebuah contoh?
Sijeesh

Apakah ada sesuatu di sini yang tidak tercakup secara memadai dalam jawaban John Kugelman yang ditulis 8 tahun yang lalu?
Toby Speight
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.