cat < file
wypisuje zawartość pliku na standardowe wyjście.
cat > file
odczytuje stdin aż do wykrycia Ctrl+ Di zapisania tekstu wejściowego do pliku .
cat <> file
, przynajmniej w mojej wersji Bash, drukuje zawartość pliku szczęśliwie (bez błędów), ale nie modyfikuje pliku ani nie aktualizuje znacznika czasu modyfikacji.
W jaki sposób standard Bash uzasadnia pozornie ignorowane >
w trzecim stwierdzeniu - a co ważniejsze, czy coś robi ?
4<>file
) jest przydatne i przypuszczam, że 0 jest tak samo dobrym ustawieniem, jak każde, gdy go pominiesz. Czytanie ze standardowego wyjścia nie jest lepsze.<>
jest również przydatny w niektórych systemach (np. Linux) do otwierania nazwanych potoków bez blokowania, dopóki inny proces nie otworzy go do zapisu.<>
Operator może być przydatny przy pisaniu aplikacji, która działała z kilkoma terminalami i czasami chciał uruchomić powłokę. Ta powłoka z kolei nie byłaby w stanie uruchamiać aplikacji uruchamianych ze zwykłego terminala sterującego, chyba że mogłaby skorzystać z<>
... takiego jak ... pagermore
, który odczytuje ze standardowego błędu, aby uzyskać swoje polecenia, a więc standardowe wejście i standardowe wyjście oba są dostępne do ich zwykłego użytkowania.cat food | more - >/dev/tty03 2<>/dev/tty03
<> file
otwiera plik (domyślnie na deskryptorze pliku 0 (stdin), jak<
) w trybie do odczytu i zapisu bez obcinania i tworzenia pliku, jeśli wcześniej nie istniał .To odpowiada
O_RDWR|O_CREAT
flagom przekazywanym doopen()
wywołania systemowego. Natomiast<
jestO_RDONLY
i>
jestO_WRONLY|O_CREAT|O_TRUNC
i>>
O_WRONLY|O_CREAT|O_APPEND
.Zapisywanie standardowego wejścia nie jest często przydatne, ponieważ aplikacje zwykle nie piszą na standardowe wejście. Aplikacje zwykle nie oczekują odczytu i zapisu na deskryptorze pliku, który otrzymują podczas uruchamiania; zwykle czytają ze stdin (lub deskryptora pliku, który sami otwierają) i piszą na stdout lub stderr (lub deskryptorze pliku, który sami otwierają).
<>
może mieć swoje zastosowania:cat <> file
więcej,cat < file
jeśli nie chcesz, aby polecenie zakończyło się niepowodzeniem, jeślifile
nie istnieje, alefile
zamiast tego utworzono puste .Niecięty aspekt
<>
sprawia, że przydatne jest zastępowanie plików w miejscu. W takim przypadku jednak zazwyczaj nie używasz go w deskryptorze pliku 0:zastępuje pierwsze 3 bajty
file
zxxx
.W niektórych systemach, takich jak Linux,
<>
na nazwanym potoku (FIFO) otwiera nazwany potok bez blokowania (bez oczekiwania na inny proces otwarcia drugiego końca) i zapewnia, że struktura potoku pozostanie przy życiu. Na przykład w:sed
obsługuje przychodzące dane z dowolnej liczby innych procesów zapisujących się na nich i nigdy ich nie widzieof
.źródło
<>
domyślnie jest ustawiony na1<>
(standardowe wyjście) zamiast0<>
(standardowe wejście ). Jest to błąd zgodności z POSIX, który zgłosiłem i zostanie naprawiony w następnej wersji. github.com/att/ast/issues/75 Ale dopóki bieżące wersje ksh93 nie przestaną być używane, musisz podać numer deskryptora pliku, aby używać go<>
przenośnie.mkfifo fifo; exec 3<>fifo
miałyby się blokować?