Отображение хвостовой команды приводит к неожиданному результату?

Обходной путь - вычислить смещение раздела BSD в логическом разделе и использовать устройство цикла с смещение:

mount -t ufs -o loop,offset=8192,ro,ufstype=ufs2 /dev/sda6 /mnt
8
16.04.2019, 15:43
3 ответа

Механизм глобусной оболочки расширится *до локального файла.

Строка

crontab, вероятно, будет иметь *в качестве заполнителя для любого.

напр. эта строка в crontab запускается в 7:47 утра в воскресенье, первая звездочка означает любой день, вторая - любой месяц.

47  7 * * 0 /run/on/sunday

тогда вы tail, и выдаете

echo 47  7 * * 0 /run/on/sunday

, который расширит *до локального файла.

4
27.01.2020, 20:08

В вашей строке crontab есть одна или несколько звездочек *, что означает «в любое время». Когда эта строка подставляется из подстановки команды, результат будет примерно таким:

echo * * * * * cmd > /path/to/file

В то время как большинство дополнительных расширений не применяются к выходным данным подстановки команд, расширение имени пути равно (, как и разделение полей):

The results of command substitution shall not be processed for further tilde expansion, parameter expansion, command substitution, or arithmetic expansion. If a command substitution occurs inside double-quotes, field splitting and pathname expansion shall not be performed on the results of the substitution.

Расширение пути — это то, что превращает *.txtв список совпадающих имен файлов, (объединяющих ), где *соответствует всему. Конечным результатом является то, что вы получаете каждое (не -скрытое )имя файла в рабочем каталоге, указанное для каждого *в вашей строке crontab.


Вы можете исправить это, процитировав расширение, если опубликованный вами код представляет собой более сложную команду:

sudo bash -c 'echo "$(tail -n 1 /etc/crontab)" > /path/to/file'

, но проще просто потерять echoполностью:

sudo bash -c 'tail -n 1 /etc/crontab > /path/to/file'

Это должно делать то, что вы хотите, и это также проще (единственное другое существенное отличие состоит в том, что в этой версии будет пропущено разбиение полей, которое в противном случае произошло бы, поэтому ряды пробелов не будут свернуты ).

22
27.01.2020, 20:08

Рассмотрим директорию с этими файлами:

$ ls
crontab  file1  file2  file3
$ cat crontab
f*

Теперь запустим команду tail:

$ tail -n 1 crontab
f*

Это последняя строка crontab, и это то, что мы ожидаем. Однако:

$ echo $(tail -n 1 crontab)
file1 file2 file3

Двойные -кавычки устраняют эту проблему:

$ echo "$(tail -n 1 crontab)"
f*

Без двойных -кавычек результат подстановки команды расширяется оболочкой. Одним из расширений является расширение имени пути . В приведенном выше случае это означает, что f*расширяется, чтобы соответствовать каждому имени файла, начинающемуся с f.

Если вы явно не хотите расширения оболочки, заключайте все переменные оболочки и/или подстановки команд в двойные кавычки.

5
27.01.2020, 20:08

Теги

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