Имя файла по какой-то причине имеет звездочку - оно не будет изменено и содержимое не будет выполнено

Используйте параметр оболочки dotglob:

shopt  -s dotglob
echo *

Для получения дополнительной информации см. Руководство по bash: http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

3
14.07.2018, 21:38
1 ответ

Джесси _b уже ответил на вопрос, но я думаю, что стоит развеять некоторые возможные заблуждения.

В оболочке есть символы, которые имеют особое значение при определенных условиях. Например,:|используется в конвейерах, >в перенаправлениях, \для экранирования символов и т. д. Эти символы не интерпретируются оболочкой буквально, поэтому, когда вы делаете echo foo>bar, foo>barвыигрывает. t будет распечатан на вашем терминале, но fooбудет перенаправлен в файл bar.

К счастью, оболочка также имеет механизм, который заставляет эти символы терять свое особое значение :цитирования. В оболочках POSIX есть 3 механизма цитирования:

  • Обратная косая черта\:сохраняет буквальное значение следующего символа, за исключением <newline>.
  • Двойные -кавычки"...":сохраняет буквальное значение всех символов в двойных -кавычках, за исключением символов `, $и \.
  • Одинарные -кавычки'...':сохраняет буквальное значение каждого символа в одинарных -кавычках, без исключений.

Итак, следуя предыдущему примеру, если бы мы хотели напечатать foo>barбуквально, мы могли бы сделать:

  • echo foo\>bar
  • echo "foo>bar"
  • echo 'foo>bar'

Звездочка *— один из этих специальных символов, он является частью нотации сопоставления с образцом и используется для расширения имени файла . Другими словами, такие команды, как echo *.txt, заменят шаблон файлами, которым шаблон соответствует.

В вашем случае cron_daily/wp_cli.sh*соответствует только cron_daily/wp_cli.sh, поэтому mvвидит 2 одинаковых аргумента и жалуется на это. Это нормально, потому что файла cron_daily/wp_cli.sh*нет. Но если бы у вас был реальный файл cron_daily/wp_cli.sh*и другие файлы, которые можно было бы сопоставить с шаблоном, mvне удалось бы.

Рассмотрим следующий сценарий:

$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3

Если я попытаюсь переименовать file*без использования кавычек:

$ mv file* new_file
mv: target 'new_file' is not a directory

Это потому, что это аргументы, которые получает mv, поэтому ожидается, что new_fileбудет каталогом:

$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]

Чтобы успешно переименовать file*, мне нужно заключить этот аргумент в кавычки:

$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file
9
27.01.2020, 21:07

Теги

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