bash: выполнение команд с пробелами в именах файлов

Иногда в качестве аргументов скрипту передаются имена файлов с пробелами. Пробелы, естественно, экранированы слешем \. Но, тем не менее, при подстановке аргумента в скрипте могут возникнуть проблемы. Например, если в такой скрипт передать имя файла с экранированными пробелами, это вызовет ошибку:

#!/bin/bash

rsync -avz /source/$1 rsync://192.168.0.1/dest/


Тем не менее, если просто выполнить в консоли…

rsync -avz /source/имя\ файла\ с\ пробелами rsync://192.168.0.1/dest/


… то проблем не возникнет.

Используем в скрипте такой трюк: временно меняем глобальную переменную IFS (в ней содержатся образцы разделителей), сменив разделитель на \n. Теперь bash будет рассматривать строку в переменной $1 как единое целое.

#!/bin/bash

tmpIFS=$IFS; IFS='\n'

rsync -avz /source/$1 rsync://192.168.0.1/dest/

IFS=$tmpIFS


Такой скрипт будет работать без проблем.

Комментарии (4)

RSS свернуть / развернуть
+
0
Проблеме обработки файлов с пробелами посвящено множество топиков на www.commandlinefu.com. Данный прием я там не встречал, полезный трюк.
avatar

yababay

  • 10 августа 2011, 17:49
+
0
а если в кавычки завернуть?
avatar

durman

  • 10 августа 2011, 20:19
+
0
И экранирование слэшами, и кавычки иногда помогают, иногда нет. Поэтому приходится химичить.
avatar

yababay

  • 10 августа 2011, 21:13
+
0
можно конечно, но как-то привычнее писать команду так, как ты ее запускаешь в терминале
avatar

Sergei_T

  • 11 августа 2011, 10:00

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.