Neden bash net bir şekilde var olan Masaüstü klasörümü bulamıyor?


1

Muhtemelen aptalca / apaçık yanlış bir şey yapıyorum, ama kıvrımlı bir betiğe girip OS X'deki Terminal'de çalıştırmaya çalışıyorum. Bunu yapmak için kullandığım komut:

sh -s stable < <(curl -L http://path_to_my_script/)

Bu, kusursuz bir şekilde doğru çalışıyor gibi görünüyor; ancak, indirilen komut dosyasındaki ilk satır çalışmıyor. Bazı nedenlerden dolayı "cd ~ / Desktop" "Böyle bir dosya veya dizin yok" hatasına neden oluyor. Masaüstümün var olduğundan eminim ve bu komut el ile çalıştırdığımda çalışıyor. Sorunu teşhis eden ilk satır olarak "ls" yazmayı denediğimde, komutu bile tanımıyordu. "Cd" ve "ls" gibi komutların düzgün çalışması için yapmam gereken bir şey var mı?

Yardım için teşekkürler!

EDIT: Sorunu curl ile ilgisi var gibi görünmüyor, sanki betiği "file.sh" içine indirip çalıştırdıktan sonra "sh file.sh" dosyasını çalıştırdım, aynı hataları alıyorum.

EDIT: İşte çalıştırmaya çalıştığım betiğin tam içeriği:

#!/bin/bash
ls
cd ~/Desktop
curl https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg -o chrome.dmg
hdiutil attach chrome.dmg
cp "/Volumes/Google Chrome/Google Chrome.app" "~/Desktop/chrome.app"
hdiutil detach chrome.dmg
rm chrome.dmg
open -a chrome.app --args --make-default-browser --disable-instant-extended-api --    install-from-webstore="chrome-rdp/cbkkbcmdlboombapidmoeolnmdacpkch"
osascript 'tell application "System Preferences"
    activate
    set the current pane to pane id "com.apple.preference.mouse"
end tell'

Bununla aynı hatayı mı alıyorsunuz? kıvırmak -L path_to_my_script | sh-s
ed.

@ed. Hayır Bununla ilgili bir hata almıyorum, ancak komut dosyasını da çalıştırmıyor. Komutu tek bir komutla çalıştırmak istiyorum, böylece sadece komutu ezberleyebilir ve herhangi bir makineden çalıştırabilirim.
Hayden Schiff

Lütfen bize çalıştırmaya çalıştığınız komut dosyasını gösteriniz. Bu tür şeyler genellikle çevresel değişkenlere bağlıdır ve bize ne yapmaya çalıştığınızı söylemezseniz neyin yanlış gittiğini bilmek zordur. Komut dosyanızın yalnızca bir metin dosyası olması echo "Hello World!"doğru mu?
terdon

Tamam, bu garip. Yalnızca bu satırı içeren basit komut dosyası ile deneyebilir misiniz: echo "~/Desktop is : $(echo ~/Desktop)"? Dosyada başka hiçbir şey olmadığından emin olun, sadece bu tek satır. Ayrıca farklı bir terminal emülatörü kullanmayı da deneyin xterm. Terminal.app, varsayılan olarak oturum açma kabukları başlatır ve bu durum karmaşık hale gelebilir (gerçekten nasıl olduğunu bilmeyin ama asla bilmiyorsunuz).
terdon

Gerçekten eğer mümkünse komut dosyalarını doğrudan bir web sunucusundan çalıştırmaktan kaçınmalısınız. Kötü bir şey olma şansı oldukça yüksek görünüyor.
Zoredache

Yanıtlar:


2

Sorunun kökünü yeni keşfettiğime inanıyorum. TextWrangler'ı, görünüşe göre kullanmakta olduğu Windows stili satır sonları (CRLF) yerine Unix stili satır sonları (LF) ile kaydetmeye zorlayarak, tüm sorunları düzelttiğimi düşünüyorum; Sanırım sıkıntıları vardı çünkü "set" yerine "set \ r", "ls" yerine "ls" r komutunu çalıştırmaya çalışıyordu. Yapmam gereken tek şey, 'tr' komutunu tüm satırbaşı karakterlerini kıvrık çıktısından çıkarmak için kullanmak gibi görünüyor (görünüşe göre Pastebin CRLF satır sonları kullanıyor). Herkese yardım ettiğiniz için teşekkürler!


1
Bu komut ilk satır olarak çıkıyor ortak sorunu gibi bir çok şey var #!/bin/bash^Mziyade #!/bin/bash. :)
Hennes

Bu gelecek için akılda tutulması gereken iyi bir şey.
MariusMatutiae,

0

$ / Yerine $ HOME denediniz mi?
(Bir üne eklenmediğim için yorum eklenmedi>> 50)
Ayrıca, bir ls vb. Yaparak ve ne yazdığını görerek sorun giderebilirsiniz ('ls değilse' çalışın, sonra '/ bin / ls' deneyin ...) 'set' en sevdiğim komutlardan biri ... o zaman PATH'inizin ne olduğunu görebilirsiniz.


$ HOME'a geçmek sorunu çözmez ve "ls" yerine "/ bin / ls" yazmak başka bir "Böyle bir dosya veya dizin yok" hatasına neden olur.
Hayden Schiff

Çalışan bir şey bul ('ls' ve '/ bin / ls' anlamına geliyorsa, bu hatayı verdiyseniz ya da '/ bin / ls ~ / Desktop' size bu hatayı verdi ise belirsizdir. 'set' kabuğun içine yerleştirilmiştir. İşe yaramadığında daha büyük problemlerin var
9mjb

Aynı zamanda "<boşluk <(komut)" olması biraz garip görünüyor. Neden sadece "<(command)" değil. Onlar aynı, ama biraz garip görünüyor. Aldığınızı düşündüğünüz şeyi elde edip etmediğinizi görmek için "echo <(command)" ve "cat <(command)" kullanmayı deneyebilirsiniz.
9mjb

İki format arasındaki farkın alakasız olduğunu düşünüyorum çünkü "bash file.sh" ile betiği başlattığımda bile hatam oluyor. Ve "/ bin / ls" i başka bir şey olmadan tek bir satırda bulduğumda hata aldım. Ve işte komut dosyasını "ls" satırının üstüne eklenen "set" satırıyla çalıştırmanın sonucudur: image . (sonraki komutlarla hataları görmezden geldim; henüz bunlara ulaşmadım ve bu noktada önemli değiller).
Hayden Schiff

Bu "komut bulunamadı" hatası aslında "komut 2'de bulunmadı" diyor: "orada basılamaz karakter alıyorsanız (setin Windows'tan döndürdüğü gibi)" belki "od -c <(command)" komutunu deneyin. indirilen dosyanızdaki tüm tek karakterleri görmek için
9mjb

0

Asıl betiğinizi (ipucu, ipucu) görmeden söyleyemem ama shbunun yerine kullanmanızın bir nedeni var bashmı? En modern sistemlerinde shbir (farklı kabuk link aslında dashörneğin) ve olmasa bile, çağıran basholarak sh(onun davranışını değiştirir man bash):

   If  bash  is  invoked  with  the name sh, it tries to mimic the startup
   behavior of historical versions of sh as  closely  as  possible,  while
   conforming  to the POSIX standard as well.  When invoked as an interac
   tive login shell, or a non-interactive shell with the  --login  option,
   it  first  attempts  to read and execute commands from /etc/profile and
   ~/.profile, in that order.  The  --noprofile  option  may  be  used  to
   inhibit  this  behavior.  When invoked as an interactive shell with the
   name sh, bash looks for the variable ENV, expands its value  if  it  is
   defined,  and uses the expanded value as the name of a file to read and
   execute.  Since a shell invoked as sh does not attempt to read and exe
   cute  commands from any other startup files, the --rcfile option has no
   effect.  A non-interactive shell invoked with  the  name  sh  does  not
   attempt  to  read  any  other  startup files.  When invoked as sh, bash
   enters posix mode after the startup files are read.

Bu nedenle, hiçbir başlangıç ​​dosyası okunmaz ve çevresel değişkenleriniz beklediğinizden farklı olacaktır. Koşmayı dene

bash <(curl -L http://path_to_my_script/)

Ne stableiçin bulunduğunu ve -sseçeneğin gerekmediğini bilmiyorum, argümanlar olmadan otomatik olarak devreye giriyor:

   -s        If the -s option is present, or if no arguments remain  after
             option  processing,  then commands are read from the standard
             input.  This option allows the positional  parameters  to  be
             set when invoking an interactive shell.

Aslında "sh -s kararlı" yerine "bash" yapmıştım, ama sorun yaşadığımda belki yanlış bir kabuk kullandığımı düşünerek bazı şeyleri değiştirmeye çalıştım ("ahır" da benim için anlam ifade etmiyordu, ama bu kullandım ve fikirlerin dışındaydım) Tekrar "bash" a geçmek sorunları çözüyor gibi görünmüyor. Ve tamam, şimdi tam senaryoyu orijinal soruya ekleyeceğim.
Hayden Schiff
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.