Neden “satır 1: $ ': \ r': komut bulunamadı” alıyorum?


13

Dizüstü bilgisayarımda (DOS) Cygwin kullandım. Meslektaşlarımdan ve kendi arkadaşlarımdan bir senaryo koleksiyonum var. BT uzmanı değilim, Unix'te bilgili değilim. Meslektaşlarımın söz dizimini takip ediyorum ve birkaç basit şeyi yönetebiliyorum.

Komut dosyaları eski dizüstü bilgisayarımda iyi çalıştı. Dizüstü bilgisayarı yeni değiştirdim, Cygwin'i yükledim. Senaryolarımı çalıştırdığımda çalışmıyorlar. Aldığım hata mesajının bir örneği:

line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi

İşte senaryomun ilk 5 satırı

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

Birisi lütfen bu sorunu nasıl çözebileceğimi açıklayabilir mi?

Yanıtlar:


29

Windows stili satır sonlarınız var.

İşlem yok komutu :, olduğu gibi okunur :<carriage return>, olduğu gibi :\rveya daha fazla görüntülenir $':\r'.

Koş dos2unix scriptnameve iyi olmalısın.


Eğer yoksa dos2unix, aşağıdakiler hemen hemen her yerde çalışmalıdır (ve Windows'ta MobaXterm üzerinde test ettim):

vi -b filename

Sonra şunu viyazın:

:%s/\r$//
:x

Gitmek güzel.


In vimiçin Cygwin kullanarak budur, vibunun yapmanın birden çok yolu vardır. Bir diğeri, fileformatdeğerleri alabilen ayarı içerir dosveya unix. Dosyayı yükledikten sonra açıkça değiştirin

set fileformat = unix
veya dosyayı yazarken dosya biçimini

: w + dosya formu = unix

Bununla ilgili daha fazla bilgi için, bu konuyu kapsayan, aşağıdakiler de dahil olmak üzere birçok soru ve cevaba bakın:


Sadece açıklığa kavuşturmak istiyorum, "iter = 1" benim modeli daha sonra satır 5 ötesinde tekrarlamak zorunda olacak bir matematik algoritması mermi sayısı için kullanılacak sayacı olduğunu. hata mesajı. Tüm yorumlar ve talimatlar büyük beğeni topluyor !!
TPham

Ben sadece önerilen "$ tr -d ....." komutunu denedim ama dizüstü bilgisayarımla ilgili bir sorun var. "$" Değerine geri dönmez, bunun yerine ekranda ">" görünür. Çıkmak için C kontrolünü kullanmalıyım. Sonra, sorunun çözülüp çözülmediğini görmek için komut dosyasını test ettim, ama hala orada. Üzgünüm, bu alandaki bilgilerim çok az! Çalışma koleksiyonumda çok yardımcı oldukları için senaryo koleksiyonumu kullanmaya çalışıyorum. Sabırlı ve bana yardımcı olduğun için herkese teşekkürler.
TPham

@TPham, bkz. Düzenleme. Bu işe yararsa, cevabı "kabul etmek" için yanındaki onay işaretini kullandığınızdan emin olun. ( Hangi
Wildcard

1
Kelimeler olan komutlar, bir acemi için neredeyse tamamen noktalama olan gizemli bir büyülekten daha karmaşık değildir. Bunun ayrı bir cevaba ihtiyacı yoktur. Bu cevaba vim, bunu kelimelerden birini kullanan iki şekilde yapabileceğinden bahsetmek yeterlidir . Ya da daha iyisi, bu alt görevin burada yeni başlayanlar için unix.stackexchange.com/questions/88811 dahil olmak üzere bu sayfadaki herhangi bir yanıttan çok daha ayrıntılı bir şekilde nerede yanıtlandığını göstermek için.
JdeBP

1
Not vi -b, \rvim uzantıları zaten vardır. POSIX değil, nvi değil, elvis, Solaris vi ...
Stéphane Chazelas

10

Bunun nedeni, komut dosyasının DOS satır sonlarını kullanan bir düzenleyici tarafından kaydedilmiş olmasıdır (örneğin Notepad ++ gibi). Bunları komut dosyalarınızdan kaldırmanız gerekir.

Bunu yapmak dos2unixiçin, komut dosyasında kullanın veya

$ tr -d '\r' <script >script.new && mv script.new script

(bu , komut dosyasının herhangi bir yerinden tüm satır başlarını kaldırır )


Koddaki koda gelince:

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

Bu muhtemelen

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

Bu 1.txt, varsa dosyayı geçerli dizinden kaldırır . :Komut hiçbir şey yapmaz (neredeyse) ve kaldırılabilir. iterDeğişkenin değeri olarak kullanılmalıdır $iterve verilemeyecek. Ve sonra muhtemelen ./dosyanın geçerli dizinde bulunması gerektiğini söylemek için gerekenden daha açık olmak .

Eğer bir döngü çevirmeye planlıyorsanız (tüm dosyaları silerek, burada 1.txt, 2.txt, ..., 10.txt):

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

Veya sinsi / tembel hissedersek,

rm -f {1..10}.txt

brace genişlemesini anlayan kabuklarda.


3
Notepad ++ aslında Windows / Mac / Linux satır sonlarını kullanma seçeneğine sahiptir. Sadece Düzenle menüsüne ve ardından EOL Dönüştürme-> Unix'e (LF) gitmeniz gerekir. Ya da sadece sağ alt köşesinde söylediği yere çift tıklayabilir Windows (CR LF)ve bunu değiştirebilirsinizUnix (LF)
jesse_b

Talimatınız için herkese teşekkürler. Açıklığa kavuşturmak istiyorum: "iter = 1", daha sonra ana
hedefim için

@TPham Bir şey değil. Sadece sıkıldım ve kodunuzu aldım ve zihnimin onunla izlenimci olmasına izin verdim.
Kusalananda

Veya rm -f [1-9].txt 10.txt. Ama bu değil tamamen hiçbir dosya yokmuş gibi, mantıksal olarak eşdeğer 1-9 ama orada olduğunu anlamıyla adlı bir dosya [1-9].txtdaha sonra silinecektir. : D
Wildcard

5

Komut dosyalarınızın satır sonları yanlış. Windows CR + LF (\ r \ n), Unix LF (\ n) ve Klasik MacOS CR (\ r) kullanır. Etkilenen tüm dosyalardaki satır sonlarını bir metin düzenleyici veya benzeri bağımsız bir araçla değiştirmeniz gerekir dos2unix.

SVN gibi FTP ve sürüm kontrol sistemleri, satır sonlarını uygun bir şekilde dönüştürme eğilimindedir, bu nedenle gelecekte dosya aktarmak için bu seçeneklere bakmak isteyebilirsiniz.

Bu dosyalar halinde değil transfer, ama sadece tek bir makinede kullanılan, o zaman tercih metin editörü satır sonları için ayarları bulmak istersiniz. "Programcılar için" olarak ilan edilen çoğunun böyle bir seçeneği olacaktır.


Yardımlarınız için herkese teşekkürler. Ben sadece dos2unix denedim ama ben yok gibi görünüyor. Arayacak ve tekrar deneyecek.
TPham

3

Tamamlayıcı bir cevap olarak birkaç not / ipucu eklememe izin verin ...

İlk olarak, normal metin dosyaları için filekomutu kullanarak Unix veya DOS satır sonu olup olmadığını kolayca belirleyebilirsiniz . Örneğin:

$ file test.txt
test.txt: ASCII text, with CRLF line terminators
$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format...
$ file test.txt
test.txt: ASCII text

Kullanımımı not et dos2unix. Yüklemenizi kesinlikle tavsiye ederim. Cygwin'i nasıl kullandığınıza bağlı olarak, bu dönüşümü kolaylık sağlayacak kadar sık ​​sık yapmanız gerekebilir. Daha da önemlisi, burada tartışılan manuel düzenlemelerle karşılaştığınız gibi bir hata olasılığı yoktur.

Yüklemek için ana Cygwin yürütülebilir dosyasını başlatın. Bu, setup-x86_64.exe gibi adlara sahip olan veya bu satırlardaki bir şeydir. Bunun gibi bir ekran gördüğünüzden emin olun:

resim açıklamasını buraya girin

Zaten birincil yapmış beri tıklayarak gerekir yüklemek İleri'yi Seçim ekranı elde edene kadar tüm yol. Açılır menüden Tam'ı seçin ve arama kutusuna "dos2" yazın ve burada gösterildiği gibi aracı seçin:

resim açıklamasını buraya girin

Ardından İleri tekrar Yükleme tamamlandıktan edelim. Bu kadar. İyi eğlenceler. Cygwin, bu ara sıra rahatsızlık dışında, harika bir paket.


Talimatınız için çok teşekkür ederiz B Katman! Bu Stack Exchange grubu çok faydalıdır. Bu desteği gerçekten takdir ediyorum.
TPham

1

Dos2unix değilse, 'flip' de vardır

$ flip -u dosya adınız.txt

unix satır sonlarını kullanarak çevirir.


1

WinSCP ile sunucuya bağlanarak bash (.sh) komut dosyalarımı düzenlemek için Notepad ++ kullanıyorum (WinSCP editörünü Notepad ++ için ayarlamak için: https://winscp.net/eng/docs/ui_editor_preferences )

Bu, " Vim " editörü yerine düzenlemek / kaydetmek üzere sunuculardan dosya açmak için çok pratiktir .
Dosyayı Notepad ++ ile açtığınızda, alttaki durum çubuğundaki 7. sütuna çift tıklayın ve " Unix (LF) " seçeneğini seçin .

resim açıklamasını buraya girin

Ayrıca, üstteki çubuktaki UTF-8'de Kodlama -> Kodlama ile 8. olanı değiştirmeniz gerekir.


0

Cygwin's Bash'in Mac ve Windows satır sonu kodlamaları ile mutlu bir şekilde çalışması için gerçek dosyanın satır kodlamasını değiştirmeniz gerekmez. Sadece çevirmen gereken bir seçenek var.

Sadece Güncellemenizi ~/.bash_profileiçerdiği yüzden

export SHELLOPTS
set -o igncr

Bkz. Https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html

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.