У меня есть смущенный.Использование Bash для отправки списка разделенных пробелами файлов в Git
Я создаю скрипт Bash, который копирует файлы в ряд репозиториев, а затем добавляет их для фиксации. Файлы иногда содержат пробелы в именах файлов, поэтому их нужно указывать.
Я создал список имен файлов, разделенных пробелами, в переменной в Bash: $x
. Когда я бегу echo $x
я получаю это:
'test 01.sql' 'test 02.sql' 'test_03.sql'
Если я вручную запустить следующее (в соответствующий каталог), у меня нет никаких проблем:
git add 'test 01.sql' 'test 02.sql' 'test_03.sql'
Но в моем сценарии, если Я запускаю:
git add $x
или git add "$x"
или git add "${x}"
, я получаю смертельную ошибку pathspec от Git.
фатальным: pathspec «» тест 01.sql «„тест 02.sql“„test_03.sql“» не найдено ни одного файла
Я пробовал как одиночные и двойные кавычки строки с нет разницы.
Пример упрощен. Полная версия использует абсолютные пути к файлам.
'/Volumes/HardDrive/Repo/queries/test 01.sql' '/Volumes/HardDrive/Repo/queries/test 02.sql' '/Volumes/HardDrive/Repo/queries/test_03.sql'
Он работает, когда вторит из сценария и вставить вручную в мерзавец добавить команду, но не работает, когда передаются из переменных в скрипте.
Чтобы лучше понять, почему Баш ведет себя так, как это делает, считает чтение http://mywiki.wooledge.org/BashParser. Или, чтобы сделать сразу уместную точку: Цитаты из расширения переменной всегда являются данными, а не синтаксисом, поскольку расширения происходят только после того, как * синтаксический синтаксический анализ завершен. (Это на самом деле является обязательным для правильности: если бы это было не так, было бы невозможно написать сценарии оболочки, безопасно обрабатывающие ненадежные данные). –
http://mywiki.wooledge.org/BashFAQ/050 также имеет прямое отношение. –
Кстати, откуда взялся ваш «список имен файлов, разделенных пробелами»? Если вы создаете его с помощью строковых манипуляций, код, генерирующий этот список, наверняка имеет тонкие ошибки, которые могут быть использованы с соответствующими созданными именами файлов. (Имена файлов разрешены для размещения буквенных символов кавычек, буквенных строк новой строки - ничего, кроме NUL, поэтому имя, содержащее буквенные символы '' ', может потенциально избежать его команд цитирования и запуска, иначе' ''$ $ (rm -rf.)" ', были наивно цитируемой строкой' eval''d). –