Bash

腳本中的路徑與實際路徑不同

  • June 2, 2022

當我echo $PATH在終端視窗中時,它會輸出:

/home/charles/anaconda3/bin:
/home/charles/anaconda3/condabin:
/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
/usr/local/games:/snap/bin:/snap/bin:
/home/charles/.emacs.d/bin

但是當我執行腳本時(不是以 root 身份):

#!/bin/sh
echo $PATH

它只輸出根路徑,而不是我的主目錄中的路徑:

/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
/usr/local/games:/snap/bin:/snap/bin

我正在嘗試spyder從腳本啟動,該腳本來自:

$ which spyder
/home/charles/anaconda3/bin/spyder

有沒有辦法讓腳本辨識我的主目錄中的路徑部分?

已解決:我將添加的程式碼emacsanaconda路徑從~/.bashrcto 移到~/.profile.

您的腳本在子 shell 中執行 - 這意味著它是由您的互動式/登錄 shell 生成的。子shell 是為執行腳本/程序的明確目的而產生的shell。子shell 的規則之一是它可以訪問*“父shell”*設置的全域變數,但不能訪問局部變數。

這表明/home/...變數是局部變數,這意味著您將它們設置在某處/以某種方式 - 也許在~/.bashrc

解決方案是您必須在腳本中聲明本地 PATH 變數。你可以這樣做:

export PATH="$PATH:/home/charles/anaconda3/bin:/home/charles/anaconda3/condabin:/home/charles/.emacs.d/bin"

此 PATH 現在對於您的腳本/子 shell 來說是本地的,並且不會作為全域變數傳播。

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