Как отобразить вывод командной строки на консоли и сохранить вывод в текстовом файле?


25

Как я могу работать sudo apt-get installна ОБА видеть процесс установки (долго в моем случае) и сохранение его вывод в текстовый файл?


Это только apt-getправильно?
Брайам

@Braiam Я думаю, что решение, которое я принял, может быть применено ко всем другим командам, вы так думаете?

Ответы:


17

используйте scriptкоманду. Он скопирует все, что идет на экран в файл

script -c "sudo apt-get install things" script-file.script

scriptотправляет вывод команды в файл, но не показывает его на экране.
Аарон

2
@ BryceAtNetwork23. Вы пробовали команду? скрипт делает вывод отправки на экран.
exore

1
Я сделал. Я побежал script -c "history" ~/hist.txtи увидел вывод, указывающий Script startedи Script done, но я не увидел вывод действительной команды на экране.
Аарон

10
@ BryceAtNetwork23 history- это встроенная оболочка, а не внешняя команда. Происходит следующее: 1) скрипт запускается, 2) скрипт ищет команду истории, не находит ее, поэтому он предполагает, что он должен запустить ее через оболочку. 3) скрипт запускает команду history через оболочку 4) новая оболочка запускается и выполняет внутреннюю команду history. Поскольку это новая неинтерактивная оболочка, истории нечего сказать.
exore

1
scriptтакже может быть запущен в интерактивном режиме. Просто введите scriptв командной строке. Вы получите новую оболочку, и любые введенные вами команды сохранят свои результаты. Введите, exitчтобы закрыть оболочку и сохранить файл. По умолчанию вызывается вывод, typescriptи он будет содержать все, что отображается на вашем экране, независимо от того, набрали ли вы его, или это был вывод команды. Команда historyвсе еще должна быть доступна в новой оболочке.
Брайан Минтон

52

Вы можете использовать teeкоманду для достижения этой цели.

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

Посмотрите здесь для получения дополнительной информации или выполнитьman tee

Примечание. Как уже упоминалось, 2>&1необходимо перенаправить STDERR в STDOUT, чтобы перехватить любые ошибки. Посмотрите этот вопрос StackOverflow для хорошего объяснения того, что на 2>&1самом деле делает.


Я бы добавил "2> & 1" перед "|"
Оливье Дюлак

2
Это более практично, чем то, scriptчто команду не нужно заключать в кавычки. Поэтому такие преимущества, как завершение bash, легче реализовать.
Дан

2
@Dan: сценарию не требуется -c "something ...": if, после чего вы попадете в оболочку, и закончите, когда вы выйдете из этой оболочки. Позволяет использовать несколько команд и т. Д. Кроме того, в нем содержится больше информации о «форматировании», что позволяет воспроизводить некоторые другие вещи (например, очистить экран и т. Д.) (Но это также может испортить вывод ... ymmv)
Оливье Дюлак

2
@Dan + работает с функциями, псевдонимами, встроенными функциями и даже группами команд и подоболочками. Это должен быть принятый ответ ИМО.
Darkhogg

1
Вы можете использовать |&вместо 2>&1 |Bash
JFS

15

tee будет делать работу по мере необходимости.

Чтобы записать вывод в файл, используйте:

sudo apt-get install your_software | tee log_file.txt

Это будет захватывать только выходные данные, но не сообщения об ошибках. Если вы также хотите записать сообщения об ошибках, измените команду на:

sudo apt-get install your_software 2>&1  | tee log_file.txt

Или, так как bash поддерживает |&оператор , sudo apt-get install your_software |& tee log_file.txtволи трубы как стандартный вывод и стандартный поток ошибок в tee. (Престижность Дж. Ф. Себастьяну, который предложил это в другом месте .)
Элия ​​Каган

9

Одна из прелестей apt-get (и APT в целом) заключается в том, что они хранят файлы журналов практически для всего, даже для вывода на терминал любой команды, которую вы запускаете через /var/log/apt. Например, это последняя запись в моем /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

Теперь, сравнивая с фактическим результатом:

➜  ~  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) ...

Это спасло меня от нескольких строк, которые в большинстве случаев не актуальны, и делает это автоматически. Таким образом, вам не нужна дополнительная команда, чтобы делать то, что вы хотите, apt-get сделает это за вас.


1

попробуйте тройник команду. Вы можете найти здесь несколько примеров.

Простое использование:

  <command> | tee file

пример:

  sudo apt-get install whatYouWant | tee outputFile
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.