Так, здесь я, играя с некоторыми сценариями удара, и существует что-то, что не работает:
#!/bin/bash
script -c \
sudo apt-get update &&
sudo apt-get upgrade &&
exit
echo "(Not important for the question)"
Я хочу выполнить обычный материал обновления и обновления и также записать вывод, но когда я запускаю скрипт, он только говорит, что сценарий начал записывать в Кв. - добираются, показывает использование sudo ( usage: sudo -h
первая строка), и говорит, что sript сделан. После этого это запускает материал sudo.
Что я должен сделать для записи вывода update&upgrade задачи? В целом, как я могу записать вывод всего сценария оболочки?
Если я понимаю Ваш вопрос правильно, можно использовать следующее:
#!/bin/bash
apt-get update &> update.log
apt-get -y upgrade &> upgrade.log
echo "all done"
Сохраните этот сценарий как run_updates.sh
, сделайте это исполняемым файлом с chmod 755 run_updates.sh
и выполненный это с sudo ./run_updates.sh
.
Если Вы хотите сохранить весь вывод в одном файле, удалите &> updates.log
и &> upgrades.log
из сценария и запущенный скрипт как sudo./run_updates.sh &> run_updates.log
Объяснение сценария:
apt-get update &> update.log
выполнения apt-get update
и сохраняет вывод в update.log
apt-get -y upgrade &> upgrade.log
выполнения apt-get upgrade
и сохраняет вывод в upgrade.log
. -y
предотвращает склонный от просьбы продолжиться (она принимает "да"),Примечание по перенаправлениям:
Можно использовать перенаправления ниже для "отправления" вывода от команды или сценария в файл.
&>
перенаправления STDOUT и STDERR>
или 1>
перенаправления STDOUT2>
перенаправления STDERRПримечание по sudo:
Это - вероятно, причина, почему Вы получили ошибки. При выполнении команды, для которой нужно sudo
в сценарии это - хорошая идея поместить команду без sudo
в сценарии и запущенный скрипт с sudo
. Иначе необходимо было бы дать sudo пароль сценарию в некотором роде, который плох.
Править:
В следующем коде вывод обеих способных команд перенаправляется к update.log
. Двойное >
(>>
) используется для добавления данных в файл (вместо того, чтобы заменить его)
#!/bin/bash
apt-get update &> update.log
apt-get -y upgrade &>> update.log
echo "all done"
В целом, для входа вывода всего сценария перенаправьте вывод всего сценария:
exec &> some.log
# Or, when using `/bin/sh`:
# exec >some.log 2>&1
exec
встроенный часто используется, чтобы изменить открытые дескрипторы файлов или добавить новые дескрипторы файлов (источники и места назначения ввода и вывода) для оболочки.
, Например, учитывая example.sh
:
#! /bin/bash
exec &> some.log
ls foo
echo foo
На выполнении:
$ ./example.sh
$ cat some.log
ls: foo: No such file or directory
foo
, Если Вы хотите и выведенный на экран и в файл, используйте tee
с заменой процесса:
exec &> >(tee some.log)
Никакая потребность в сценарии, просто сделайте это в одной строке с помощью перенаправлений Bash и tee
:
{ sudo apt-get update && sudo apt-get upgrade ; } |& tee output.txt
В случае, если Вы хотите добавить вывод к существующему файлу журнала, добавьте -a
опция после tee
.
Для объяснения, что это делает:
{ ... ; }
группируется ...
команды внутри, так, чтобы перенаправления вывода мы выполнили, относятся ко всем командам и не только последней. Обратите внимание на пространстве после {
и прежде }
а также на точке с запятой ;
после всех команд! (благодарен за то, что @kos говорит мне стараться не порождать подоболочку),sudo apt-get update && sudo apt-get upgrade
команды в качестве примера, которые мы хотим выполнить и записать здесь. Можно обмениваться этой целой частью с тем, что Вы любите. |&
("канал"), перенаправляет оба потока вывода (ошибка STDERR/standard и вывод STDOUT/standard) команды, оставленной его STDIN (стандартный вход) команды справа. (благодарен за то, что @muru учит меня &
перенаправить и STDOUT и STDERR)tee output.txt
копии все это читает от STDIN до STDOUT и также сохраняет его к output.txt
. Если конечный файл уже будет существовать, то он будет перезаписан тихо. Можно добавить в файл вместо этого, если Вы используете tee -a output.txt
.