Bash betikleri önüne “bash” yazmadan çalışmaz


11

Okulun sistemini, biz yazmadan komut dosyalarını çalıştırmak mümkün olacaktır bashya da cshne olduğunu script type belirtmeden ya da ne var. Ancak Ubuntu'da bash script.bashörneğin yazmam gerekiyor . Bu Ubuntu'da her zaman gerekli mi, yoksa değiştirebileceğim bir ayar mı?


1
yürütülebilir bir dosya olarak ayarlandı mı?
jsolarski

evet, dosya yürütülebilir, bu yüzden sadece kendi başına çalışacağını düşünürdüm.
muttley91

1
./Script yazdığınızda hangi hatayı alıyorsunuz? Komut dosyasının, satırların sonuna fazladan bir karakter yerleştirerek bir Windows düzenleyicisinden değiştirilmediğinden emin misiniz? Bu, komut dosyasının bash ile yürütülmesi gerektiğini gösteren ilk satırı keser.
João Pinto

1
Nasıl başlatırsınız ve hata mesajı nedir?
kullanıcı bilinmiyor

.shBash komut dosyaları için kullanmadığınız için +1 . Yine de dosya uzantıları UNIX dünyasındaki yürütülebilir komut dosyaları için kullanılmaz.
nyuszika7h

Yanıtlar:


17
  1. Komut dosyasını ./scripttam yolla veya başka bir yolla başlattığınızdan emin olun . Sadece scriptolmayabilir işi (o dizin olup olmadığını çalışır $PATHgibi /usr/binUNIX sistemleri üzerinde sizin yolunda geçerli dizini için bir alışkanlık değil çünkü (güvenlik nedenleriyle ve 's iyi!),)

  2. Komut dosyasının yürütülebilir olduğundan emin olun, örneğin: chmod +x scriptçalıştırılabilir hale getirecektir.

  3. #!/bin/bashSenaryonuzda ilk satırın olduğundan emin olun . Ayrıca, bir çeşit Windows editörü ile düzenlenmediğinden emin olun, çünkü bunlar genellikle UNIX'ten farklı olan eol'un (satır sonu) "DOS türünü" kullanır (yukarıdaki kontrol listesi TAMAM ise, "kötü" tercüman: böyle bir dosya veya dizin yok "ya da öyleyse, / bin / bash olsa bile, genellikle yazdırılamaz olarak bunun nedeni budur - bu yüzden genellikle görmezsiniz - \ r tercümanın yolu)

Diğerleri daha önce de bahsetti: /bin/bashbash özelliklerini kullanıyorsanız, aynı zamanda /bin/shsymlinked edildi /bin/bash, ancak şimdi bir gün (fark ettiğim kadarıyla) dashbash uyumluluğu sağlamayacak şekilde işaretlendi, sadece POSIX sh. Oldukça önemli, firmamızdaki oldukça pahalı yazılımların bile bu sorunu var: komut dosyaları #!/bin/shilk satır olarak içeriyor , ancak bash işlevlerine de bağlı.


Bu yüzden onu şu şekilde çalıştırmam gerekecek: ./script, keşfettiğim gibi. Bu her seferinde "bash" yazmak zorunda olmaktan daha iyidir ve mantıklıdır. Bunu daha önce bildiğime inanıyorum, sadece aklımı kaçırdı. Ah, teşekkürler!
muttley91

Teoride geçerli çalışma dizinini PATH değişkenine koyabilirsiniz, böylece "./script" yerine sadece "script" kullanabilirsiniz, ancak sizi uyarıyorum: bu gerçekten UNIX sistemlerinde bir alışkanlık değildir ve bir güvenlik sorunu olabilir ! Ayrıca bir okulda UNIX sistemlerinde hiçbir zaman çözüm bulunmayan bir şekilde bir şeyler öğrenmek hoş değil, bu yüzden bu çözümü önleyeceğim ...
LGB

1
Veya, tercihen, #!/usr/bin/env bashbiraz daha portatiftir.
Sparhawk

4

Dosyanın ilk satırının aşağıdakileri okuduğundan emin olun:

#!/bin/bash

Mesele ise #!/bin/sh, bash'a özgü herhangi bir özellik kullanmamalısınız, sadece POSIX özellikleri kullanmalısınız. /bin/shBir sembolik bağlantı olsa bile bash, bash sh olarak çalıştırıldığında POSIX uyumluluk modunda çalışır ve bazı bash özelliklerini devre dışı bırakır.

Ayrıca, komut dosyasının çalıştırılabilir olduğundan da emin olmanız gerekir.


Hayır, zaten alışkanlıktan kurtulmak için ayarladım.
muttley91

0

Bir alternatif, şiddetle kaçınılmalıdır yolu eklemektedir .için PATH.

PATH=".:$PATH"

veya

PATH="$PATH:."

Bu yaklaşımdaki sorun, önceki durumda, herhangi bir sistem komutunun geçerli dizindeki yürütülebilir dosyalarla geçersiz kılınabilmesi ve ikinci durumda bilinmeyen komutların hala geçersiz kılınabilmesidir.

Aşağıdakileri göz önünde bulundur:

Dosya: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Büyük olasılıkla çok geç olana kadar fark etmeyeceksiniz bile.


1
Kelime seçimi burada biraz yanıltıcı. Komutlar geçersiz kılmayacak. Eğer bir sistem dizinlerde bir yaşam aynı ada sahip olur çalışılan dizindeki bir komut varsa, demek echobu dizin ayarlanır çünkü örneğin, dizinde bir basitçe kullanılacaktır PATHönce değişken /bin. Shell, sıralarına bağlı olarak belirli dizinlerdeki komutları arar PATHve hiçbir şeyi geçersiz kılmaz / yok etmez. Ama evet, bunun etkileri var
Sergiy Kolodyazhnyy
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.