zshでいくつかのエイリアスを動的に宣言する方法は?

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/

何が問題なの?私のスクリプトに特別な権限を与える必要がありますか?

ベストアンサー1

問題の1つは、親シェルに影響を与えない別のシェルプロセスでコードスニペットを実行することです。これは のような問題です。シェルスクリプトで「エクスポートされた」環境変数をどのように保存しますか?。使用する必要がありますsource.同じシェルでスクリプトを実行するために組み込まれています(名前の下でも利用可能)。

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 foofoo


bash ユーザーがこのスレッドを見た場合: エイリアスされたメソッドは次のとおりです。

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

方法CDPATH

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

おすすめ記事