Сценарий Bash, не записывающий

Так, здесь я, играя с некоторыми сценариями удара, и существует что-то, что не работает:

#!/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 задачи? В целом, как я могу записать вывод всего сценария оболочки?

3
задан 14 February 2016 в 22:35

3 ответа

Если я понимаю Ваш вопрос правильно, можно использовать следующее:

#!/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> перенаправления STDOUT
  • 2> перенаправления STDERR

Примечание по sudo:
Это - вероятно, причина, почему Вы получили ошибки. При выполнении команды, для которой нужно sudo в сценарии это - хорошая идея поместить команду без sudo в сценарии и запущенный скрипт с sudo. Иначе необходимо было бы дать sudo пароль сценарию в некотором роде, который плох.


Править:
В следующем коде вывод обеих способных команд перенаправляется к update.log. Двойное > (>>) используется для добавления данных в файл (вместо того, чтобы заменить его)

#!/bin/bash

apt-get update &> update.log
apt-get -y upgrade &>> update.log

echo "all done"
9
ответ дан 1 December 2019 в 12:56

В целом, для входа вывода всего сценария перенаправьте вывод всего сценария:

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)
4
ответ дан 1 December 2019 в 12:56

Никакая потребность в сценарии, просто сделайте это в одной строке с помощью перенаправлений 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.
3
ответ дан 1 December 2019 в 12:56

Другие вопросы по тегам:

Похожие вопросы: