Kabuk joker karakter genişletmesi durdurulsun mu?


91

Derlenmiş bir komut satırı programının bash veya csh'a parametrelerinde herhangi bir joker karakterin genişletilmesini istemediğini söylemesinin bir yolu var mı?

Örneğin, aşağıdaki gibi bir kabuk komutu istenebilir:

foo *

o karakterin sayısal ASCII değerini döndürmek için.

Yanıtlar:


122

Hayır. Genişletme, komut gerçekten çalıştırılmadan önce gerçekleşir.
Glob'u yalnızca komutu çalıştırmadan önce veya yıldızdan alıntı yaparak devre dışı bırakabilirsiniz.

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *

$ # alternative to set -f
$ set -o noglob
$ # undo it by 
$ set +o noglob

3
ayrıca, genişletecek bir şey yoksa, genişleme de yoktur. yani boş pwd, echo *sadece*
sam boosalis

7
@sam Bu aslında seçeneklerinizin nasıl ayarlandığına bağlıdır. Tldp'den: "Eşleşen dosya adı bulunmazsa ve kabuk seçeneği nullglobdevre dışı bırakılırsa, kelime değiştirilmeden bırakılır. nullglobSeçenek ayarlanmışsa ve hiçbir eşleşme bulunamazsa, kelime kaldırılır."
Chris Middleton

teşekkürler, bunun herhangi bir anlayışla değil, sadece gözlem yoluyla olduğunu nitelendirmeliydim.
sam boosalis

@ c00kiemon5ter Nasıl geri alınır set -f? Öyle mi unset -f?
Nam G VU

1
@NamGVUset +f
Yngvar Kristiansen

63

Bir komutun kendisi globbing'i kapatamayacağı doğru olsa da, bir kullanıcının bir Unix kabuğuna belirli bir komutu globlamamasını söylemesi mümkündür. Bu genellikle bir kabuğun yapılandırma dosyalarını düzenleyerek gerçekleştirilir. Komutun fookomut yolunda bulunabileceğini varsayarsak, aşağıdakilerin uygun konfigürasyon dosyasına eklenmesi gerekir:

Sh, bash ve ksh kabukları için:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}

Csh ve tcsh kabukları için:

alias foo 'set noglob;\foo \!*;unset noglob'

Zsh kabuğu için:

alias foo='noglob foo'

Komut yolunun kullanılması gerekmez. Foo komutunun ~ / bin dizininde depolandığını söyleyin, sonra yukarıdakiler şöyle olur:

Sh, bash ve ksh kabukları için:

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

Csh ve tcsh kabukları için:

alias foo 'set noglob;$home/bin/foo \!*;unset noglob'

Zsh kabuğu için:

alias foo='noglob ~/bin/foo'

Yukarıdakilerin tümü Apple'ın OSX 10.9.2'si kullanılarak test edildi. Not: Yukarıdaki kodu kopyalarken, boşlukları silmeye dikkat edin. Önemli olabilirler.

Güncelleme:

Kullanıcı Geira bir bash kabuk durumunda olduğuna işaret eden

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

ile değiştirilebilir

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

foo fonksiyonuna olan ihtiyacı ortadan kaldırır.

Bu belgeyi oluşturmak için kullanılan bazı web siteleri:


3
OP'nin istediğini yapmanın gerçekten mümkün olduğunu kanıtladığı için bu kabul edilmiş cevap olmalıydı. Bash'deki
geira

@geira: Bazen daha iyi bir cevap gönderilmeden önce cevap kabul edilir. Bunun o davalardan biri olabileceğine inanıyorum. Ayrıca cevabın kullanıcılar tarafından en faydalı olarak sonuçlandığına inanıyorum. Not: Girişinizi cevabıma ekledim.
David Anderson

@geira, OP derlenen programın kabukla iletişim kurmasını ister; Kabuğun komut bazında istenen şekilde davranması için yapılandırılmasının mümkün olduğu cevabı faydalı bir cevaptır ve bunu ben de kabul ediyorum, ancak tamamen yerinde olup olmadığı konusunda fikir birliğine varamıyorum.
Charles Duffy

O gerçeği edebilirsiniz yapılması o anlamına gelmez gerektiğini yapılabilir. Kabuğun davranışının kullanıcının belirli komutlara yönelik makul beklentisinden farklı olması şaşırtıcı ve sonuçta istenmeyen bir durum gibi görünmektedir.
üçlü

@tripleee: İnsanların röle ve vakum tüpleri beklediği bir zaman vardı. Karton kartlarda ve kağıt bantta açılan delikler olması bekleniyordu. İnsanlar hesap makineleri ve telefonlar yerine slayt kurallarına sahipti. Sanırım sizin için bu arzu edilir. O zamanlar pek umursamadım. Sırada ne olduğunu görmekten zevk alıyorum.
David Anderson

8

Genişletme, programınız çalıştırılmadan önce kabuk tarafından gerçekleştirilir. Programınız, genişlemenin gerçekleşip gerçekleşmediğine dair hiçbir fikre sahip değil.

   set -o noglob

çağıran kabuktaki genişletmeyi kapatır, ancak programınızı çalıştırmadan önce bunu yapmanız gerekir.

Alternatif, argümanlarınızdan alıntı yapmaktır, örneğin

foo "*"

4
setopt, zsh'ye özgü bir komut gibi görünüyor. Başka bir posterin dediği gibi, bash set -o noglobiçin joker karakter genişletmeyi devre dışı bırakmak için kullanırsınız .
Wirawan Purwanto

Şimdi değiştirildi. Teşekkürler
Brian Agnew

1

Dikkat: maskeyle eşleşen isim yoksa, bash argümanı olduğu gibi, genişletmeden geçirir!

Proof (pa.py, sadece argümanlarını yazdıran çok basit bir komut dosyasıdır):

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']

3
Her zaman değil. set -o nullglobveya shopt -s failglob, ve bu davranış değişecektir (çok farklı iki şekilde).
Charles Duffy
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.