Kabuk geçerli işlev adı karakterleri


13

Genişletilmiş Unicode karakterleri kullanmak (şüphesiz) birçok kullanıcı için yararlıdır.

Daha basit mermiler (kül (meşgul kutusu), çizgi) ve ksh aşağıdakilerle başarısız olur:

tést() { echo 34; }

tést

Ama , , ve buna izin veriyor gibi görünüyor.

POSIX geçerli işlev adlarının bu Adlar tanımını kullandığını biliyorum . Bu şu normal ifade anlamına gelir:

[a-zA-Z_][a-zA-Z0-9_]*

Bununla birlikte, ilk linkte ayrıca söylenir:

Bir uygulama, işlev adındaki diğer karakterlerin uzantı olarak kullanılmasına izin verebilir.

Sorular:

  • Bu kabul edildi ve belgelendi mi?
  • Nerede?
  • Hangi mermiler için (varsa)?

İlgili sorular:
Kabuk işlevi adında özel karakterler kullanmak mümkün mü?
İşlev adlarında meta karakterler (>) kullanmak istemiyorum.

Upstart ve bash fonksiyon isimlerini içeren “-”
Bir operatörün (çıkarma "-") bir adın parçası olması gerektiğine inanmıyorum.


Eğer bulabileceği aliasbiraz daha hoşgörülü olmaktır. ve böylece işlevi uygun, düğmeli bir adla yazabilir ve daha sonra işlevi çağırmak için daha şık adlandırılmış bir takma ad tanımlayabilirsiniz. içinde dashde bazı şeyler vardır sen ile yapabilirsiniz $PATHve %func.
mikeserv

Yanıtlar:


16

POSIX belgeleri buna bir uzantı olarak izin verdiğinden, bu davranışın uygulanmasını engelleyen hiçbir şey yoktur.

Basit bir çek (koştu zsh):

$ for shell in /bin/*sh 'busybox sh'; do
    printf '[%s]\n' $shell
    $=shell -c 'á() { :; }'
  done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name

olduğunu göstermektedir bash, zsh, yash, ksh93(ki kshbenim sistemde bağlantılı), pdkshve elde etme fonksiyonu adı olarak karakterleri çoklu bayt izin verir.

yash en başından çok baytlı karakterleri destekleyecek şekilde tasarlanmıştır , bu yüzden işe yaraması sürpriz değildir.

Referans verebileceğiniz diğer belgeler ksh93:

Boşluk, bir sekme veya boşluktur. Tanımlayıcı, bir harf veya alt çizgi ile başlayan harf, rakam veya alt çizgi dizisidir. Tanımlayıcılar değişken adlarının bileşenleri olarak kullanılır. Vname, a ile ayrılmış bir veya daha fazla tanımlayıcıdan oluşan bir dizidir. ve isteğe bağlı olarak önünde bir .. Vnames işlev ve değişken adları olarak kullanılır. Sözcük, tırnak işaretleri arasında yer almayan metakarakterler hariç , geçerli yerel ayar tarafından tanımlanan karakter kümesindeki bir karakter dizisidir .

Yani Cyerel ayar:

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

başarısız oldu.


poshböyle bir listede listelenmeye değmez. Linux'a özgü hatalara bağlıdır libcve diğer platformlarda çalışmaz.
schily

ksh93Öz kaynaklardan kendinden derlenmiş bir ksh93 kullanma ile ilgili iddialarınızı tekrarlayamıyorum . İken ksh88fonksiyon adları için olmayan 7-Bit ASCII harf kabul görünüyor, sadece ksh93Ubuntu gelen ikili onları kabul eder gibi.
schily

@schily ksh Ben bu test Debian ikili (yani Ubuntu biriyle aynı olabilir)
cuonglm

9

İşlevlerin, dosya sistemindeki komutlar da dahil olmak üzere diğer sistemlerle aynı ad alanını paylaştığını ve çoğu sistemde yollarında içerebilecekleri karakterlerde veya baytlarda herhangi bir sınırlama bulunmadığını unutmayın.

Çoğu mermi işlevlerinin karakterlerini kısıtlasa da, bunu yapmaları için iyi bir neden yoktur. Bu, bu kabuklarda, bir işlevle değiştiremeyeceğiniz komutlar olduğu anlamına gelir.

zshve rcbazıları ile /boş dize de dahil olmak üzere işlev adları için her şeye izin verin . zshNUL baytlarına bile izin verir.

$ zsh
$ $'\0'() echo nul
$ ^@
nul
$ ""() uname
$ ''
Linux
$ /bin/ls() echo test
$ /bin/ls
test

Kabuktaki basit bir komut, bağımsız değişkenlerin bir listesidir ve ilk bağımsız değişken, yürütülecek komutu türetmek için kullanılır. Bu nedenle, bu bağımsız değişkenlerin ve işlev adlarının aynı olası değerleri paylaşması ve zshyerleşiklere ve işlevlere yönelik bağımsız değişkenlerde herhangi bir bayt dizisi olabilmesi mantıklıdır .

Güvenlik sorunu fonksiyonları olarak burada bile yok sen (script yazar) olanlar tanımlamak sen çağırmak.

Güvenlik sorunlarının olabileceği yerler ayrıştırma işleminin ortamdan etkilendiği durumdur, örneğin işlevler için geçerli adların yerel ayardan etkilendiği kabuklar.


Bir başlayarak çok bash oyun oynayabilir function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }ve potansiyel olarak faydalı şeyler de adlandırılmış işlevleri ile --, //, @veya %vb
mr.spuratic

ama mermiler /bir adda bulunduğunda karma tablo aramasını atlatma eğilimindedir ? ve bir işlev sadece yürütülebilir bir isim değildir - kodu. saklı işlev adları meta karakterler içeriyorsa basit bir uygulama ayrıştırma sorunları bir sürü karşılaşabilirsiniz düşünürdüm.
mikeserv

Evet, bash'ın işlev adlarına makul ölçüde genişletilebilen vars cinsinden null içermemesinin farkındayım. Belirli bir örneğim yok, ancak adlar için neredeyse her şeye izin veren bu oyunların, "çalışmanın kolay bir yolundan" daha fazla potansiyel bir güvenlik ihlali olduğunu hissediyorum. Umarım yanılıyorum.
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.