Відповіді:
використовувати script
команду. Він скопіює все, що йде на екран у файл
script -c "sudo apt-get install things" script-file.script
script
відправляє командний вихід у файл, але не показує його на екрані.
script -c "history" ~/hist.txt
і побачив вихід індикації Script started
і Script done
, але я не бачив виходу з фактичної команди на екрані.
history
- це вбудована оболонка, а не зовнішня команда. Що відбувається: 1) запускається сценарій, 2) скрипт шукає команду історії, не знаходить її, тому він здогадується, що він повинен запустити це через оболонку. 3) скрипт виконує команду history
через оболонку 4) нова оболонка запускається та виконує внутрішню команду історії. Оскільки це нова неінтерактивна оболонка, історії нічого не сказати.
script
можна також запускати інтерактивно. Просто введіть script
у командному рядку. Ви отримаєте нову оболонку, і будь-які команди, які ви введете, збережуть їх вихід. Введіть, exit
щоб закінчити оболонку та зберегти файл. За замовчуванням вихід викликається, typescript
і він буде містити все, що відображається на вашому екрані, незалежно від того, набрали ви його, чи це був вихід команди. history
Команда повинна ще бути доступні в новій оболонці , а також.
Ви можете скористатися tee
командою для цього.
sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt
Шукайте тут для отримання додаткової інформації або виконайтеman tee
Примітка: Як уже згадували інші, 2>&1
необхідно перенаправити STDERR на STDOUT, щоб знайти будь-які помилки. Дивіться це питання StackOverflow, щоб отримати гарне пояснення того, що 2>&1
насправді робить.
script
оскільки команду не потрібно цитувати. Тож такі переваги, як баш-завершення, легше досягти.
-c "something ..."
: if тоді переведе вас у оболонку, і закінчить, коли ви вийдете з цієї оболонки. Дозволяє декілька команд тощо. Крім того, він зберігає більше "форматування" інформації, дозволяючи відтворювати ще деякі речі (наприклад, очищення екрана тощо) (але це також може зіпсувати вихід ... ymmv)
|&
замість 2>&1 |
in bash
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
. (Кудос Й.Ф. Себастьян, який запропонував це деінде .)
Однією з красень 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 робить це за вас.
apt-get
правильно?