2015-04-09 18 views
6

echo'u kullanan bir komut dosyasını düzeltmeye çalışıyorum, komut yerine yerleşik komutunu kullanarak bunu nasıl önleyebilirim?Başlamanın yerleşik bir komut kullanmasını nasıl önleyebilirim?

Bunun kullanımını zorlamak için /bin/echo yapabilirim, ancak yolu (sabit disk için) kodlamak istemem.

$ECHO=`which echo` 
$ECHO -e "text\nhere" 

ama which echo getiri:

ben bir şey kullanarak düşünce "yankı: kabuk yerleşik komutu".


Ben @Kenster önerir olarak env kullanan bir echo fonksiyonunu tanımlayan sona erdi ettik. Bu şekilde, komut dosyasında yankılanacak çağrıları değiştirmem gerekmez.

echo() { 
    env echo $* 
} 

# the function is called before the built-in command. 
echo -en "text\nhere" 
+1

'WTF komutu yerine yerleşik komut? – ForceBru

+0

Neden jsut başka bir şey değil? –

+0

@El_Hoy: Sadece merak ediyorum, senaryonun içindeki "echo" kelimesi/bin/echo'dan daha mı kötü? –

cevap

5

env programını kullanın. Env, muhtemelen değiştirilmiş bir ortam ile başka bir program başlatan bir komuttur. Env bir program olduğu için, kabuk yerleşiklerine, takma adlara ve neye sahip olmadığı erişilemez.

komut yolundaki onu ararken, eko programı çalışacak Bu komut: çalıştırırken

$ env echo foo 

Sistem çağrıları izlemek için strace kullanarak doğrulayabilirsiniz echoenv echo vs:

$ strace -f -e trace=process bash -c 'echo foo' 
execve("/bin/bash", ["bash", "-c", "echo foo"], [/* 16 vars */]) = 0 
arch_prctl(ARCH_SET_FS, 0x7f153fa14700) = 0 
foo 
exit_group(0)       = ? 

$ strace -f -e trace=process bash -c 'env echo foo' 
execve("/bin/bash", ["bash", "-c", "env echo foo"], [/* 16 vars */]) = 0 
arch_prctl(ARCH_SET_FS, 0x7f474eb2e700) = 0 
execve("/usr/bin/env", ["env", "echo", "foo"], [/* 16 vars */]) = 0 
arch_prctl(ARCH_SET_FS, 0x7f60cad15700) = 0 
execve("/usr/local/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 
execve("/usr/local/bin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 
execve("/usr/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 
execve("/usr/bin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 
execve("/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory) 
execve("/bin/echo", ["echo", "foo"], [/* 16 vars */]) = 0 
arch_prctl(ARCH_SET_FS, 0x7f0146906700) = 0 
foo 
exit_group(0)       = ? 
+0

Çözümünüzü kullanmaya başladım, ancak uygulamayı basitleştirmek için bir işlev kullanıyorum: echo() {env echo $ *} 'harika çalıştı! – eloyesp

6

Yerleşik echo:

Artık sadece echo anything yapıyor, harici sürümü çalıştıracaktır. Sadece geçerli komut dosyasını etkiler, böylece komut dosyalarınızda güvenle yapabilirsiniz.

+0

Harika, bunu bilmiyordum. 'Enable' yerleşik bir komut mu? Sh'da çalışıyor mu? – eloyesp

+2

'enable', bash'ta yerleşik bir konumdur (tabii ki -n enable'ı etkinleştirmedikçe). POSIX 'sh'da çalışmaz, çünkü POSIX'in harici bir dışsal yapıya dair gerçek bir fikri yoktur. –

+0

“Built in” ve “enable” birlikte çalışırken aklıma gelen ilk şey 'enable -n enable': D. – Samveen

İlgili konular