Zsh

在 ZSH 上創建一個別名,但需要輸入兩次

  • November 13, 2021

我正在嘗試在 ZSH 上創建別名。

別名的目的是啟動 python virtualenv。

我已經在我的.zshrc

alias SOU="source /home/andykw/.zshrc && source $(setopt extendedglob &&  ls -d .^git/)/bin/activate"

通常我需要通過啟動其中一個文件夾中的虛擬環境來更改虛擬環境,然後切換到另一個文件夾並啟動另一個虛擬環境。

範例:假設我正在使用該文件夾flask_rest並且我必須處理另一個項目django_rest,我將需要停用flask_rest環境並啟動django_rest環境。

而不是用命令行執行幾次source <folder_name>/bin/activate然後轉到另一個文件夾source <another_folder_name>/bin/activate,我只需要鍵入SOU.

希望它使上下文更清晰。

PS:我正在使用帶有 Windows 子系統 Linux 的 Ubuntu。

如果您想要的只是在目前目錄樹中找到單個 ./.*/bin/activate文件並獲取它的別名,那麼您只需要:

alias SOU='source. */bin/activate'

如果 glob.*/bin/activate匹配多個文件,則只會獲取第一個文件。~/.zshrc每次打開新的非登錄互動式 shell 會話時都應該獲取文件,並且您可能不希望多次獲取文件。我建議你打開一個新問題來嘗試理解為什麼你似乎需要明確地獲取它。

聽起來你想要這樣的東西:

SOU() {
 set -o localoptions -o extendedglob
 local f
 for f (~/.zshrc ~/.(^git)/bin/activate(N.)) source $f || return
}

為了SOU獲取您的和在您的主目錄以外的隱藏目錄中~/.zshrc呼叫的任何文件(忽略它對我來說似乎沒有多大意義的事實)。bin/activate``.git

您可能還想添加Ur限定符以限制您擁有的文件,並且所有者可以讀取這些文件。

這定義了一個函式而不是一個別名。別名更適合 csh 使用者。Bourne-like shell 具有適當的程式結構,例如函式,儘管在某些極端情況下別名仍然有用,當您確實希望將其作為文本替換處理或如果別名需要在呼叫者的範圍內進行更改時,沒有這裡似乎就是這種情況。

您可以將該函式定義放在您的目錄中,也可以~/.zshrc將其作為可自動載入的函式添加到您的$fpath目錄之一中。詳情請參閱info zsh autoloading

在任何情況下,採購~/.zshrc都不會撤銷採購thosedirs/bin/activate文件所做的事情。它只是再次重做任何內容~/.zshrc(最終可能會撤消一些帶來的更改,bin/activate但這將是偶然的),如果其中一些更改是添加,它們最終會在其他問題中累積。

引用自:https://unix.stackexchange.com/questions/677226