"Belirsiz yönlendirme" hatası alma


173

Bash betiğimdeki şu satır

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

bana şu hatayı veriyor:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Neden?


10
hepsini göstermiyorsun. nereden buldun ${OUPUT_RESULTS}. Eğer demek istiyorsan onun da bir yazım hatası$OUTPUT_RESULTS}
ghostdog74 17:10

eğer biri OUPUT_RESULTS = "filename.log"yazmışsa belirsiz bir yönlendirme elde edilir. Çünkü bash =operatörün etrafında NO SPACE istemiyor .
Poutrathor

Yanıtlar:


269

Bash bazen oldukça geniş olabilir.

Aşağıdaki komutların tümü temelde aynı hata için farklı hata iletileri döndürür:

$ 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

Değişkenin etrafına tırnak eklemek, "belirsiz yönlendirme" iletisiyle başa çıkmak için iyi bir yol gibi görünüyor: Yazma hatası yaptığınızda ve hatanın dosya adındaki boşluklardan kaynaklandığı durumlarda daha iyi bir mesaj alma eğilimindesiniz , tırnak kullanmak düzeltmedir.


1
Ayrıca, yönlendirmeler içeren bir komut dosyasının çıktısını yeniden yönlendirirseniz de alırsınız. Bana bunu nasıl bildiğimi sorma.
Paul Jackson

@ PaulJackson, ... bu doğru değil. Kopyalanabilir ve yapıştırılabilir bir gösterici olarak: sh -c 'echo hello >/tmp/hello' >/tmp/worlddüzgün çalışır.
Charles Duffy

24

Adında bir değişkeniniz var mı yoksa OUPUT_RESULTSdaha olası OUTPUT_RESULTSmı?


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$ 

2
Eğer senin ABC="junk file.txt", bu hala sorun olurdu.
Charles Duffy

15

değişkeninize tırnak işareti koyun. Alanların olması durumunda size "belirsiz yönlendirme" de verir. ayrıca yazımınızı kontrol edin

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

örneğin belirsiz yönlendirme

$ 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

1
Alıntılar önemli değil. Değişken genişlemede boşluklar varsa, sadece yanlış dosyaya giden şeyleri ve / veya dosya adının boşluk sonrası bölümünü içeren sahte hata mesajlarını alırsınız.
SADECE benim doğru GÖRÜŞÜM

@JUSTMYcorrectOPINION, kabuk, parametre genişletmelerinden sonra yeniden ayrışmaz - bu, genişletme sonuçları içindeki boşluktan sonraki içeriğin farklı bir sözdizimi parçasının doldurulmasına neden olamayacağı anlamına gelir.
Charles Duffy

5

Son zamanlarda yönlendirme dosyası adındaki boşlukların "belirsiz yönlendirme" iletisine neden olacağını buldum.

Örneğin, yönlendirme yapar application$(date +%Y%m%d%k%M%S).logve yanlış biçimlendirme karakterleri belirtirseniz, yönlendirme örneğin sabah 10'dan önce başarısız olur. Eğer kullandıysanız application$(date +%Y%m%d%H%M%S).log, başarılı olur. Bunun nedeni %kbiçim verim ' 9'9 am için nereye %Hverimleri '09'9 am için.

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

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

Hatalı tarih aşağıdaki gibi bir şey verebilir:

echo "a" > myapp20140626 95138.log

burada ne istenir:

echo "a" > myapp20140626095138.log

Hata, boşluk içerip içermediğine bakılmaksızın, değişkenin etrafında tırnak işareti bulundurmanızdır. Bkz. Tırnaklar ne zaman bir kabuk değişkeni etrafına sarılır?
üçlü

5

$ {OUPUT_RESULTS} içinde belirtilen yol boşluk karakteri içeriyor mu? Öyleyse, ... >> "${OUPUT_RESULTS}"(tırnak işaretlerini kullanarak) kullanmayı düşünebilirsiniz .

(Değişkeninizi yeniden adlandırmayı da düşünebilirsiniz ${OUTPUT_RESULTS})


1

Bir bash betiğinde bu hatayı yaşadım. Sorun, önceki satırın sonunda hata veren bir \ 'rastlantısaldı.



1

Komut dosyanızın yönlendirmesi bir değişken içeriyorsa ve komut dosyası gövdesi bu değişkeni parantez içine alınmış bir bölümde tanımlıyorsa, "belirsiz yönlendirme" hatası alırsınız. İşte tekrarlanabilir bir örnek:

  1. vim a.sh senaryo oluşturmak için
  2. içerilecek komut dosyasını düzenle (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh çalıştırılabilir yapmak için
  4. a.sh

Bunu yaparsanız, "/home/ubuntu/a.sh: line 1: $ logit: belirsiz yönlendirme" alırsınız. Bunun nedeni ise

"Parantezler arasına bir komut listesi yerleştirmek, bir alt kabuğun oluşturulmasına neden olur ve listedeki komutların her biri, dışa aktarılmayan değişkenleri kaldırmadan bu alt kabukta yürütülür. Liste bir alt kabukta yürütüldüğünden, değişken atamaları kalmaz alt kabuk tamamlandıktan sonra yürürlüğe girer. "

Gönderen ifadeleri grubuna parantez kullanma ve genişletmek

Bunu düzeltmek için, parantez dışındaki değişkeni tanımlamak üzere 2. adımdaki komut dosyasını değiştirebilirsiniz: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

shell komutunda bir değişken adı kullanıyorsanız, bunu +işaret ile birleştirmelisiniz .

Örneğin :

iki dosyanız varsa ve dosya adını sabit olarak kodlamayacaksanız, bunun yerine değişken adını kullanmak istersiniz
"input.txt" = x
"output.txt" = y

sonra ('tırnak içinde kabuk komutu' + x> + y)

özellikle os.system komutuyla bir python programı içinde kullanıyorsanız, bu şekilde çalışacaktır.


0

Bu da geçerli olabilir.

dosyayı bir değişken içinde belirtmediniz ve çıktıyı ona yönlendiriyorsunuz, sonra bash bu hatayı atar.

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

out_file değişkeni doğru ayarlanmadığından buna da dikkat edin. BTW bu kod konsoldaki tüm içeriği ve dosya adını yazdırıyor.


0

Birden çok dosyaya çıktı yazmak için küme ayracı genişletmeyi kullanmaya çalışırken bu hatayı aldım.

Örneğin: echo "text" > {f1,f2}.txt sonuçları-bash: {f1,f2}.txt: ambiguous redirect

Bu durumda, teebirden fazla dosyaya çıktı almak için kullanın :

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

1>/dev/nullyazılmadan metin önleyecektir Stdout'a

Dosyalara eklemek istiyorsanız şunu kullanın: tee -a

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.