Odpowiedzi:
Tak, jest to możliwe, po prostu przekieruj dane wyjściowe do pliku:
SomeCommand > SomeFile.txt
Lub jeśli chcesz dołączyć dane:
SomeCommand >> SomeFile.txt
Jeśli chcesz stderr
również użyć tego:
SomeCommand &> SomeFile.txt
lub to dołączyć:
SomeCommand &>> SomeFile.txt
jeśli chcesz, aby na konsoli i w pliku były wyświetlane zarówno stderr
dane wyjściowe, jak i plik, użyj tego:
SomeCommand 2>&1 | tee SomeFile.txt
(Jeśli chcesz tylko dane wyjściowe, upuść 2
powyższe)
make
polecenia w pliku, wymagana jest następująca składnia: make > someFile.txt 2>&1
(źródło: linuxquestions.org/questions/linux-newbie-8/... )
Aby zapisać dane wyjściowe polecenia w pliku, jest w zasadzie 10 najczęściej używanych sposobów.
Uwaga:
n.e.
w kolumnie składni oznacza „nie istnieje”.
Jest sposób, ale jest zbyt skomplikowany, aby zmieścić się w kolumnie. Pomocny link można znaleźć w sekcji Lista na ten temat.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
Standardowy strumień wyjściowy zostanie przekierowany tylko do pliku, nie będzie widoczny w terminalu. Jeśli plik już istnieje, zostanie zastąpiony.
command >> output.txt
Standardowy strumień wyjściowy zostanie przekierowany tylko do pliku, nie będzie widoczny w terminalu. Jeśli plik już istnieje, nowe dane zostaną dołączone na końcu pliku.
command 2> output.txt
Standardowy strumień błędów zostanie przekierowany tylko do pliku, nie będzie widoczny w terminalu. Jeśli plik już istnieje, zostanie zastąpiony.
command 2>> output.txt
Standardowy strumień błędów zostanie przekierowany tylko do pliku, nie będzie widoczny w terminalu. Jeśli plik już istnieje, nowe dane zostaną dołączone na końcu pliku.
command &> output.txt
Zarówno standardowe wyjście, jak i standardowy strumień błędów zostaną przekierowane tylko do pliku, nic nie będzie widoczne w terminalu. Jeśli plik już istnieje, zostanie zastąpiony.
command &>> output.txt
Zarówno standardowe wyjście, jak i standardowy strumień błędów zostaną przekierowane tylko do pliku, nic nie będzie widoczne w terminalu. Jeśli plik już istnieje, nowe dane zostaną dołączone na końcu pliku.
command | tee output.txt
Standardowy strumień wyjściowy zostanie skopiowany do pliku, nadal będzie widoczny w terminalu. Jeśli plik już istnieje, zostanie zastąpiony.
command | tee -a output.txt
Standardowy strumień wyjściowy zostanie skopiowany do pliku, nadal będzie widoczny w terminalu. Jeśli plik już istnieje, nowe dane zostaną dołączone na końcu pliku.
(*)
Bash nie ma skróconej składni, która pozwala na przesłanie tylko StdErr do drugiego polecenia, które byłoby potrzebne tutaj w połączeniu z tee
ponownie do uzupełnienia tabeli. Jeśli naprawdę potrzebujesz czegoś takiego, spójrz na „Jak stderr rur, a nie stdout?” w przypadku przepełnienia stosu na kilka sposobów, w jaki sposób można to zrobić, np. poprzez zamianę strumieni lub stosowanie zastępowania procesów.
command |& tee output.txt
Zarówno standardowe dane wyjściowe, jak i standardowe strumienie błędów zostaną skopiowane do pliku, nadal będą widoczne w terminalu. Jeśli plik już istnieje, zostanie zastąpiony.
command |& tee -a output.txt
Zarówno standardowe dane wyjściowe, jak i standardowe strumienie błędów zostaną skopiowane do pliku, nadal będą widoczne w terminalu. Jeśli plik już istnieje, nowe dane zostaną dołączone na końcu pliku.
2>&1
przekierowuje STDERR do STDOUT, 1>&2
przekierowuje STDOUT do STDERR i 3>&1
przekierowuje strumień 3 do STDERR.
sh: 1: Syntax error: "&" unexpected
kiedy używam |& tee
ze skryptu Python na serwerze c9.io. Wygląda na to, że używana jest inna powłoka. echo $SHELL
pokazuje /bin/bash
i $SHELL --version
pokazuje wydanie w wersji 4.3.11 (1). Próbowałem #!/bin/bash
w moim skrypcie Python, ale nadal mam sh: 1: Syntax error
. Dostałem to, czego potrzebowałem, więc rezygnuję z sortowania dziwności między sh
i bash
na moim serwerze. Dzięki.
sh
a nie bash
(lub może bash
w sh
trybie ...). Możesz sprawdzić, z czego dokładnie korzysta Twój bieżący proces powłoki ps -p $$ -o cmd=
, ponieważ echo $SHELL
jest on niewiarygodny i wyświetli powłokę logowania, ignorując, czy mogłeś uruchomić inną podpowłokę.
Możesz także użyć, tee
aby wysłać dane wyjściowe do pliku:
command | tee ~/outputfile.txt
Niewielka modyfikacja złapie również stderr:
command 2>&1 | tee ~/outputfile.txt
lub nieco krótszy i mniej skomplikowany:
command |& tee ~/outputfile.txt
tee
jest przydatny, jeśli chcesz mieć możliwość przechwytywania danych wyjściowych poleceń podczas oglądania ich na żywo .
2>&1
?
Możesz przekierować dane wyjściowe polecenia do pliku:
your_command >/path/to/file
Aby dołączyć dane wyjściowe polecenia do pliku zamiast go zastąpić, użyj:
your_command >>/path/to/file
Ulepszenie do rozważenia -
Różne skrypty wstrzykują kolorowe kody wyjściowe, które mogą nie wymagać zaśmiecania pliku dziennika.
Aby to naprawić, możesz użyć programu sed do usunięcia tych kodów. Przykład:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
i grep
, obsługuje --color=auto
, które wysyłają kody kolorów tylko wtedy, gdy standardowe wyjście jest terminalem.
W przypadku cron
zadań itp. Chcesz uniknąć rozszerzeń Bash. Odpowiednimi sh
operatorami przekierowania POSIX są
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
Zauważysz, że funkcja POSIX jest w pewnym sensie prostsza i bardziej prosta. &>
Składnia została zapożyczona z csh
którego powinien już przekonać, że to zły pomysł.
some_command | tee command.log
i some_command > command.log
mają problem polegający na tym, że nie zapisują danych wyjściowych polecenia w command.log
pliku w czasie rzeczywistym.
Aby uniknąć tego problemu i zapisać dane wyjściowe polecenia w czasie rzeczywistym, możesz dołączyć unbuffer
dołączony expect
pakiet.
Przykład:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Zakładając, że log.py
zawiera:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
możesz uruchomić unbuffer python log.py | tee command.log
lubunbuffer python log.py > command.log
Więcej informacji: Jak zapisać dane wyjściowe polecenia w pliku w czasie rzeczywistym?
someCommand 2> someFile.txt
asomeCommand 2>> someFile.txt
także przekierowujestterr
do someFile.txt