Intereting Posts
Как понять и смягчить удаленные атаки Evil DNS в Linux-системах? Использование dd в Mac OS: conv = fsync эквивалент? Настроить экран GNU для повторного подключения к текущей ширине терминала при повторном подключении? Поддерживается ли спрятанное дерево устройств в Sparc 32-порте ядра Linux? передача результатов команды awk в качестве параметра Добавить обложку альбома в файл mp3 / ogg из командной строки в пакетном режиме? Рекурсивно переименовать подкаталоги, соответствующие регулярному выражению Устройство ввода аудио (A2DP) Bluetooth Убедитесь, что команда выполнена в bash CUPS не показывает мне принтеры, кроме как с храброго браузера Настройка DHCP для контейнеров LXC Все, что есть _not_ символическая ссылка Как создать заголовок Linux для вновь скомпилированного ядра? Fedora 23, как избежать переключения ctrl + shift с другими клавишами Ctrl + shift? Как sh -e взаимодействует с &?

Попытка cp пути с пробелами не работает при написании сценария, но повторение и вставка выполняется успешно?

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

Когда я запускаю скрипт, я получаю использование для cp :

 usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory 

Однако, если я повторяю команду, это выглядит совершенно правильно. И даже если я затем скопирую и вставляю эту эхо-строку обратно в терминал, она выполняется отлично!

 rm -rf Payload mkdir Payload echo cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app 

Я затрудняюсь понять, почему он не будет работать должным образом в Bash, но вручную вставляет команду обратно в работу безупречно. Более того, я не могу даже сказать, в чем проблема, потому что он отлично работает, когда я делаю это вручную (однако я, очевидно, подозреваю пробелы). Код выхода из cp равен 64, если это вообще помогает.

$APP_PROTOTYPE выглядит как .golden_repo/Production\ Releases\ Only/Kiosk/1.0.3/Prototype/Kiosk.app , и обратите внимание, что .golden_repo – это смонтированный smbfs-ресурс.

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

 cp -Rf "$APP_PROTOTYPE/" "Payload/${BUNDLE_NAME}.app" 

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

Выход echo не означает, что команда должна работать должным образом. В отличие от cp , который имеет дело с именами путей, echo отлично справляется с одним аргументом, становящимся несколькими из-за расщепления слов:

 echo 'ab' 

а также

 echo ab 

должны произвести одинаковый результат.