Эта команда, если она запускается одна, дает ожидаемый результат (последняя строка crontab):
tail -n 1 /etc/crontab
Однако, когда я запускаю его как часть команды echo для отправки результата в файл, он добавляет сводку всех файлов в рабочем каталоге плюс ожидаемый результат:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
Почему эта команда создала дополнительные данные?
echo
для тебя делает? Рассмотрим такжеtail -n 1 /etc/crontab | sudo tee /path/to/file >/dev/null
echo $(stuff)
?Ответы:
В строке crontab есть одна или несколько звездочек
*
, указывающих «в любое время». Когда эта строка подставляется из подстановки команд, результат выглядит примерно так:В то время как большинство дальнейшие разложения не применяются к выходу подстановки команд, расширение путь является (как это поле разложения) :
Расширение пути - это то, что превращается
*.txt
в список совпадающих имен файлов (глобализация), где*
совпадает все. Конечным результатом является то, что вы получаете каждое (не скрытое) имя файла в рабочем каталоге, указанное для каждого*
в строке crontab.Вы можете исправить это, заключив в кавычки расширение, если код, который вы разместили, был представителем более сложной команды:
но проще говоря просто потерять
echo
полностьюЭто должно делать то, что вы хотите, и это также проще (единственное другое отличие материала в том, что в этой версии пропущено разделение полей, которое в противном случае произошло бы, поэтому пробелы не будут свернуты).
источник
tail -n -1 /etc/crontab | sudo tee /path/to/file
это, как я обнаружил, наименее подверженный ошибкам способ перенаправления вывода в файлы, требующие привилегий суперпользователя.Давайте рассмотрим каталог с этими файлами:
Теперь давайте запустим команду tail:
Выше - последняя строка,
crontab
и это то, что мы ожидаем. Однако:Двойные кавычки устраняют эту проблему:
Без двойных кавычек результат подстановки команды раскрывается оболочкой. Одним из расширений является расширение пути . В приведенном выше случае это означает, что
f*
он расширяется, чтобы соответствовать каждому имени файла, начинающемуся сf
.Если вы явно не хотите расширения оболочки, поместите все переменные оболочки и / или подстановки команд в двойные кавычки.
источник
Механизм globing shell расширится
*
до локального файла.Строка crontab, скорее всего, будет
*
заполнителем для любого.например, эта строка в crontab работает в воскресенье в 7.47, первая звезда означает любой день, вторая - любой месяц.
тогда вы
tail
и выпускаетеэто расширится
*
до локального файла.источник