作者 主題: 請教/etc/profile和~/.profile  (閱讀 4918 次)

0 會員 與 1 訪客 正在閱讀本文。

thi

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
請教/etc/profile和~/.profile
« 於: 2011-07-27 09:31 »
昨天我在學習SHELL和環境變數時碰到一個問題。

目前使用BASH

/etc/profile --> 全域配置
~/.profile --> 個人配置(預設家目錄中存在)

這兩個都是login-shell,且後者的設定會取代前者。
OK,問題來了。若我想在/etc/profile設定PATH及PS1給全部的使用者,但~/.profile裏預設的PATH及PS1值則會取代前者,造成PATH及PS1的全域變數不起作用。若在~/.profile裏重設變數,那在/etc/profile設定全域變數不就沒有意義?要怎麼解決這個問題…

non-login shell會去讀取~/.bashrc,那non-login shell有全域變數的配置嗎?例如我在Gnome的終端機底下,個人的環境變數都配置好了。可是當我su或sudo,一些PATH什麼的又找不到,要怎麼處理這種問題?

這兩個問題是我目前碰到有疑問的,麻煩有經驗的網友能指導一下,謝謝!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5401
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 請教/etc/profile和~/.profile
« 回覆 #1 於: 2011-07-27 09:51 »
1. 每個人本來就可以改自己的設定. 後者蓋前者很正常吧.

好吧, 就算讓 ~/.profile 沒作用好了, 那.... 使用者自己打指令改不行嗎?

2. 要帶環境變數請用 'su -' 取代 'su'.

jou

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 4989
  • 性別: 男
    • 檢視個人資料
Re: 請教/etc/profile和~/.profile
« 回覆 #2 於: 2011-07-27 10:14 »
範例三:我要在 PATH 這個變數當中『累加』:/home/dmtsai/bin 這個目錄
[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin

您第一個的問題如果是要全域PATH 不要被取代掉,可以利用累加的方式解決。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17474
    • 檢視個人資料
    • http://www.study-area.org
Re: 請教/etc/profile和~/.profile
« 回覆 #3 於: 2011-07-27 10:29 »
在 /etc/profile 裡面加:
PATH=$PATH:$HOME/bin

thi

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 請教/etc/profile和~/.profile
« 回覆 #4 於: 2011-07-27 10:41 »
1. 每個人本來就可以改自己的設定. 後者蓋前者很正常吧.

好吧, 就算讓 ~/.profile 沒作用好了, 那.... 使用者自己打指令改不行嗎?

我知道個人配置的權限高於全域配置,我想問的是:

假設今天是一個多人使用的環境,軟體安裝在了類似 /opt/bin這類非標準執行路徑,管理者如何去設定一個新的全域PATH給所有的user,因為每個user家目錄中.profile裏的PATH會去取代全域變數。總不能去告訴每個user,登入後自行去修改.profile,或是設定新的PATH變數吧,尤其當碰到某些不會下指令、不會使用vi的user。

我覺得比較有問題是,.profile裏的PATH預設是
PATH=/usr/bin:/usr/sbin
這樣子的,而不是底下這種
PATH=$PATH:/usr/bin:/usr/sbin
若是第二種應該就不會有這種問題

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5401
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 請教/etc/profile和~/.profile
« 回覆 #5 於: 2011-07-27 10:57 »
假設今天是一個多人使用的環境,軟體安裝在了類似 /opt/bin這類非標準執行路徑,管理者如何去設定一個新的全域PATH給所有的user,因為每個user家目錄中.profile裏的PATH會去取代全域變數。總不能去告訴每個user,登入後自行去修改.profile,或是設定新的PATH變數吧,尤其當碰到某些不會下指令、不會使用vi的user。
為什麼你會認定使用者不會用 vi 去改 .profile?
如果不會, 那之前那一個你所謂會覆蓋掉全域設定的變數又是怎麼被 "改" 出來的? 預設的 .profile 可是不會有你所謂覆蓋全域設定的問題.

如果你認為那些很重要.... 可以試著要求使用者不要改或依照標準的方式來改....
不過, 使用者會不會真的照著做, 就不是你能控制的. (只能寫 script 定期去檢查並改回來?)

或者.... 寫幾個 script 放到 /usr/bin 或 /usr/local/bin 下頭, 再透過這些 script 去執行在 /opt/bin 下頭的程式.

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 請教/etc/profile和~/.profile
« 回覆 #6 於: 2011-07-27 11:10 »
CentOS 5.x

代碼: [選擇]
# .bash_profile
#.....

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

Ubuntu 10.04

代碼: [選擇]
# ~/.profile: executed by the command interpreter for login shells.
#....

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

我想其他的 linux 版本預設也都會做類似處理
只要處理好, 根本不會有變數被覆蓋的問題啊

thi

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 請教/etc/profile和~/.profile
« 回覆 #7 於: 2011-07-27 11:16 »
家目錄中預設的.profile檔

#
# Simple profile places /usr/gnu/bin at front,
# adds /usr/X11/bin, /usr/sbin and /sbin to the end.
#
# Use less(1) as the default pager for the man(1) command.
#
export PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin
export PAGER="/usr/bin/less -ins"

#
# Define default prompt to <username>@<hostname>:<path><"($|#) ">
# and print '#' for user "root" and '$' for normal users.
#
PS1='${LOGNAME}@$(/usr/bin/hostname):$(
    [[ "${LOGNAME}" == "root" ]] && printf "%s" "${PWD/${HOME}/~}# " ||
    printf "%s" "${PWD/${HOME}/~}\$ ")'

所以是這個預設檔案的錯?


Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 請教/etc/profile和~/.profile
« 回覆 #8 於: 2011-07-27 12:27 »
家目錄中預設的.profile檔

#
# Simple profile places /usr/gnu/bin at front,
# adds /usr/X11/bin, /usr/sbin and /sbin to the end.
#
# Use less(1) as the default pager for the man(1) command.
#
export PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin
export PAGER="/usr/bin/less -ins"

#
# Define default prompt to <username>@<hostname>:<path><"($|#) ">
# and print '#' for user "root" and '$' for normal users.
#
PS1='${LOGNAME}@$(/usr/bin/hostname):$(
    [[ "${LOGNAME}" == "root" ]] && printf "%s" "${PWD/${HOME}/~}# " ||
    printf "%s" "${PWD/${HOME}/~}\$ ")'

所以是這個預設檔案的錯?

這是..... Solaris ?  ::)

thi

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
Re: 請教/etc/profile和~/.profile
« 回覆 #9 於: 2011-07-27 18:46 »
家目錄中預設的.profile檔

#
# Simple profile places /usr/gnu/bin at front,
# adds /usr/X11/bin, /usr/sbin and /sbin to the end.
#
# Use less(1) as the default pager for the man(1) command.
#
export PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin
export PAGER="/usr/bin/less -ins"

#
# Define default prompt to <username>@<hostname>:<path><"($|#) ">
# and print '#' for user "root" and '$' for normal users.
#
PS1='${LOGNAME}@$(/usr/bin/hostname):$(
    [[ "${LOGNAME}" == "root" ]] && printf "%s" "${PWD/${HOME}/~}# " ||
    printf "%s" "${PWD/${HOME}/~}\$ ")'

所以是這個預設檔案的錯?

這是..... Solaris ?  ::)

真不愧是博士