2011-05-19 2 views
13

Bir süredir RVM kullanıyorum ve her seferinde kopyalamak için aşağıdaki komutu kopyaladım ve yapıştırdım:Bu sözdizimini herkes açıklayabilir mi?

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) 

Tam olarak sözdizimini anlamadım ve neden çift ​​< ve parantez gerekir. Birisi bunu açıklayabilir mi, yoksa doğru referansı mı işaret edebilir?

+1

Bunun sadece bir neden olmaması için bir neden var mı: "curl -s ... | bash"? Aşırı özellikli sürünme örneğine benziyor. –

+0

@William Pursell: Sürümünüz ile bu sürüm arasındaki davranışta bir fark bilmiyorum. – Daenyth

cevap

13

Birincisi, giriş yönlendirmesidir. Bir dosyanın içeriğini giriş olarak programa besler. İkinci yapı <()'dur ve işlem yeniden yönlendirmesidir: bir işlemin çıktısını bir dosya gibi ele alır. Bu durumda, bu url'nin içeriğini bash betikmiş gibi çalıştırırsınız - çok tehlikeli! Tamamen kaynak yapmaya güvenmiyorsanız, bunu yapma. Saldırgan, sisteminizi tehlikeye atacak komutları çalıştırmak için bu yöntemi kullanabilir.

+2

Özellikle güvenlik sorununu bildirirken iyi yanıt. – Mattis

+0

Bu özellik hakkında bilgi edinmek için şunu deneyin: 'echo <(id)' Sistemin nasıl uygulandığını ve nasıl kötüye kullanılabileceğini size bir fikir verecektir (ör. 'Dd if = <(foo'ya bakın)' cp <(foo'ya bakın)/tmp/x' vb. –

2

Sadece 2 sent. @Daenyth, "bir dosya gibi bir işlemin çıktısını ele alır" ifadesinin Bashs yapısı <(). Bu yapı çok kullanışlı olabilir. Sadece aşağıdakileri dikkate alın:

diff <(ls dir1) <(ls dir2) 

Bu dizin1 ve dir2 içerikleri arasındaki farkları göstermek için vimdiff kullanacaktır. Bunun yerine vimdiff kullanarak diff daha da serinleyecektir.