Як відобразити вихідні дані командного рядка на консолі та зберегти висновок у текстовому файлі?


25

Як я можу працювати sudo apt-get installна ОБИДВА бачити процес установки (довго в моєму випадку) і збереження його висновок в текстовий файл?


Це лише apt-getправильно?
Брайам

@Braiam Я думаю, що прийняте нами рішення може бути застосоване до всіх інших команд, ви вважаєте, що так?

Відповіді:


17

використовувати scriptкоманду. Він скопіює все, що йде на екран у файл

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

scriptвідправляє командний вихід у файл, але не показує його на екрані.
Аарон

2
@ BryceAtNetwork23. Ви спробували команду? скрипт робить висновок відправки на екран.
термін дії

1
Я зробив. Я побіг script -c "history" ~/hist.txtі побачив вихід індикації Script startedі Script done, але я не бачив виходу з фактичної команди на екрані.
Аарон

10
@ BryceAtNetwork23 history- це вбудована оболонка, а не зовнішня команда. Що відбувається: 1) запускається сценарій, 2) скрипт шукає команду історії, не знаходить її, тому він здогадується, що він повинен запустити це через оболонку. 3) скрипт виконує команду history через оболонку 4) нова оболонка запускається та виконує внутрішню команду історії. Оскільки це нова неінтерактивна оболонка, історії нічого не сказати.
термін дії

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оскільки команду не потрібно цитувати. Тож такі переваги, як баш-завершення, легше досягти.
День

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

2
@Dan + працює з функціями, псевдонімами, вбудованими і навіть командними групами та підрозділами. Це має бути прийнятою відповіддю ІМО.
Darkhogg

1
ви можете використовувати |&замість 2>&1 |in 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

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

Просте використання:

  <command> | tee file

приклад:

  sudo apt-get install whatYouWant | tee outputFile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.