CP не работает в сценарии, но работает в терминале

Использовать cp -P (капитал P), чтобы никогда не пересечь любую символьную ссылку и скопировать символьную ссылку вместо этого.

Это может быть объединено с другими опциями такой как -R скопировать иерархию каталогов — cp -RL пересечения все символьные ссылки на каталоги, cp -RP копии все символьные ссылки как таковые. cp -R мог бы сделать один или другой в зависимости от вариантов Unix; GNU cp (как найдено на CentOS) значения по умолчанию к -P.

Даже с -P, можно скопировать цель символьной ссылки на каталог на командной строке путем добавления a / в конце: cp -RP foo/ bar копирует дерево каталогов это foo точки к.

GNU cp имеет удобное -a опция, которая объединяется -R, -P, -p и немного больше. Это делает точную копию источника (в максимально возможной степени), сохраняя иерархию каталогов, символьные ссылки, полномочия, время изменения и другие метаданные.

7
03.12.2013, 00:39
3 ответа

Попытайтесь использовать $HOME/.drush... вместо ~/.drush.... "~" кажется, не расширен до Вашего корневого каталога.

11
27.01.2020, 20:16
  • 1
    Да, потому что ~ не расширен при заключении в кавычки. Конечно, аргументы cp действительно должен быть заключен в кавычки также, для предотвращения неожиданностей. –  derobert 02.12.2013, 15:19
  • 2
    ~/"quoted name" будет работать, также. –  Mark Plotnick 02.12.2013, 16:49

Тильда ~ символ для значения корневого каталога только работает в начале слова, в начале значения, присваиваемого, или (в целях присвоений ПУТИ) после двоеточия в присваиваемом значении. Это не должно быть заключено в кавычки.

С тех пор ~ расширен оболочкой, то, что Вы видите, о котором сообщают cp средства, что у Вас есть проблема расширения оболочки.

Здесь тильда в двойных кавычках, таким образом, она не расширена. Используйте любой из них:

DRUSH_ALIASES_PATH=~/".drush/${PROJECT_NAME}.aliases.drushrc.php"
DRUSH_ALIASES_PATH="$HOME/.drush/${PROJECT_NAME}.aliases.drushrc.php"
1
27.01.2020, 20:16

Используя bash можно также использовать внутреннюю строку subsitution через расширение параметра для замены символа тильды ~ со значением $HOME.

Не очень изящный, но могло быть полезным, если Вы не уверены в возможном ~ символ в строке пути к файлу, переданной Вам (не случай здесь).

unset HOME
HOME="$(eval 'echo ~')"

- cp ${DRUSH_ALIASES_EXAMPLE_PATH} ${DRUSH_ALIASES_PATH}
+ cp "${DRUSH_ALIASES_EXAMPLE_PATH/#\~/${HOME}}" "${DRUSH_ALIASES_PATH/#\~/${HOME}}"
0
27.01.2020, 20:16

Теги

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