Aby przekierować standardowe wyjście do obciętego pliku w Bash, wiem, że używam:
cmd > file.txt
Aby przekierować standardowe wyjście w Bash, dołączając do pliku, wiem, że używam:
cmd >> file.txt
Aby przekierować zarówno stdout, jak i stderr do pliku obciętego, wiem, że używam:
cmd &> file.txt
Jak przekierować dołączanie stdout i stderr do pliku? cmd &>> file.txt
nie działało dla mnie.
Odpowiedzi:
Bash wykonuje przekierowania od lewej do prawej w następujący sposób:
>>file.txt
: Otwórzfile.txt
w trybie dołączania i przekierujstdout
tam.2>&1
: Przekierujstderr
do „dokądstdout
obecnie zmierza” . W tym przypadku jest to plik otwarty w trybie dołączania. Innymi słowy,&1
ponownie wykorzystuje deskryptor pliku, który jeststdout
obecnie używany.źródło
cmd >>file1 2>>file2
, powinieneś osiągnąć to, co chcesz.Można to zrobić na dwa sposoby, w zależności od wersji Bash.
Klasyczny i przenośny ( Bash pre-4 ) sposób to:
Nieprzenośnej sposób, wychodząc z Bash 4 jest
(analogowy do
&> outfile
)Aby uzyskać dobry styl kodowania, powinieneś
Jeśli skrypt zaczyna się już od
#!/bin/sh
(bez względu na to, czy jest to zamierzone czy nie), to rozwiązanie Bash 4 i ogólnie dowolny kod specyficzny dla Bash nie jest dobrym rozwiązaniem.Pamiętaj też, że Bash 4
&>>
jest po prostu krótszą składnią - nie wprowadza żadnych nowych funkcji ani nic podobnego.Składnia jest (oprócz innej składni przekierowania) opisana tutaj: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
źródło
sh
. Możesz zmienić domyślną powłokę, dodającSHELL=/bin/bash
docrontab -e
pliku.W Bash możesz również jawnie określić swoje przekierowania do różnych plików:
Dołączanie będzie:
źródło
cmd >log.out 2>&1
. Edytuję swoją odpowiedź, aby usunąć pierwszy przykład.W Bash 4 (oraz ZSH 4.3.11):
po wyjęciu z pudełka
źródło
To powinno działać dobrze:
Będzie przechowywać wszystkie dzienniki w pliku.txt, a także zrzucić je na terminal.
źródło
Spróbuj tego
Twoje użycie pliku &> x.file działa w bash4. Przepraszam za to : (
Oto kilka dodatkowych wskazówek.
0, 1, 2 ... 9 to deskryptory plików w bash.
0 oznacza
stdin
, 1 oznaczastdout
, 2 oznaczastderror
. 3 ~ 9 jest zapasowe na każde inne tymczasowe użycie.Dowolny deskryptor pliku można przekierować do innego deskryptora lub pliku za pomocą operatora
>
lub>>
(append).Sposób użycia: < file_descriptor > > < nazwa_pliku | & file_descriptor >
Proszę odnieść się do http://www.tldp.org/LDP/abs/html/io-redirection.html
źródło
You_command
na stdout i stdoutYou_command
do plikuoutput.log
. Dodatkowo nie zostanie dołączony do pliku, ale go zastąpi.1 > output.log 2>&1
Dziwi mnie, że od prawie dziesięciu lat nikt jeszcze nie opublikował takiego podejścia:
Jeśli używasz starszych wersji bash, gdzie
&>>
nie jest dostępna, możesz także:Ten ikra podpowłoce, więc jest mniej wydajny niż tradycyjne podejście
cmd >> file.txt 2>&1
, a co za tym idzie nie będzie działać dla poleceń, które trzeba zmodyfikować bieżącej powłoki (npcd
,pushd
), ale takie podejście wydaje się bardziej naturalne i zrozumiałe dla mnie jest:Ponadto nawiasy usuwają niejednoznaczność kolejności, szczególnie jeśli zamiast tego chcesz połączyć stdout i stderr z innym poleceniem.
źródło
cmd >> file 2>&1
działa we wszystkich powłokach i nie wymaga dodatkowego procesu do uruchomienia.