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