Почему «cp» не работает в этом сценарии оболочки? - PullRequest
2 голосов
/ 05 января 2009

Вот фрагмент кода из сценария оболочки, который я написал:

for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
do
    src=$(basename ${src})
    dest="~/.${src}"
    copy="${src} -> ${dest}"
    cp $src $dest && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
done

По какой-то причине cp не выполняется. Например, в случае, когда $src='bashrc', я получаю эту ошибку:

cp: ~/.bashrc: No such file or directory

Я не понимаю, почему это происходит, потому что, очевидно, ~/.bashrc это пункт назначения , а не источник, поэтому cp не должно волновать, существует он или нет. Что именно идет не так?

Ответы [ 3 ]

10 голосов
/ 05 января 2009

Попробуйте использовать $HOME вместо ~/ в качестве домашнего каталога.

dest="$HOME/.$src"

Кроме того, вы можете заключить в кавычки переменные $src и $dest, если в любых имен файлов есть пробелы.

cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
7 голосов
/ 05 января 2009

"~" не раскрывается в вашем домашнем каталоге, когда появляется в двойных кавычках. Вместо этого используйте "${HOME}/.${src}". Также рассмотрите возможность использования другого подхода, который будет работать, когда имена файлов содержат пробелы (о, мне просто нужно подумать обо всех моих глупых mp3-файлах с пробелами в них!) Вместо того, чтобы делать

for src in $(find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc)
do
    # ...
done

Предпочитают

find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
do
    # ...
done

Итак, комбинируя @sirlancelots и мои пробелы, мы получаем:

find . -type f -maxdepth 1 \! -name ${deploy} \! -name gvimrc | while read src
do
    src=$(basename "${src}")
    dest="${HOME}/.${src}"
    copy="${src} -> ${dest}"
    cp "$src" "$dest" && echo -e "${ok} ${copy}" || echo -e "${fail} ${copy}"
done
5 голосов
/ 05 января 2009

Вы избежали ~, и поэтому он не будет расширен, а cp не знает, как это сделать.

С

dest=~/".${src}"

Баш должен сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...