Korzystanie z rozszerzonych znaków Unicode jest (bez wątpienia) przydatne dla wielu użytkowników.
Prostsze powłoki (ash (busybox), myślnik) i ksh nie działają z:
tést() { echo 34; }
tést
Ale bash , mksh , lksh i zsh wydają się na to pozwalać.
Wiem, że prawidłowe nazwy funkcji POSIX używają tej definicji nazw . Oznacza to, że wyrażenie regularne:
[a-zA-Z_][a-zA-Z0-9_]*
Jednak w pierwszym linku jest również powiedziane:
Implementacja może dopuszczać inne znaki w nazwie funkcji jako rozszerzenie.
Pytania są następujące:
- Czy jest to akceptowane i dokumentowane?
- Gdzie?
- Dla jakich muszli (jeśli istnieją)?
Powiązane pytania: Czy
możliwe jest użycie znaków specjalnych w nazwie funkcji powłoki?
Nie jestem zainteresowany używaniem metaznaków (>) w nazwach funkcji.
Nazwy funkcji upstart i bash zawierające „-”
Nie uważam, że operator (odejmowanie „-”) powinien być częścią nazwy.
alias
być nieco łagodniejszy. a więc możesz napisać funkcję pod jakąś właściwą, zapinaną na guziki nazwą, a następnie po prostu zdefiniować bardziej stylowy alias do wywołania funkcji. wdash
tam również pewne rzeczy można zrobić z$PATH
i%func
.Odpowiedzi:
Ponieważ dokumentacja POSIX zezwala na to jako rozszerzenie, nic nie stoi na przeszkodzie implementacji tego zachowania.
Prosta kontrola (uruchomiona
zsh
):pokazują, że
bash
,zsh
,yash
,ksh93
(coksh
wiąże się w moim systemie),pdksh
a jego pochodzenie pozwalają multi-bajty znaków jako nazwa funkcji.yash
jest przeznaczony do obsługi znaków wielobajtowych od samego początku, więc nic dziwnego, że zadziałał.Inna dokumentacja, do której możesz się odwołać, to
ksh93
:Więc ustawienie
C
regionalne:sprawić, że się nie uda.
źródło
posh
nie warto być wymienionym na takiej liście. To zależy od błędów specyficznych dla Linuksalibc
i nie będzie działać na innych platformach.ksh93
korzystania z samodzielnie skompilowanego ksh93 z oryginalnych źródeł. Chociażksh88
wydaje się akceptować litery nie 7-bitowe ASCII dla nazw funkcji,ksh93
wydaje się , że tylko pliki binarne z Ubuntu je akceptują.Zauważ, że funkcje mają tę samą przestrzeń nazw, co inne polecenia, w tym polecenia w systemie plików, które w większości systemów nie mają ograniczeń co do znaków, a nawet bajtów, które mogą zawierać na swojej ścieżce.
Tak więc, chociaż większość powłok ogranicza znaki swoich funkcji, nie ma naprawdę dobrego powodu, aby to zrobić. Oznacza to, że w tych powłokach są polecenia, których nie można zastąpić funkcją.
zsh
irc
zezwalaj na dowolne nazwy funkcji, w tym niektóre z/
i pusty ciąg znaków.zsh
pozwala nawet na bajty NUL.Proste polecenie w powłoce to lista argumentów, a pierwszy argument służy do wyprowadzenia polecenia do wykonania. Logiczne jest więc, że te argumenty i nazwy funkcji mają te same możliwe wartości, a
zsh
argumenty wbudowanych funkcji mogą mieć dowolną sekwencję bajtów.Nie ma problemu dotyczącego zabezpieczeń tutaj jako funkcji wy (autor skryptu) są te definiują Państwo wywoływać.
Mogą występować problemy z bezpieczeństwem, gdy środowisko ma wpływ na analizowanie, na przykład w powłokach, w których ustawienia regionalne mają wpływ na prawidłowe nazwy funkcji.
źródło
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
i potencjalnie przydatnych rzeczy też z funkcji o nazwie--
,//
,@
lub%
itd./
znajduje się w nazwie? a funkcja to nie tylko nazwa wykonywalna - jej kod. pomyślałbym, że prosta implementacja może napotkać wiele problemów z analizą, jeśli jej nazwy funkcji składowanych zawierają metaznaki.