W samouczku bash, który czytam, napisano, że jeśli otworzysz deskryptor pliku do czytania, tj
exec 3< echolist
Musisz to tak zamknąć,
exec 3<&-
Jeśli jednak otworzysz deskryptor pliku do zapisu, musisz go zamknąć w następujący sposób:
exec 3>&-
Jednak kiedy patrzę w Internecie, widzę, jak ludzie otwierają pliki, a następnie zamykają je w ten sposób:
exec 3>&-
UWAGA: kiedy, zgodnie z samouczkiem, powinni ich używać exec 3<&1
.
Więc moje pytanie brzmi: czy wszystkie deskryptory plików mogą zostać zamknięte przez exec n>&-
gdzie n jest numerem deskryptora pliku? Niezależnie od tego, czy został otwarty do czytania, pisania, czy obu?
bash
shell
io-redirection
Jason
źródło
źródło
>&-
i<&-
jest domyślny fd, gdy nie jest określony (>&-
jest1>&-
while<&-
jest0<&-
). To samo, dlax>&y
którego jest to samo, cox<&y
z wyjątkiem sytuacji, gdyx
nie jest zapewniony.Odpowiedzi:
Możesz zamknąć deskryptor pliku, używając obu
<&-
i>&-
,bash
przeanalizuje dwie składnie jako takie same.Z pliku y.tab.c w
bash
kodzie źródłowym:źródło
<>
deskryptorach plików.3>&-
lub3<&-
wydaje się, aby zamknąć deskryptor.<>
można dokonać na te same sposoby.O ile widzę,
exec 3>&-
iexec 3<&-
są takie same i może być używany na dowolnej deskryptora pliku, niezależnie od tego, w jaki sposób została ona otwarta. Zgodnie z sekcjami 2.7.6 i 2.7.5 definicji POSIX języka poleceń poleceń :Zauważ, że żadne z nich nie określa niczego, w jaki sposób deskryptor pliku n został otwarty. Jest to zgodne z faktem, że close (2) nie dba o to, jak otworzyłeś plik.
Krótki ciąg następujących czynności:
kontra to:
pokazuje, że w obu przypadkach Bash robi dokładnie to samo.
Dwa mało interesujące fakty
[n]>&-
zamknięciu deskryptorów plików.W kodzie Bash do obsługi przekierowań (redir.c) można znaleźć:
źródło
[N]>&WORD
: gitPrzykład zrozumienia przez cuonglm zamknięcia FD „<>”.
Jest to cytowane w Advanced Bash-Scripting Guide na http://tldp.org/LDP/abs/html/io-redirection.html
źródło