Я написал простой скрипт для обхода каталога моих проектов разработки и добавления ярлыка-псевдонима для каждого из них:
shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
find ~/development/* -prune -type d | while IFS= read -r d; do
cur_dir="${d##*/}"
cmd="alias ${cur_dir}=\"code $d\""
echo "executing: $cmd"
$cmd
done
И вывод выглядит так:
executing: alias project-1="code /home/my_user/development/project-1"
./alias_for_projects.sh: line 6: alias: /home/my_user/development/project-1": not found
...
Если я скопирую и выполню команду:
alias project-1="code /home/my_user/development/project-1"
он просто работает... Как мне исправить мой скрипт?
решение1
У вас две проблемы:
Трудно бежатькоманда, сохраненная в переменной.Но вам не обязательно сохранять команду в переменной. Вы можете просто сделать это
alias "${cur_dir}"="code $d"
там, где вы запускаете$cmd
.Вы работаете
alias
в подоболочке. Bash запускает конвейерные команды в подоболочке (если неlastpipe
установлено). Но вам не нужен конвейер (илиfind
что-то еще). Вы можете просто использовать обычную подстановку (которую вы уже используете, так что этоfind
имеет еще меньше смысла).
В совокупности:
shopt -s dotglob
for d in ~/development/*/; do # trailing slash - only directories match
cur_dir="${d%/}" # strip trailing slash
cur_dir="${cur_dir##*/}"
alias "${cur_dir}"="code $d"
done
решение2
Прочитав все комментарии, я исправил свой скрипт следующим образом:
shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
while IFS= read -r d; do
cur_dir="${d##*/}"
#echo "${cur_dir}"="code $d"
alias "${cur_dir}"="code $d"
done <<<$(find ~/development/* -prune -type d)