Intereting Posts

Как объявить некоторые псевдонимы динамически в zsh?

Я хотел бы объявить несколько команд быстрого доступа для переключения между моими различными проектами кодирования, поэтому я придумал следующий сценарий.

projects=$(ls -d ~/Workspace/*/) prefix="/Users/myuser/Workspace/" for f in $projects do temp=${f#$prefix} temp=${temp/%\//} c="alias $temp='cd $f'" echo $c eval $c done 

Я помещал это в файл под названием .workspace-shotcuts.sh в моей домашней папке, затем я chmod +X .workspace-shotcuts.sh . когда я запускаю его, используя ./.workspace-shotcuts.sh я получаю

 alias project1='cd /Users/myuser/Workspace/project1/' alias project2='cd /Users/myuser/Workspace/project2/' 

в консоли. Но псевдонимы не объявляются ( zsh: command not found: project1 ).

Также в конце моего файла .zshrc я добавил /bin/sh .workspace-shotcuts.sh , который дает тот же результат, но все равно никаких псевдонимов.

Любое тело может сказать мне, что мне не хватает? Я хотел бы отметить, что я не отличный пользователь * nix, поэтому вам может потребоваться ELI5 для меня.

РЕДАКТИРОВАТЬ:

Мне было предложено использовать source , который я сделал, но вот сообщения об ошибках, которые я получаю:

 (eval):2: permission denied: /Users/myuser/Workspace/project1/ (eval):3: permission denied: /Users/myuser/Workspace/project2/ (eval):4: permission denied: /Users/myuser/Workspace/project3/ (eval):5: permission denied: /Users/myuser/Workspace/project4/ (eval):6: permission denied: /Users/myuser/Workspace/project5/ (eval):7: permission denied: /Users/myuser/Workspace/project6/ (eval):8: permission denied: /Users/myuser/Workspace/project7/ (eval):9: no such file or directory: /Users/myuser/Workspace/project1=cd /Users/myuser/Workspace/project1/\n/Users/myuser/Workspace/project2/\n/Users/myuser/Workspace/project3/\n/Users/myuser/Workspace/project4/\n/Users/myuser/Workspace/project5/\n/Users/myuser/Workspace/project6/\n/Users/myuser/Workspace/project7/ 

Что происходит? Есть ли какое-то специальное разрешение, которое мне нужно дать моему сценарию?

Одна из ваших проблем заключается в том, что вы выполнили свой фрагмент в отдельном процессе оболочки, который не влияет на родительскую оболочку. Это та же проблема, что и в: Как я могу заставить переменные среды «экспортироваться» в скрипт оболочки? , Вам нужно использовать встроенный source (также avilable под именем . ), Чтобы выполнить скрипт внутри той же оболочки.

 source ~/.workspace-shotcuts.sh 

Другая проблема заключается в том, что вы пытаетесь разобрать вывод ls . Не делай этого . В оболочках, таких как sh и bash, вы можете уйти от него, потому что запись $projects за пределами кавычек разделяет значение на новых строках, разделяющих имена файлов. Кроме того, что это фактически не работает: например, если имена файлов содержат пробелы, они будут разбиты на части, разделенные пробелами. В сценарии оболочки не анализируйте вывод ls , вместо этого используйте подстановочные знаки. Это довольно просто в zsh.

 projects=(~/Workspace/*/) for f in $projects; do … 

То, что вы делаете дальше, довольно запутанно. Здесь вам не нужна eval ; используя его, вы только ставите для цитирования неудач. Поскольку вы используете zsh, вы можете использовать модификатор истории t для извлечения последнего компонента пути, не достигнув конструкций манипуляции строкой: $f:t . Если имя файла содержит специальные символы, вы должны их защитить, и снова zsh делает это легко благодаря флагу расширения параметра q : ${(q)f} дает вам указанное имя файла, которое вы можете использовать в определении псевдонима.

 projects=(~/Workspace/*/) for f in $projects do alias $f:t="cd ${(q)f}" done 

Но на самом деле вы просто изобретаете cdpath плюс auto_cd . Поцарапайте все это и используйте

 setopt auto_cd cdpath+=~/Workspace 

Параметр auto_cd позволяет вам ввести имя каталога, чтобы изменить его, без необходимости вводить cd ‍ перед ним. cdpath представляет собой массив префиксов каталога, которые cd foo пытается, если в текущем каталоге нет подкаталога foo .


В случае, если пользователи bash видят эту тему: метод псевдонима будет

 projects=(~/Workspace/*/) for f in "${projects[@]}"; do f=${f%/} alias ${f##*/}="cd '${f//\'/\'\\\'\'}'" done 

и метод CDPATH будет

 CDPATH=$CDPATH:$HOME/Workspace shopt -s autocd