Выполнить команду, хранящуюся в переменной $

Я написал скрипт, в котором написал:

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"

Но та же ошибка вывода. Есть идеи, чтобы решить проблему? спасибо.

6
задан 26 April 2016 в 21:40

3 ответа

Вместо того, чтобы использовать простые строки, создайте свою команду с помощью массивов. Массивы обеспечивают удобный интерфейс: Если 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[@]}"
6
ответ дан 27 April 2016 в 07:40
  • 1
    Пока мы не знаем лучше, я отредактировал свой ответ для добавления абзаца (если исходный вопрос о живой и персистентной живой системе). – sudodus 24 September 2017 в 05:39

точка jackman's glenn хорошо взята. Но, для решения непосредственного варианта использования, как насчет обратных галочек? Как так:

`echo $COMMAND`

, Например, это работает:

COMMAND='ls /'
`echo $COMMAND`
1
ответ дан 27 April 2016 в 07:40
  • 1
    Спасибо. Таким образом, я думаю, что проблема могла бы состоять в том, потому что Это были Параллели VM. – Prasad 9 November 2017 в 13:14

Для более подробных объяснений о том, как Bash интерпретирует пробелы, я рекомендую считать это: переменные Bash и замена команды

Чистое решение

, Расширяющее переменную, может привести к неожиданным и иногда катастрофическим результатам, если переменная содержит специальные символы:

user@host:~$ do_something $some_variable

Расширение переменной в двойных кавычках может предотвратить такие проблемы:

user@host:~$ do_something "$some_variable"

Объяснение

случай, с которым встречаются здесь, описан в конце сообщения:

опасности неупомянутых переменных

В идеальном мире, все сохранили бы их строковые значения короткими и без пространства/новой строки или любых других специальных символов.

[...]

, Но когда люди начинают добавлять, специальные символы к именам файлов, таким как пробелы, разворачивая переменные, без использования двойных кавычек, могут быть опасными.

[...]

, Таким образом, основная еда на дом здесь: двойная кавычка Ваши ссылки на переменную каждый раз, когда возможный .

1
ответ дан 27 April 2016 в 07:40
  • 1
    @sudodus у меня есть установленная система на 32 ГБ pendrive. Что Вы описываете, изменение моей системы, чтобы быть в состоянии загрузить в BIOS и в UEFI походит на то, что я хочу, но ссылка, которую Вы предусматриваете, который, кажется, для создания установки таким образом, не изменяя существующую систему, чтобы быть в состоянии загрузиться в обоих режимах? – Ben Sakac 24 September 2017 в 09:38

Другие вопросы по тегам:

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