su user -l 和 su user -l -c "cmd" 不會給出相同的結果

su user -l 和 su user -l -c "cmd" 不會給出相同的結果

我需要從root用戶運行命令,但在gameservice用戶上運行。不幸的是,它PATH沒有與NVMbin 目錄結合在一起,因此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命令。

在我看來,更好的方法是編寫一個腳本,在其中設定所有必要的環境,並執行所需的命令,然後以使用者的名義執行該腳本。無論如何,這都會起作用,並且您不會依賴使用者目錄中的任何啟動檔案。

相關內容