Вот рефакторинг, который пытается исправить очевидные проблемы. Подробнее см. Комментарии с # ...
. Вероятно, также проверьте с помощью http://shellcheck.net/, прежде чем обращаться за помощью.
Непосредственной причиной сообщения об ошибке является то, что $("$file" ...)
действительно пытается запустить $file
как команду и захватить его вывод. Вы, вероятно, имели в виду $(echo "$file" ...)
, но этого часто можно избежать.
#!/bin/bash
dotfiles=()
readarray -d '' dotfiles < <(find . -type f ! -path '*/.git/*' ! -name "README.md" -type f -print0)
# ... Fix broken quoting throughout
for file in "${dotfiles[@]}"; do
dir=$(dirname "$file" | sed "s#^\.#$HOME#") # ... 1 is not required or useful
# ... Use standard error for diagnostics
[ ! -d "$dir" ] && echo "$0: directory $dir does not exist!" >&2 && mkdir -p "$dir"
# Create path strings
# ... Use parameter substitution
real=$PWD/${file#./}
symlink=$HOME/${$file#./}
# ... You mean $real, not $cur?
echo "Real path: $real"
# ... You mean $symlink, not $new?
echo "Symbolic link path: $symlink"
done
# ... No need to explicitly exit; trust me, you will anyway
#exit
Это просто синтаксические c исправления; Я бы, вероятно, избегал хранить результаты из find
в массиве и просто l oop поверх них напрямую, и я не проверял, действительно ли logi c делает то, что (мы могли бы догадаться) вы, возможно, пытаетесь сделать .
См. Также Цикл по парам значений в bash для аналогичных topi c и Когда заключать в кавычки переменную оболочки? .
У скрипта все еще есть досадное предположение, что он будет запущен в каталоге dotfiles. Вероятно, лучшим решением было бы явно запустить find
в этом каталоге и соответственно выполнить рефакторинг.
sed 's/x/y/'
заменит первое вхождение x
на y
в каждой строке по определению и по дизайну ; нет причин или необходимости явно добавлять 1
после последнего разделителя. (Некоторые варианты sed
позволяют номеру выбрать другое совпадение, чем первое, но это не переносимо; и, конечно, указывать первое совпадение, когда оно уже установлено по умолчанию, просто глупо. Существует флаг g
для замены все совпадения, а не только первые, которые многие новички хотят использовать везде, но, конечно, это тоже не обязательно и не полезно.)