我應該使用什麼程式碼將我的腳本下載並安裝到使用者 PATH 中的使用者可寫目錄中(不需要 sudo)?
編輯:我說的地方 $ HOME/.bin I should have written $ HOME/bin 或任何等價物都可以。IE,使用者路徑中的任何使用者可寫目錄。
所以我有一個 bash 腳本,我將其作為我的 API 的客戶端進行分發。目前版本是這樣安裝的
curl -s http://api.blah.com/install | sudo sh
。我可能會嘗試處理六個不同的包管理系統,以便它們可以apt-get
或brew install
在某個時候,但現在我將使用單線,因為我希望這個解決方案適用於多個系統。但是,顯然在 cygwin 甚至 Mac 等系統上,有不少使用者根本沒有 sudo 或沒有設置它。場景是使用者註冊我的 API,輸入他們的信用卡資訊。我有一個用於 API 的 bash 客戶端,它兼作參考實現,也是一種嘗試 API 或使用命令行部署 VM 和 Docker 容器的方法。我想為使用者創建一種簡單的方法來安裝 API 客戶端。
例如,曾經有一個 npm 的單行安裝
curl http://npmjs.org/install.sh | sh
。homebrew 也有一個單行安裝程序ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
(參見http://brew.sh)。我的安裝腳本只是下載 API 客戶端腳本並將其放入 /usr/bin 並使其可執行。但是我正在考慮基於 sudo 的問題以及實際上不需要全域安裝的事實,我想將其安裝到使用者的 $ HOME/.bin or $ HOME/local/bin (如果沒有現有的等價物,則創建它)。
這是我目前的安裝腳本:
#!/bin/bash BASE="https://api.blah.com" sudo bash -c "curl -s $BASE/mycmd > /usr/bin/mycmd" sudo chmod uga+x /usr/bin/mycmd
我想到的第一個問題是現在很多使用者都在使用 zsh。因此,如果我在 ~/.bashrc 中添加或修改更新 PATH 以包含 $HOME/.bin 的行,那將不適用於這些系統。
因此,為了重申這個問題,我應該使用什麼程式碼來下載我的腳本並將其安裝到該使用者的 PATH($HOME/local/bin,或預設情況下在 PATH 中可用的任何內容)目錄中的使用者可寫目錄中,並確保這是在他們的 PATH 中,要求(或至少強烈希望)這將適用於幾乎每個人的系統(如果他們有類似 Unix 提示符的東西)(不需要 sudo)?
由於有些人認為修改 PATH 是邪惡的,我想安裝在該系統的預設 $HOME/whatever/bin 中,如果可能的話,它已經在使用者的 PATH 中,而不是自動修改他們的 PATH 以包含一些特定的目錄。
非常感謝!
將自己注入使用者環境的程序有一個詞:病毒。
只需安裝到 ~/bin/(手動安裝腳本的歷史事實標準)或 ~/.local/bin/(由非 root 包管理器安裝的腳本的現代、準形式標準)。通常,使用者友好的發行版已經在 $PATH 中有一個或兩個。
或者更好的是,互動式地提示使用者輸入安裝前綴。
你為什麼不直接查詢 $ PATH in the script itself? Check whether the user has any directories in their $ 他們可以寫入的 PATH(通常是
~/bin
或~/.local/bin
)。如果他們這樣做,很好,安裝在那裡。如果他們沒有,那麼你提示。我相信如果目錄存在,某些發行版(例如 Ubuntu)會~/bin
自動添加到 $PATH 中,但您不能假設總是如此。
~/.profile
您唯一的其他選擇是通過編輯由許多 shell提供的任何目錄添加到 $PATH 中。忘了~/.bashrc
,它不僅是特定於 bash 的,而且 $PATH 首先沒有設置任何業務。但是,像這樣編輯全域變數並不是一件好事。最好的辦法是檢查可寫目錄並提示是否找不到。