Mendapatkan kesalahan "pengalihan ambigu"

173

Baris berikut dalam skrip Bash saya

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

memberi saya kesalahan ini:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Mengapa?

Buka jalannya
sumber
10
kamu tidak menunjukkan semua. mana Anda mendapatkan ${OUPUT_RESULTS}. Ini juga merupakan kesalahan pengejaan jika Anda maksud$OUTPUT_RESULTS}
ghostdog74
jika seseorang menulis OUPUT_RESULTS = "filename.log"satu akan mendapatkan redirect ambigu. Karena bash tidak ingin ada spasi di sekitar =operator.
Poutrathor

Jawaban:

270

Bash terkadang bisa sangat bodoh.

Semua perintah berikut mengembalikan pesan kesalahan yang berbeda untuk kesalahan yang pada dasarnya sama:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

Menambahkan kutipan di sekitar variabel tampaknya merupakan cara yang baik untuk menangani pesan "pengalihan ambigu": Anda cenderung mendapatkan pesan yang lebih baik ketika Anda membuat kesalahan pengetikan - dan ketika kesalahan tersebut disebabkan oleh spasi pada nama file, menggunakan tanda kutip adalah perbaikannya.

Brent Bradburn
sumber
1
Anda juga akan mendapatkan ini jika Anda mengarahkan output dari skrip yang berisi arahan ulang. Jangan tanya saya bagaimana saya tahu ini.
Paul Jackson
@ PaulJackson, ... itu tidak benar. Sebagai demonstran copy-dan-paste: sh -c 'echo hello >/tmp/hello' >/tmp/worldberfungsi dengan baik.
Charles Duffy
24

Apakah Anda memiliki variabel bernama OUPUT_RESULTSatau itu lebih cenderung OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 
HANYA PENDAPAT SAYA yang benar
sumber
2
Jika Anda ABC="junk file.txt", ini masih memiliki masalah.
Charles Duffy
15

beri tanda kutip di sekitar variabel Anda. Jika kebetulan memiliki spasi, itu akan memberi Anda "redirect ambigu" juga. periksa juga ejaan Anda

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

misalnya pengalihan ambigu

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag
ghostdog74
sumber
1
Kutipan tidak masalah. Jika ada spasi dalam ekspansi variabel, Anda hanya akan mendapatkan hal-hal yang terjadi pada file yang salah dan / atau pesan kesalahan palsu yang melibatkan bagian post-space dari nama file.
HANYA SAYA PENDAPAT benar
@ JUSTMYcorrectOPINION, shell tidak mem-parsing setelah ekspansi parameter - yang berarti bahwa konten setelah ruang dalam hasil ekspansi tidak dapat menghasilkan bagian sintaks yang berbeda sedang diisi.
Charles Duffy
5

Baru-baru ini saya menemukan bahwa kekosongan dalam nama file pengalihan akan menyebabkan pesan "pengalihan ambigu".

Misalnya jika Anda mengarahkan ulang ke application$(date +%Y%m%d%k%M%S).logdan menentukan karakter pemformatan yang salah, pengalihan akan gagal sebelum pukul 10 pagi misalnya. Namun, jika Anda menggunakannya application$(date +%Y%m%d%H%M%S).logakan berhasil. Ini karena %kformat menghasilkan ' 9'untuk 9AM di mana %Hmenghasilkan '09'untuk 9AM.

echo $(date +%Y%m%d%k%M%S) memberi 20140626 95138

echo $(date +%Y%m%d%H%M%S) memberi 20140626095138

Tanggal yang salah mungkin memberikan sesuatu seperti:

echo "a" > myapp20140626 95138.log

di mana yang berikut ini adalah yang diinginkan:

echo "a" > myapp20140626095138.log
AixNPanes
sumber
Kesalahannya adalah Anda harus memiliki tanda kutip di sekitar variabel, terlepas dari apakah itu berisi spasi. Lihat Kapan membungkus kutipan di sekitar variabel shell?
tripleee
5

Apakah jalur yang ditentukan dalam $ {OUPUT_RESULTS} berisi karakter spasi apa saja? Jika demikian, Anda mungkin ingin mempertimbangkan untuk menggunakan ... >> "${OUPUT_RESULTS}"(menggunakan tanda kutip).

(Anda mungkin juga ingin mempertimbangkan mengubah nama variabel Anda menjadi ${OUTPUT_RESULTS})

Thomas
sumber
1

Saya baru saja mengalami kesalahan ini dalam skrip bash. Masalahnya adalah tidak disengaja \ pada akhir baris sebelumnya yang memberikan kesalahan.

Wayne Workman
sumber
1

Satu hal lain yang dapat menyebabkan "redirect ambigu" adalah \t \n \rdalam nama variabel yang Anda tulis juga

Mungkin tidak \n\r? Tetapi berbuat salah di sisi hati-hati

Coba ini

echo "a" > ${output_name//[$'\t\n\r']}

Saya terpukul dengan yang satu ini saat mem-parsing HTML, Tab \tdi awal baris.

Jim
sumber
Kesalahan tidak mengutip variabel. Lihat Kapan membungkus kutipan di sekitar variabel shell?
tripleee
1

Jika pengalihan skrip Anda berisi variabel, dan badan skrip menentukan variabel itu di bagian yang dilampirkan oleh tanda kurung, Anda akan mendapatkan kesalahan "pengalihan ambigu". Berikut ini contoh yang dapat direproduksi:

  1. vim a.sh untuk membuat skrip
  2. edit skrip yang akan dimuat (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh untuk membuatnya dieksekusi
  4. a.sh

Jika Anda melakukan ini, Anda akan mendapatkan "/home/ubuntu/a.sh: baris 1: $ logit: redirect ambiguous". Hal ini karena

"Menempatkan daftar perintah di antara tanda kurung menyebabkan subkulit dibuat, dan masing-masing perintah dalam daftar dieksekusi dalam subkulit itu, tanpa menghapus variabel yang tidak diekspor. Karena daftar dieksekusi dalam subkulit, penugasan variabel tidak tetap berlaku setelah subkulit selesai. "

Dari Menggunakan tanda kurung hingga grup dan perluas ekspresi

Untuk memperbaikinya, Anda dapat memodifikasi skrip di langkah 2 untuk menentukan variabel di luar tanda kurung: logit="/home/ubuntu/test.log" && (echo "a") >> $logit

enharmonic
sumber
0

jika Anda menggunakan nama variabel dalam perintah shell, Anda harus menyambungkannya dengan +tanda.

sebagai contoh :

jika Anda memiliki dua file, dan Anda tidak akan membuat kode nama file, Anda ingin menggunakan nama variabel
"input.txt" = x
"output.txt" = y

lalu ('perintah shell di dalam tanda kutip' + x> + y)

ini akan bekerja dengan cara ini terutama jika Anda menggunakan ini di dalam program python dengan perintah os.system mungkin

Anusree
sumber
0

Ini mungkin juga terjadi.

Anda belum menentukan file dalam variabel dan mengarahkan output ke sana, maka bash akan melempar kesalahan ini.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

variabel out_file tidak diatur dengan benar jadi perhatikan ini juga. BTW kode ini mencetak semua konten dan nama file-nya di konsol.

Rahul Rajput
sumber
0

Saya mendapat kesalahan ini ketika mencoba menggunakan ekspansi brace untuk menulis output ke beberapa file.

sebagai contoh: echo "text" > {f1,f2}.txt menghasilkan-bash: {f1,f2}.txt: ambiguous redirect

Dalam hal ini, gunakan teeuntuk menampilkan ke banyak file:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

itu 1>/dev/nullakan mencegah teks dari ditulis ke stdout

Jika Anda ingin menambahkan file, gunakan tee -a

spektrum
sumber