Jak wyświetlić dane wyjściowe wiersza poleceń na konsoli i zapisać dane wyjściowe w pliku tekstowym?

25

W jaki sposób można uruchomić sudo apt-get installprzez OBU widząc proces instalacji (długo w moim przypadku) i zapisywanie jego wyjście do pliku tekstowego?


źródło
Czy chodzi tylko o apt-getrację?
Braiam
@Braiam Myślę, że rozwiązanie, które zaakceptowałem, można zastosować do wszystkich innych poleceń, tak sądzisz?

Odpowiedzi:

17

użyj scriptpolecenia. Skopiuje wszystko, co przechodzi do ekranu w pliku

script -c "sudo apt-get install things" script-file.script
exore
źródło
scriptwysyła dane wyjściowe polecenia do pliku, ale nie wyświetla go na ekranie.
Aaron
2
@ BryceAtNetwork23. Próbowałeś polecenia? Skrypt ma wyjście wyślij do ekranu.
exore
1
Zrobiłem. Uruchomiłem script -c "history" ~/hist.txti zobaczyłem dane wyjściowe wskazujące Script startedi Script done, ale nie widziałem danych wyjściowych z rzeczywistego polecenia na ekranie.
Aaron,
10
@ BryceAtNetwork23 historyjest wbudowaną powłoką, a nie zewnętrznym poleceniem. Co się dzieje: 1) skrypt się uruchamia, 2) skrypt przeszukuje polecenie historii, nie znajduje go, więc zgaduje, że powinien uruchomić to za pomocą powłoki. 3) skrypt uruchamia polecenie history przez powłokę 4) uruchamia się nowa powłoka i wykonuje polecenie wewnętrzne historii. Ponieważ jest to nowa nieinteraktywna powłoka, historia nie ma nic do powiedzenia.
exore
1
scriptmoże być również uruchamiany interaktywnie. Wystarczy wpisać scriptw wierszu polecenia. Otrzymasz nową powłokę, a wszelkie wpisywane polecenia będą zapisywane. Wpisz, exitaby zakończyć powłokę i zapisać plik. Domyślnie wyjście jest wywoływane typescripti będzie zawierało wszystko, co pokazano na ekranie, bez względu na to, czy zostało wpisane, czy było wyjściem polecenia. historyPolecenie powinno być nadal dostępne w nowej powłoce, jak również.
Brian Minton
52

Aby to zrobić, możesz użyć teepolecenia.

sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt

Zajrzyj tutaj, aby uzyskać więcej informacji lub wykonajman tee

Uwaga: Jak wspomnieli inni, 2>&1konieczne jest przekierowanie STDERR do STDOUT, aby złapać wszelkie błędy. Zobacz to pytanie StackOverflow, aby uzyskać dobre wyjaśnienie tego, co 2>&1faktycznie robi.

Aaron
źródło
Dodałbym „2> i 1” przed „|”
Olivier Dulac,
2
Jest to bardziej praktyczne niż scriptponieważ polecenie nie musi być cytowane. Tak więc korzyści takie jak ukończenie bashu są łatwiejsze do osiągnięcia.
Dan
2
@ Dan: skrypt nie potrzebuje -c "something ...": if następnie przeniesie Cię do powłoki i zakończy się po wyjściu z tej powłoki. Pozwala na wiele poleceń itp. Dodatkowo zachowuje więcej informacji o „formatowaniu”, pozwalając na odtworzenie kilku innych rzeczy (takich jak: czysty ekran itp.) (Ale to również może zepsuć wyjście ... ymmv)
Olivier Dulac
2
@ Dan + działa z funkcjami, aliasami, wbudowanymi funkcjami, a nawet grupami poleceń i podpowłokami. To powinna być zaakceptowana odpowiedź IMO.
Darkhogg,
1
możesz użyć |&zamiast 2>&1 |w bash
jfs
15

tee wykona zadanie zgodnie z wymaganiami.

Aby przechwycić dane wyjściowe do pliku, użyj:

sudo apt-get install your_software | tee log_file.txt

Spowoduje to tylko przechwycenie danych wyjściowych, ale nie żadnych komunikatów o błędach. Jeśli chcesz również rejestrować komunikaty o błędach, zmień polecenie na:

sudo apt-get install your_software 2>&1  | tee log_file.txt
Alex C.
źródło
Lub, ponieważ bash obsługuje |&operatora , potokujesudo apt-get install your_software |& tee log_file.txt zarówno stdout, jak i stderr do tee. (Uznanie dla JF Sebastiana, który zasugerował to gdzie indziej )
Eliah Kagan
9

Jedną z zalet apt-get (i ogólnie APT) jest to, że przechowują pliki dziennika dla prawie wszystkiego, nawet danych wyjściowych terminalu każdego polecenia uruchamianego przez /var/log/apt. Na przykład jest to ostatni wpis w moim /var/log/apt/term.log:

Log started: 2014-06-20  16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20  16:46:33

Teraz, porównując z rzeczywistą wydajnością:

➜  ~  sudo apt-get remove xdotool 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...

Zaoszczędził mi kilka wierszy, które w większości przypadków nie są istotne, i robi to automatycznie. Tak więc nie potrzebujesz żadnych dodatkowych poleceń, aby robić to, co chcesz, apt-get zrobi to za Ciebie.

Braiam
źródło
1

spróbuj wykonać polecenie tee . Możesz znaleźć tutaj kilka przykładów.

Proste użycie:

  <command> | tee file

przykład:

  sudo apt-get install whatYouWant | tee outputFile
Lety
źródło