Я написал скрипт, в котором написал:
COMMAND="/usr/bin/exiftool $PATH_NAME" .... code .... $COMMAND
Переменная $ PATH_NAME назначается динамически в цикле while. Команда работает нормально, пока не встретит файлы с пробелами (например, PATH_NAME = "Add Driver.png"). Вывод консоли:
File not found: ./Add File not found: driver.png
Команда должна быть:
/usr/bin/exiftool ./Add driver.png
Я думаю, что проблема заключается в пробелах в $ PATH_NAME. Я пытался также выполнить непосредственно команду:
eval "/usr/bin/exiftool $PATH_NAME"
Но та же ошибка вывода. Есть идеи, чтобы решить проблему? спасибо.
Вместо того, чтобы использовать простые строки, создайте свою команду с помощью массивов. Массивы обеспечивают удобный интерфейс: Если a
массив, затем "${a[@]}"
(отметьте кавычки), расширяется в каждый элемент a
, без дополнительного полевого разделения или globbing (таким образом, пробелы и вещи как подстановочные знаки, должны остаться неповрежденными).
Пример:
$ a=(printf "|%s|\n" "foo bar" "*")
$ echo ${a[@]}
printf |%s|\n foo bar bin boot dev etc home lib lib64 lost+found mnt opt proc root run sbin srv sys tmp usr var
Отметьте как *
был расширен, и как дополнительные пространства между foo
и bar
были потеряны. Но с "${a[@]}"
, они сохраняются:
$ echo "${a[@]}"
printf |%s|\n foo bar *
Это идеально для создания команд. Теперь, можно сделать:
$ "${a[@]}"
|foo bar|
|*|
Видеть? Аргументы были сохранены отлично.
Так, сделайте:
COMMAND=(/usr/bin/exiftool "$PATH_NAME")
"${COMMAND[@]}"
точка jackman's glenn хорошо взята. Но, для решения непосредственного варианта использования, как насчет обратных галочек? Как так:
`echo $COMMAND`
, Например, это работает:
COMMAND='ls /'
`echo $COMMAND`
Для более подробных объяснений о том, как Bash интерпретирует пробелы, я рекомендую считать это: переменные Bash и замена команды
Чистое решение
, Расширяющее переменную, может привести к неожиданным и иногда катастрофическим результатам, если переменная содержит специальные символы:
user@host:~$ do_something $some_variable
Расширение переменной в двойных кавычках может предотвратить такие проблемы:
user@host:~$ do_something "$some_variable"
Объяснение
случай, с которым встречаются здесь, описан в конце сообщения:
опасности неупомянутых переменных
В идеальном мире, все сохранили бы их строковые значения короткими и без пространства/новой строки или любых других специальных символов.
[...]
, Но когда люди начинают добавлять, специальные символы к именам файлов, таким как пробелы, разворачивая переменные, без использования двойных кавычек, могут быть опасными.
[...]
, Таким образом, основная еда на дом здесь: двойная кавычка Ваши ссылки на переменную каждый раз, когда возможный .