Co robi „exec {fd} </ dev / watchdog” w Bash


28

To dosłownie, {fd}nie jest symbolem zastępczym. Mam skrypt, który to robi i niczego nie dostarcza, ani nie odwołuje się do {fd} nigdzie indziej. Czy to ważna walka?

exec {fd}</dev/watchdog

Odpowiedzi:


34

Zamiast wybierać deskryptor pliku i mieć nadzieję, że będzie on dostępny:

exec 4< /dev/watchdog  # Was 4 in use? Who knows?

notacja ta prosi powłokę o wybranie deskryptora pliku, który nie jest aktualnie używany, otwarcie pliku do odczytu na tym deskryptorze i przypisanie numeru do danej zmiennej ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10

Jestem pewien, że masz rację, ponieważ (1) pamiętam, że gdzieś to przeczytałem, i (2) właśnie to wypróbowałem (i działa). Ale nigdzie nie mogłem tego znaleźć. (Oczywiście miałem mniej niż dziesięć minut na wyszukiwanie, zanim opublikowałeś swoją odpowiedź.) Czy możesz podać odniesienie do miejsca, w którym jest udokumentowane?
Scott,

2
Zobacz stronę podręcznika man, drugi akapit tego rozdziału REDIRECTIONS. Tak naprawdę nie wyskakuje na ciebie, ponieważ nie dają wyraźnego przykładu.
chepner

Masz rację, tęskniłem za tym w męskim szaleństwie, ale to tam powiedziałeś. Należy zauważyć, że każde słowo, nie tylko fd, będzie działać w nawiasach klamrowych, i że przypisuje fd> = 10.
Gregg Leventhal

3
@Scott, nie tylko jest dostępny tylko w wersji bash, ale jest dostępny tylko w wersji bash 4.1 lub nowszej (dlatego nie jest dostępny w wersjach 3.2 nadal używanych w systemie MacOS).
Charles Duffy,

2
@CharlesDuffy /dev/watchdogrównież nie istnieje w systemie Mac OS X; jest to urządzenie specyficzne dla systemu Linux.
duskwuff

11

Formularz:

{var}<filename

uczyniono powłokę otwartym plikiem filenamedo odczytu i przechowywania numeru deskryptora pliku w zmiennej var. Nie ma dozwolonej przestrzeni między {var}operatorami przekierowania i, a numer deskryptora pliku będzie większy lub równy 10.

Funkcja ta była od oryginału ksh(od wersji ksh93r w 2006), bashskopiowane go dużo później w bash-4.1-alphaod 2010 roku zshrównież zmiana wcześniej niż bashod zsh 4.3.42007 roku.


2

Wyjaśniono to w sekcji podręcznika Bash na temat przekierowań .

Każde przekierowanie, które może być poprzedzone numerem deskryptora pliku, może zamiast tego być poprzedzone słowem w postaci { varname }. W takim przypadku dla każdego operatora przekierowania, z wyjątkiem >&-i <&-, powłoka przydzieli deskryptor pliku większy niż 10 i przypisze go do { varname }. Jeśli >&-lub <&-poprzedza { nazwa_zmiennej }, wartość nazwa_zmiennej określa deskryptor pliku do zamknięcia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.