2012-04-13 2 views
1

Я пытаюсь создать инструмент, который определяет функции в zsh, основанные на некоторых именованных каталогах. В настоящее время у меня есть это:Определение функций zsh в цикле переназначает pre

while read line; do 
    p=(`echo $line | egrep -o -e "[^ ]+"`) 
    alias go${p[1]}="cd ${p[2]}" 
    put${p[1]}() 
    { 
     mv $1 ${p[2]} 
    } 
done < "$HOME/.pro_targets" 

, который работает для псевдонимов, но набрав поставил [цель] в командной строке дает мне

mv: cannot mv 'wol.sh' to '$HOME/work/tagfs/fuse-tutorial/src': No such file or directory

который относится к последнему значению $p. Я думаю, мне нужна функция, чтобы закрыть переменную ${p[2]} и заменить ее на окружающую среду, когда она была определена, поэтому она может варьироваться в зависимости от каждого определения.

+2

$ HOME не получает расширена, и она ищет пути буквально под названием «$ HOME/работа/... –

ответ

0

Если у вас нет каталога, буквально названного '$ HOME' в текущем рабочем каталоге, это не похоже на реальный каталог.

Произошло то, что замена содержимого (то есть перевода $ HOME->/home/username) не происходила в содержимом файла.

Try:

envsubst < "$HOME/.pro_targets" | \ 
    while read line; do 
     p=(`echo $line | egrep -o -e "[^ ]+"`) 
     alias go${p[1]}="cd ${p[2]}" 
     put${p[1]}() 
     { 
      mv $1 ${p[2]} 
     } 
    done 

Если вы хотите только $ HOME, чтобы работать, попробуйте

env -i HOME="$HOME" envsubst < "$HOME/.pro_targets" | ...