Jak zapisać dane wyjściowe polecenia w pliku?
Czy istnieje sposób bez użycia oprogramowania? Chciałbym wiedzieć jak.
command-line
led-Zepp
źródło
źródło
someCommand 2> someFile.txt
asomeCommand 2>> someFile.txt
także przekierowujestterr
do someFile.txtmake
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.
Przegląd:
Lista:
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.
źródło
2>&1
przekierowuje STDERR do STDOUT,1>&2
przekierowuje STDOUT do STDERR i3>&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 mamsh: 1: Syntax error
. Dostałem to, czego potrzebowałem, więc rezygnuję z sortowania dziwności międzysh
ibash
na moim serwerze. Dzięki.sh
a niebash
(lub możebash
wsh
trybie ...). Możesz sprawdzić, z czego dokładnie korzysta Twój bieżący proces powłokips -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:Niewielka modyfikacja złapie również stderr:
lub nieco krótszy i mniej skomplikowany:
tee
jest przydatny, jeśli chcesz mieć możliwość przechwytywania danych wyjściowych poleceń podczas oglądania ich na żywo .źródło
2>&1
?Możesz przekierować dane wyjściowe polecenia do pliku:
Aby dołączyć dane wyjściowe polecenia do pliku zamiast go zastąpić, użyj:
źródło
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:
źródło
ls
igrep
, 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. Odpowiednimish
operatorami przekierowania POSIX sąZauważysz, że funkcja POSIX jest w pewnym sensie prostsza i bardziej prosta.
&>
Składnia została zapożyczona zcsh
którego powinien już przekonać, że to zły pomysł.źródło
some_command | tee command.log
isome_command > command.log
mają problem polegający na tym, że nie zapisują danych wyjściowych polecenia wcommand.log
pliku w czasie rzeczywistym.Aby uniknąć tego problemu i zapisać dane wyjściowe polecenia w czasie rzeczywistym, możesz dołączyć
unbuffer
dołączonyexpect
pakiet.Przykład:
Zakładając, że
log.py
zawiera: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?
źródło