一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

理解 bashrc 和 profile

 waston 2017-01-03

在一般的 linux 或者 unix 系統(tǒng)中, 都可以通過編輯 bashrc 和 profile 來設置用戶的工作環(huán)境, 很多文章對于 profile 和 bashrc 也都有使用, 但究竟每個文件都有什么作用和該如何使用呢?

首先我們來看系統(tǒng)中的這些文件, 一般的系統(tǒng)可能會有

1
2
3
4
5
/etc/profile
/etc/bashrc

~/.bashrc
~/.profile

而如果系統(tǒng)是 ubuntu 或者 debian 的話, 就不會有 /etc/bashrc 而會有 /etc/bash.bashrc 文件.

以上這些就是常用 profile 和 bashrc 文件了. 要理解這些文件之前還需要了解 Shell, Shell 的 login(登入) 和 interactive(交互式) 模式.

Shell 的模式

Shell 的分類

系統(tǒng)的 shell 有很多種, 比如 bash, sh, zsh 之類的, 如果要查看某一個用戶使用的是什么 shell 可以通過 finger [USERNAME] 命令來查看. 我們這里只說 shell 是 bash 的情況, 因為如果是 sh 或者其他 shell 顯然不會運行 bashrc 的.

login shell 和 no-login shell

“l(fā)ogin shell” 代表用戶登入, 比如使用 “su -“ 命令, 或者用 ssh 連接到某一個服務器上, 都會使用該用戶默認 shell 啟動 login shell 模式.

該模式下的 shell 會去自動執(zhí)行 /etc/profile~/.profile 文件, 但不會執(zhí)行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我們會手動去 source bashrc 文件.

而 no-login shell 的情況是我們在終端下直接輸入 bash 或者 bash -c “CMD” 來啟動的 shell.

該模式下是不會自動去運行任何的 profile 文件.

interactive shell 和 non-interactive shell

interactive shell 是交互式shell, 顧名思義就是用來和用戶交互的, 提供了命令提示符可以輸入命令.

該模式下會存在一個叫 PS1 的環(huán)境變量, 如果還不是 login shell 的則會去 source /etc/bash.bashrc 和 ~/.bashrc 文件

non-interactive shell 則一般是通過 bash -c “CMD” 來執(zhí)行的bash.

該模式下不會執(zhí)行任何的 rc 文件, 不過還存在一種特殊情況這個我之后詳細講述

在可能存在的模式組合中 RC 文件的執(zhí)行

SSH login, sudo su - [USER] 或者 mac 下開啟終端

ssh 登入和 su - 是典型的 interactive login shell, 所以會有 PS1 變量, 并且會執(zhí)行

/etc/profile
~/.profile

在命令提示符狀態(tài)下輸入 bash 或者 ubuntu 默認設置下打開終端

這樣開啟的是 interactive no-login shell, 所以會有 PS1 變量, 只會執(zhí)行

/etc/bash.bashrc
~/.bashrc

通過 bash -c “CMD” 或者 bash BASHFILE 命令執(zhí)行的 shell

這些命令什么都不會執(zhí)行, 也就是設置 PS1 變量, 不執(zhí)行任何 RC 文件

最特殊! 通過 “ssh server CMD” 執(zhí)行的命令 或 通過程序執(zhí)行遠程的命令

這是最特殊的一種模式, 理論上應該既是 非交互 也是 非登入的, 但是實際上他不會設置 PS1, 但是還會執(zhí)行

/etc/bash.bashrc
~/.bashrc

這里還有一點值得注意的是 /etc/bashrc 任何情況下都不會執(zhí)行.

bashrc 和 profile 的區(qū)別

看了之前那么多種狀態(tài)組合, 最關鍵的問題是, 究竟 bashrc 和 profile 有什么區(qū)別呢?

profile

其實看名字就能了解大概了, profile 是某個用戶唯一的用來設置環(huán)境變量的地方, 因為用戶可以有多個 shell 比如 bash, sh, zsh 之類的, 但像環(huán)境變量這種其實只需要在統(tǒng)一的一個地方初始化就可以了, 而這就是 profile.

bashrc

bashrc 也是看名字就知道, 是專門用來給 bash 做初始化的比如用來初始化 bash 的設置, bash 的代碼補全, bash 的別名, bash 的顏色. 以此類推也就還會有 shrc, zshrc 這樣的文件存在了, 只是 bash 太常用了而已.

期望的執(zhí)行順序

=> 代表 在文件內(nèi)部 source, 換行的 => 代表自身執(zhí)行結(jié)束以后在 source, 同一行表示先 source 在執(zhí)行自身

普通 login shell

/etc/profile
   => /etc/bash.bashrc

~/.profile
  => ~/.bashrc => /etc/bashrc

終端種直接運行 bash

/etc/bash.bashrc
~/.bashrc => /etc/bashrc

bash -c “CMD”

什么都不執(zhí)行

ssh server “CMD”

/etc/bash.bashrc => /etc/profile
~/.bashrc => | /etc/bashrc => /etc/profile
             | ~/.profile

這里會有點小混亂, 因為既有 /etc/bash.bashrc 又有 /etc/bashrc, 其實是這樣的 ubuntu 和 debian 有 /etc/bash.bashrc 文件但是沒有 /etc/bashrc, 其他的系統(tǒng)基本都是只有 /etc/bashrc 沒有 /etc/bash.bashrc.

最終修改

為了達到上述我們需要的執(zhí)行流程, 那必須對系統(tǒng)的 rc 文件做修改. 我們拿 Ubuntu 舉例

首先 我們編輯 /etc/profile 在文件頭部加入

export system_profile_loaded=1

這樣其他文件就可以根據(jù) $system_profile_loaded 來判斷是否已經(jīng)載入過 profile, 接著我們可以看到

  unset i
fi

if [ "$PS1" ]; then
  if [ "$BASH" ]; then
    PS1='\u@\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
	. /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

umask 022

按照我們剛才的方案, 應該是不管任何情況都應該在文件末尾去載入 bashrc, 所以我們修改成

  unset i
fi

umask 022

if [ "$BASH" ]; then
  if [ "$PS1" ]; then
    PS1='\u@\h:\w\$ '
  fi

  if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
  fi
else
  if [ "`id -u`" -eq 0 ]; then
    PS1='# '
  else
    PS1='$ '
  fi
fi

當然也可以有其他該法,只要符合在文件末尾載入 bashrc 就可以了.

接著我們修改 /etc/bash.bashrc, 我們需要在文件頭加入

[ -n "${system_bashrc_running}" ] && return
system_bashrc_running=1
[ -z "${system_profile_loaded}" ] && source /etc/profile
unset system_bashrc_running
system_bashrc_runned=1

其中 system_bashrc_running 這樣的變量都是為了防止2次反復調(diào)用而加入的.

這樣系統(tǒng)級別的 rc 文件基本修改好了, 最好還可以再修改一下本地的rc文件, 所以我們編輯 “~/.profile”, 發(fā)現(xiàn)起內(nèi)容是

# ~/.profile: executed by Bourne-compatible login shells.

if [ -n "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n

而按照上述的修改規(guī)則只需要替換成

export local_profile_loaded=1

if [ -n "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

這樣就始終再載入完 profile 以后去載入 bashrc 了, 接著我們像編輯 /etc/bash.bashrc 一樣的去修改 ~/.bashrc, 文件頭上加入

[ -n "${local_bashrc_running}" ] && return
local_bashrc_running=1
[ -r /etc/bashrc -a -z "${system_bashrc_runned}" ] && source /etc/bashrc
[ -r ~/.profile -a -z "${local_profile_loaded}" ] && source ~/.profile
unset local_bashrc_running

用來防止反復加載 profile, 并且這里需要特殊注明的是

[ -r /etc/bashrc -a -z "${system_bashrc_runned}" ] && source /etc/bashrc

/etc/bashrc 這個文件只有在 mac 之類的系統(tǒng)下才有, 所以 ubuntu 這里這行可以不加, 不過有判斷是否存在所以加了也沒關系.

到這里基本上就可以比較完美的解決不通的 shell 加載順序問題了, 當然比如這個用戶用的是 zsh 之類的也需要按照類型的原理來修改.

另外, 在用戶目錄下 可能會存在 ~/.bash_profile, ~/.bash_login 這樣的文件, 但如果有這些文件 bash 就不會去載入 ~/.profile 了, 所以如果存在的話需要刪除 這些文件并把內(nèi)容合并進 ~/.profile~/.bashrc 才行.

最后還可以參考下 https://github.com/sunteya/sot 項目, 這個項目是我目前自己使用的的 dot 系列文件的配置. 里面的 bashrc 和 profile 都是按照上述流程修改的.

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文字幕精品人妻一区| 国产日韩欧美国产欧美日韩| 欧美日韩亚洲巨色人妻| 日韩不卡一区二区在线| 天堂网中文字幕在线观看| 中文字幕高清免费日韩视频| 日韩国产精品激情一区 | 国产精品国产亚洲看不卡| 人妻偷人精品一区二区三区不卡| 91日韩在线视频观看| 风韵人妻丰满熟妇老熟女av| 正在播放玩弄漂亮少妇高潮| 日韩欧美精品一区二区三区 | 欧美日韩国产精品第五页| 男人和女人干逼的视频| 久久国产青偷人人妻潘金莲| 性感少妇无套内射在线视频| 国产精品欧美日韩中文字幕| 精品亚洲香蕉久久综合网| 日本东京热加勒比一区二区| 日本加勒比在线观看不卡| 欧美精品激情视频一区| 亚洲国产av精品一区二区| 精品国产亚洲区久久露脸| 欧美日韩综合综合久久久| 亚洲一区二区久久观看| 国产亚洲中文日韩欧美综合网| 欧美国产日韩在线综合| 区一区二区三中文字幕| 国产免费一区二区三区av大片| 国产精品熟女在线视频| 日韩免费av一区二区三区| 亚洲一区二区三区在线免费| 国产一区欧美一区二区| 91亚洲人人在字幕国产| 日韩欧美一区二区不卡视频| 妻子的新妈妈中文字幕| 国产又粗又猛又爽又黄的文字| 熟女白浆精品一区二区| 欧美午夜一级艳片免费看| 日韩精品毛片视频免费看|