我需要從root
用戶運行命令,但在gameservice
用戶上運行。不幸的是,它PATH
沒有與NVM
bin 目錄結合在一起,因此node
不是一個命令。
PATH
我已經設法通過像這樣直接在命令中導出來使其工作,但它很醜陋。
su gameservice -l -c "export PATH='$PATH:/home/gameservice/.nvm/versions/node/v13.7.0/bin/' && cd universalgame-server && ./node_modules/.bin/babel src -d dist --source-maps"
但是當我嘗試玩弄東西時,我可以證明我.profile
和我的.bashrc
文件都被執行了。
root
如果我只是以和 的su gameservice -l
使用者身分登錄echo $PATH
,則裡面有 nvm bin 目錄。
我想我只是缺少一些有關 bash 工作原理的基本知識,有人可以發現我的錯誤嗎?
答案1
這裡的問題是bash
作為非互動式 shell 呼叫。根據bash
手冊頁:
互動式shell 是一種不含非選項參數(除非指定-s)且不帶-c 選項的shell,其標準輸入和錯誤都連接到終端(由isatty(3) 確定),或者是一種以-啟動的shell。如果 bash 是互動式的,則設定 PS1 且 $- 包括 i,從而允許 shell 腳本或啟動檔案測試此狀態。
在 Ubuntu 中,預設.bashrc
以這些行開頭:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
所以.bashrc
確實被處決了,但決定立即退出。如果刪除這些行,PATH
變數將設定為.bashrc
檔案中的內容,並且您將能夠運行該node
命令。
在我看來,更好的方法是編寫一個腳本,在其中設定所有必要的環境,並執行所需的命令,然後以使用者的名義執行該腳本。無論如何,這都會起作用,並且您不會依賴使用者目錄中的任何啟動檔案。