Adam sayfasını yanlış yorumluyorsun. Öncelikle, --
seçeneklerin sonunu işaret etme kısmı ne yapmaya çalıştığınızla alakasızdır. -c
Geçersiz kılar o yani hiç bash opsiyonu işleme yoluyla artık gidiyor yani o bu noktadan sonra komut satırına geri kalanı --
komutlarına aktarılır olacağını, seçenekler işaretleyici bir sonu olarak bash tarafından işlenmez.
İkinci hata, ekstra argümanların başlatılan kabuk işlemine konumsal parametreler olarak atandığı, komuta argüman olarak geçirilmediğidir. Yani, yapmaya çalıştığınız şey şunlardan biri olarak yapılabilir:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
İlk durumda, parametrelerin yankılanması $0
ve $1
açıkça ve ikinci durumda, "$@"
"$ 0 dışındaki tüm konumsal parametreler" kadar normal bir şekilde genişletmek için kullanılması . Bu durumda, $0
aynı zamanda kullanılacak bir şeyden geçmek zorunda olduğumuzu unutmayın ; $0
Normalde olacağı için “bash” ı seçtim , ama başka bir şey işe yarayacaktı.
Bu şekilde yapıldığında, doğrudan listelediğiniz komuta doğrudan verdiğiniz herhangi bir argümanı iletmek yerine: dökümantasyonun "komut s dizeden okunur " yazdığını not edin , çoğul. Başka bir deyişle, bu şema yapmanıza olanak sağlar:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Ama, not orijinal hedefe ulaşmak için daha iyi bir yolu kullanmak olabileceğini env
yerine bash
:
/usr/bin/env -- "ls" "-l"
Bir kabuğun sağladığı özelliklerden hiçbirine ihtiyacınız yoksa, kullanmak için hiçbir neden yoktur - env
bu durumda, daha hızlı, daha basit ve daha az yazı yazmanız gerekir. Ve kabuk metacharacters veya boşluk içeren dosya adlarını güvenle işleyeceğinden emin olmak için zor düşünmek zorunda değilsiniz.