Bir Komut Dosyası Çalıştırırken Neden [[: bulunamadı?)


15

Bir dosya olup olmadığını kontrol etmek zorunda olan bir komut dosyası yazmaya çalışıyorum. Konsolda yazıyorum

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

ve anladım

not mod

ama aynı şeyi yapmak için bir senaryo yazdığımda:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

ve sonra komut dosyasını yürütmek, bunu elde:

./ex.sh: 2: [[: not found
mod

Komut dosyasını geçerli dizine kaydedip ex.sh olarak adlandırdım, sonra çalıştırılabilir olduğundan emin oldum. Komut dosyasını çağırmak için şunu yapıyorum:

./ex.sh

Bu sorunu neden alıyorum? Zaten birçok şey denedim:

if [ -a /home ...

ve

if test -a /home ...

İkisi de geri döndü

13: -a: unexpected operator

Çalışmasını başardım, ancak bunun için ilk satırı (#! / Bin / sh) kaldırmak zorunda kaldım. Bunun neden olduğunu biliyor musunuz?
Buzu

deneyin#!/bin/bash
kev

merhaba kev, bunu ben de serbest bıraktım. Sorumu yeni güncelledim. Bunun için çok fazla zaman harcadım, ama çözebildiğime sevindim. Cevabınız için teşekkürler. Gerçekten de sorunun çözümü budur.
Buzu

@Kev Lütfen bir cevap olarak gönderin
slhck

Buzu, @Kev - bir cevap bulursanız, aşağıdaki cevap olarak gönderin , soruyu düzenlemeyin.
user1686

Yanıtlar:


10

Sen için yazılmış bir senaryo çalıştıran bash altında sh uzatılmış sözdizimi özelliklerinin çoğunu yoksun, - [[bir olan bashyerleşik komutu ve kullanılamaz sh.

Değişim #!/bin/shiçin #!/bin/bashveya #!/usr/bin/env bash.


Bazı sistemlerde /bin/shbir sembolik bağlantıdır /bin/bash. Ve varsaymak muhtemelen makul güvenli basholduğunu /bin/bash.
Keith Thompson

@Keith: /bin/bashÇoğu Linux sisteminde, ancak BSD'lerde /usr/pkg/bin/bashveya /usr/local/bin/bashdoğrudan kaynaktan derlenmişse.
user1686

@grawity: Veya kaynaktan derlerseniz başka bir yere koymaya karar verirseniz. Tamam, iyi bir nokta. Şahsen, her sistem için /usr/bin/envkesimi ( şu anda basharayanlarda olanı kullanan) kesmek yerine YMMV'yi tercih ederim $PATH. (Ve /bin/bashbir symlink yapabilirsiniz - yönetici haklarına sahipseniz ve uğraşmak istemiyorsanız /bin.)
Keith Thompson

@Keith: /usr/localautotools'un varsayılan olarak koymaya karar verdiği yerdir. Bildiğim kadarıyla "kişisel" gider, ben birkaç farklı sunucuları ve VM'leri aynı betik / araç deposundan almak gibi, ve her taahhütten sonra yarısında shebangs yeniden düzenlemek gerekmez.
user1686

hiçbiri benim için çalıştı: / im on centos
astroanu

0

Komut dosyasını çalıştırırken sh yerine bash değerini belirtin. Şahsen onlar ubuntu 12.10 altında farklı olduğunu fark ettim:

bash script.sh arg0 ... argn

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.