Czy występują problemy z łącznikami w funkcjach, aliasach i plikach wykonywalnych?

25

W moich testach (w Bash i Z Shell) nie widziałem problemów z definiowaniem funkcji, aliasów lub wykonywalnych skryptów powłoki, które mają łączniki w nazwie, ale nie jestem pewien, czy będzie dobrze we wszystkich powłokach i we wszystkich przypadkach użycia .

Powodem, dla którego chciałbym to zrobić, jest to, że myślnik jest łatwiejszy do wpisania niż podkreślenie, a zatem jest szybszy i płynniejszy.

Jednym z powodów, dla których waham się wierzyć, że to nie problem, jest to, że w niektórych językach (na przykład Ruby) myślnik byłby interpretowany jako znak minus nawet bez spacji wokół niego. Nie zdziwiłoby mnie to, gdyby coś takiego mogło się wydarzyć w niektórych powłokach, gdzie myślnik jest interpretowany jako sygnalizujący opcję nawet bez spacji.

Innym powodem, dla którego jestem trochę podejrzliwy, jest to, że mój edytor tekstu pomija podświetlanie składni dla funkcji z łącznikami. (Ale oczywiście jest całkiem możliwe, że to tylko błąd w konfiguracji podświetlania składni skryptów powłoki.)

Czy istnieje jakiś powód, aby unikać łączników?

ikonoklasta
źródło

Odpowiedzi:

32

POSIX i łączniki: brak gwarancji

Zgodnie ze standardem POSIX nazwa funkcji musi być prawidłową nazwą, a nazwa może składać się z:

3.231 Nazwa
W języku poleceń powłoki słowo składające się wyłącznie z podkreślników, cyfr i alfabetu z przenośnego zestawu znaków. Pierwszy znak imienia nie jest cyfrą.

Ponadto alias musi być prawidłową nazwą aliasu , która może składać się z:

3.10 Alias ​​Nazwa
W języku poleceń powłoki: słowo składające się wyłącznie z podkreślników, cyfr i alfabetu z przenośnego zestawu znaków oraz dowolnego z następujących znaków: „!”, „%”, „,”, „@”.

Implementacje mogą dopuszczać inne znaki w nazwach aliasów jako rozszerzenia. (Podkreśl moje.)

Łącznik nie jest wymieniony wśród znaków, które muszą być dozwolone w obu przypadkach. Jeśli więc zostaną użyte, przenośność nie jest gwarantowana.

Przykłady powłok, które nie obsługują łączników

dashjest domyślną powłoką ( /bin/sh) w rodzinie debian-ubuntu i nie obsługuje łączników w nazwach funkcji:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Co ciekawe, to robi myślniki wsparcia w aliasów, chociaż, jak wspomniano powyżej, jest to charakterystyczna realizacja , a nie wymóg:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

Powłoka busybox (powłoka Almquist) również nie obsługuje łączników w nazwach funkcji:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Podsumowanie obsługi łączników przez Shell

Znane są następujące powłoki obsługujące łączniki w nazwach funkcji:

  • ksh, bash, zsh

Następujące powłoki nie obsługują łączników w nazwach funkcji:

  • ash (busybox), csh, tcsh, myślnik

Wnioski

  • Łączniki są niestandardowe. Trzymaj się od nich z daleka, jeśli chcesz kompatybilności między powłokami.
  • Używaj podkreślników zamiast myślników: podkreślenia są akceptowane wszędzie.
John1024
źródło
2
Imiona -w nich są złe. Patrzę na ciebie, CSS. :)
PM 2Ring
Dzięki. Testowałem później cshi tcshnie obsługują one łączników, ale skorupa Korn tak. To trochę zabawne, że użyłem a-b()również nazwy mojej funkcji.
iconoclast
@iconoclast Do odpowiedzi dodałem wyniki testów powłoki. Dzięki.
John1024,
@ PM2Ring są łatwiejsze do wpisania niż imiona z podkreśleniami. Z wyłączeniem tradycji lub decyzji wdrożeniowych systemów, które na to nie pozwalają, jaką zasadę możesz wskazać, aby poprzeć twierdzenie, że są złe?
iconoclast
1
@iconoclast Nazwy z łącznikami są niemożliwe w wielu językach, ponieważ łącznik jest interpretowany jako znak minus, więc jeśli taki język musi współpracować z językiem, który obsługuje nazwy z łącznikami, masz nieporządną sytuację, w której jednostki o łączonych nazwach są zmuszone mam inną nazwę w innym języku.
PM 2, Ring
3

Wiem, że jest naprawdę późno, ale być może uda ci się rozwiązać problem zwiększenia dostępności podkreślnika.

xmodmap -e "keycode  20 =  underscore minus"

Spowoduje to przełączenie podkreślenia łącznikiem (minus).

Teraz trzymasz shift dla łącznika, ale podkreślenie jest wpisywane bez shift.

Twój kod może być inny, jednak myślę, że zależy od twojej klawiatury; mój ma 20 lat. Daj mi znać, jeśli potrzebujesz pomocy w znalezieniu kodu, którego chcesz użyć.

TuxForLife
źródło