Kilka sztuczek na temat przekierowania
Niektóre szczegóły składni na ten temat mogą mieć ważne zachowania. Istnieje kilka małych próbek o przekierowania, STDERR
, STDOUT
, i argumenty zamawiającego .
1 - Nadpisywanie czy dołączanie?
Symbol >
oznacza przekierowanie .
>
oznacza wysyłanie do jako kompletnego ukończonego pliku , nadpisywanie celu, jeśli istnieje (patrz noclobber
funkcja bash w # 3 później).
>>
oznacza, że wysyłanie oprócz dołączałoby do celu, jeśli istnieje.
W każdym razie plik zostałby utworzony, gdyby nie istniał.
2 - Wiersz poleceń powłoki zależy od kolejności !!
Do przetestowania tego potrzebujemy prostego polecenia, które wyśle coś na oba wyjścia :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(Oczywiście, że nie masz katalogu o nazwie /tnt
;). Cóż, mamy to !!
Zobaczmy więc:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
Ostatni wiersz poleceń zrzuca STDERR
konsolę i wydaje się, że nie jest to oczekiwane zachowanie ... Ale ...
Jeśli chcesz wykonać filtrowanie wpisów dotyczące jednego wyjścia, drugiego lub obu:
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
Zauważ, że ostatni wiersz polecenia w tym akapicie jest dokładnie taki sam jak w poprzednim akapicie, w którym napisałem, wydaje się, że nie jest to oczekiwane zachowanie (więc może to być nawet oczekiwane zachowanie).
Cóż, jest kilka sztuczek na temat przekierowań, aby
wykonać inną operację na obu wyjściach :
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
Nota: &9
deskryptor wystąpiłby spontanicznie z powodu ) 9>&2
.
Dodatek: nota! Dzięki nowej wersjigrzmotnąć( >4.0
) dostępna jest nowa funkcja i bardziej seksowna składnia do robienia takich rzeczy:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
I wreszcie dla takiego kaskadowego formatowania wyjściowego:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Dodatek: nota! Ta sama nowa składnia na dwa sposoby:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Gdzie STDOUT
przechodzą przez określony filtr, STDERR
do drugiego i na końcu oba połączone wyjścia przechodzą przez trzeci filtr poleceń.
3 - Słowo o noclobber
opcji i >|
składni
Chodzi o nadpisywanie :
Choć set -o noclobber
Instruct bash aby nie nadpisać istniejącego pliku, >|
składnia pozwala przechodzić przez to ograniczenie:
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
Plik jest zastępowany za każdym razem, a teraz:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
Przekaż za pomocą >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
Wyłączenie tej opcji i / lub sprawdzenie, czy jest już ustawione.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - Ostatnia sztuczka i więcej ...
Przekierowując oba dane wyjściowe z danego polecenia, widzimy, że poprawna składnia może być:
$ ls -ld /tmp /tnt >/dev/null 2>&1
w tym szczególnym przypadku istnieje składnia skrótu: &>
... lub>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
Uwaga: jeśli 2>&1
istnieje, 1>&2
to również poprawna składnia:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- Teraz pozwolę ci pomyśleć o:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- Jeśli chcesz uzyskać więcej informacji
Możesz przeczytać dokładną instrukcję, naciskając:
man -Len -Pless\ +/^REDIRECTION bash
w grzmotnąć konsola ;-)