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.
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:
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})
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:
vim a.sh untuk membuat skrip
edit skrip yang akan dimuat (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh untuk membuatnya dieksekusi
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. "
Untuk memperbaikinya, Anda dapat memodifikasi skrip di langkah 2 untuk menentukan variabel di luar tanda kurung: logit="/home/ubuntu/test.log" && (echo "a") >> $logit
${OUPUT_RESULTS}
. Ini juga merupakan kesalahan pengejaan jika Anda maksud$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
satu akan mendapatkan redirect ambigu. Karena bash tidak ingin ada spasi di sekitar=
operator.Jawaban:
Bash terkadang bisa sangat bodoh.
Semua perintah berikut mengembalikan pesan kesalahan yang berbeda untuk kesalahan yang pada dasarnya sama:
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.
sumber
sh -c 'echo hello >/tmp/hello' >/tmp/world
berfungsi dengan baik.Apakah Anda memiliki variabel bernama
OUPUT_RESULTS
atau itu lebih cenderungOUTPUT_RESULTS
?sumber
ABC="junk file.txt"
, ini masih memiliki masalah.beri tanda kutip di sekitar variabel Anda. Jika kebetulan memiliki spasi, itu akan memberi Anda "redirect ambigu" juga. periksa juga ejaan Anda
misalnya pengalihan ambigu
sumber
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).log
dan menentukan karakter pemformatan yang salah, pengalihan akan gagal sebelum pukul 10 pagi misalnya. Namun, jika Anda menggunakannyaapplication$(date +%Y%m%d%H%M%S).log
akan berhasil. Ini karena%k
format menghasilkan' 9'
untuk 9AM di mana%H
menghasilkan'09'
untuk 9AM.echo $(date +%Y%m%d%k%M%S)
memberi20140626 95138
echo $(date +%Y%m%d%H%M%S)
memberi20140626095138
Tanggal yang salah mungkin memberikan sesuatu seperti:
di mana yang berikut ini adalah yang diinginkan:
sumber
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}
)sumber
Saya baru saja mengalami kesalahan ini dalam skrip bash. Masalahnya adalah tidak disengaja \ pada akhir baris sebelumnya yang memberikan kesalahan.
sumber
Satu hal lain yang dapat menyebabkan "redirect ambigu" adalah
\t
\n
\r
dalam nama variabel yang Anda tulis jugaMungkin tidak
\n\r
? Tetapi berbuat salah di sisi hati-hatiCoba ini
Saya terpukul dengan yang satu ini saat mem-parsing HTML, Tab
\t
di awal baris.sumber
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:
vim a.sh
untuk membuat skrip(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
untuk membuatnya dieksekusia.sh
Jika Anda melakukan ini, Anda akan mendapatkan "/home/ubuntu/a.sh: baris 1: $ logit: redirect ambiguous". Hal ini karena
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
sumber
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
ini akan bekerja dengan cara ini terutama jika Anda menggunakan ini di dalam program python dengan perintah os.system mungkin
sumber
Ini mungkin juga terjadi.
Anda belum menentukan file dalam variabel dan mengarahkan output ke sana, maka bash akan melempar kesalahan ini.
variabel out_file tidak diatur dengan benar jadi perhatikan ini juga. BTW kode ini mencetak semua konten dan nama file-nya di konsol.
sumber
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
tee
untuk menampilkan ke banyak file:itu
1>/dev/null
akan mencegah teks dari ditulis ke stdoutJika Anda ingin menambahkan file, gunakan
tee -a
sumber