shell? bash?

shell

shell是你(用戶)和Linux(或者更準確的說,是你和Linux內核)之間的接口程序。你在提示符下輸入的每一個命令都由shell先解釋而後傳給Linux內核。html

shell的幾種形式

  • login shell

    須要用戶名、密碼登陸後才能進入的shell。在大多數狀況下 ,遠程終端工具(secureCRT xshell putty)經過ssh鏈接都是login shellhtml5

  • non-login shell

    通常是在圖形界面中啓動一個終端shell或者在login shell終端輸入bash 會打開一個新的shell,這個shell也是non-login的 或者經過su username 切換到新用戶獲得一個non-login shelllinux

  • interactive shell

    在大多數遠程工具鏈接服務器後打開的都是interactive shell( 交互式shell ) 改模式下,shell等待你輸入命令並解釋和執行這些命令,而後繼續等待下一個命令。shell

  • non-interactive shell

    通常是指執行shell腳本時的模式,經過"bash test.sh"這種形式執行腳本文件,它並不與用戶交互 而是一次性執行腳本 當腳本執行完畢 shell即終止。 經過"echo $-"能夠查看當前是否爲交互式shell。 輸出爲"himBH" 標識interactive shell 。若是爲 "hB" 表示non-interactive shell編程

通常以"#!/bin/bash" 開頭的shell腳本是non-login non-interactive shell。 若是以"#!/bin/bash --login"開頭的shell腳本時login non-interactive shell安全

from: linux環境變量之profile .bash_profile .bash_login .profile .bashrc 加載詳解bash

常見shell

每一個用戶的缺省shell在系統裏的passwd文件裏被指定,該文件的路徑是/etc/passwd。passwd文件裏還包含有其餘東西:每一個人的用戶ID號,一個口令加密後的拷貝和用戶登陸後當即執行的程序,(注:爲了增強安全性,如今的系統通常都把加密的口令放在另外一個文件--shadow中,而passwd中存放口令的部分以一個x字符代替)雖然沒有嚴格規定這個程序必須是某個Linux shell,但大多數狀況下都如此。 <缺省,default,即默認,原翻譯缺省>服務器

Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)

sh:編程接口優秀ssh

csh:用戶界面友好編輯器

ksh:吸取csh、兼容sh

The Bourne Again Shell(bash)

  • 命令補齊(Command-Line Completion)
  • 通配符

* 匹配任何字符和任何數目的字符

? 匹配任何單字符

[] 匹配任何包含在括號裏的單字符

eg:
lpr ch[123].doc

lpr ch[1-3].doc

  • 命令歷史記錄

HISTSIZE的變量

歷史文件的缺省名字是 .bash_history。這個文件一般在你的用戶目錄($HOME)中。

使用方法:

history [-r|w|a|n] [filename]

-r 選項告訴 history 命令讀命令歷史列表文件的內容而且把它們看成當前的命令歷史列表。

-w 選項將把當前的命令歷史記錄寫入文件中並覆蓋文件原來的內容。

-a 選項把當前的命令歷史記錄追加到文件中。

-n 選項將讀取文件中的內容並加入到當前歷史命令列表中。若是 filename 選項沒有被指定,history 命令將用變量HISTFILE 的值來代替。

fc [-e editor_name] [-n] [-l][-r] [first] [last]

-e editor_name 選項用來指定用於編輯命令的文本編輯器。

first 和 last 選項用於選擇列出歷史命令的範圍,既能夠是數字也能夠是字符串。-n 選項禁止列出命令的編號。

-r 選項反向列出匹配的命令。

-l 選項把匹配的命令行列在屏幕上(而不是在編輯器中)。若是-e editor_name參數沒有被指定,則以變量FCEDIT的值來代替,若是該變量不存在的話,則用變量EDITOR的值來代替,都不存在的話將使用vi編輯器。

  • 別名

eg:

alias goconfig='cd /usr/X11/lib/X11/fvwm/sample-configs'

unalias goconfig

  • 輸入重定向

輸入重定向用於改變一個命令的輸入源。一些命令須要在命令行裏輸入足夠的信息才能工做。好比 rm,你必須在命令行裏告訴 rm它你要刪除的文件。另外一些命令則須要更詳細的輸入,這些命令的輸入多是一個文件。好比命令 wc 統計輸入給它的文件裏的文件裏的字符數,單詞數和行數。若是你僅在命令行上鍵入 wc ,wc 將等待你告訴它要統計什麼,這時 bash 就好象死了同樣,你鍵入的每樣東西都出如今屏幕上,但什麼事也不會發生。這是由於 wc 命令正在爲本身收集輸入。若是你按下Ctrl-D,wc 命令的結果將被寫在屏幕上。若是你輸入一個文件名作參數,象下面的例子同樣,wc 將返回文件所包含的字符數,單詞數,和行數:

另外一種把test文件內容傳給 wc 命令的方法是重定向 wc 的輸入。< 符號在bash裏用於把當前命令的輸入重定向爲指定的文件。因此能夠用下面的命令來把 wc 命令的輸入重定向爲 test 文件: wc < test

輸入重定向並不常用由於大多數命令都以參數的形式在命令行上指定輸入文件的文件名。儘管如此,當你使用一個不接受文件名爲輸入參數的命令,而須要的輸入又是在一個已存在的文件裏時,你就能用輸入重定向解決問題。

  • 輸出重定向

輸出重定向使你能把一個命令的輸出重定向到一個文件裏,而不是顯示在屏幕上。

重定向到一個文件中,稍後再用文本編輯器來打開這個文件;

輸出重定向能夠用於把一個命令的輸出看成另外一個命令的輸入

eg:

ls > directory.out

  • 管道

管道能夠把一系列命令鏈接起來。這意味着第一個命令的輸出會經過管道傳給第二個命令而做爲第二個命令的輸入,第二個命令的輸出又會做爲第三個命令的輸入,以此類推。

eg:

cat sample.text | grep "High" | wc -l

這個管道將把 cat 命令(列出一個文件的內容)的輸出送給grep命令。grep 命令在輸入裏查找單詞 High,grep命令的輸出則是全部包含單詞 High的行,這個輸出又被送給 wc命令。帶 -l選項的 wc命令將統計輸入裏的行數。
複製代碼

假設 sample.txt的內容以下: Things to do today: Low: Go grocery shopping High: Return movie High: Clear level 3 in Alien vs. Predator Medium: Pick up clothes from dry cleaner

管道行將返回結果 2,指出你今天有兩件很重要的事要作:

cat sample.text | grep "High" | wc -l

2

  • 提示符

    • 第一級: 缺省的一級提示符是字符$(若是是超級用戶,則是#號)。

      修改:PS1="Please enter a command"

    • 第二級提示符: 缺省的第二級提示符是 >。

      修改:PS2="I need more information"

  • 做業控制(Job Control)

    Ctrl-Z 使一個運行的進程掛起。 bg 命令使一個被掛起的進程在後臺恢復運行

    當一個命令在前臺被運行時,它會禁止用戶與 shell 的交互,直到該命令結束。

    eg:

    find / -name "test" > find.out

    control-z

    bg

    find 命令首先被掛起,再在後臺繼續被執行,而且你能立刻回到bash下。

  • 用戶化配置bash

如今爲止,咱們所作的改動都僅在當前運行的bash下才有效。一旦退出系統,全部的改動也隨之消失了。爲了保存這些用戶化配置,你必須把它們保存到一個bash的初始化文件裏。

這個文件裏最多見到的命令一般是alias和變量的初始化。

下面的代碼是缺省的.profile文件的內容。這個文件的位置在 /etc目錄。若是你想設置本身的bash 的話把它拷到你的用戶目錄裏(若是尚未的話)並命名爲.profile。

# commands common to all logins
export OPENWINHOME=/usr/openwin
export MINICOM="-c on"
export MANPATH=/usr/local/man:/usr/man/preformat:/usr/man:/X11/man:/usr/openwin /m 
an
export HOSTNAME="`cat /etc/HOSTNAME`"
PATH="$PATH:/usr/X11/bin:$OPENWINHOME/bin:/usr/games:."
LESS=-MM
# I had problems using 'eval test' instead of 'TERM=', but you might want to
# try it anyway. I think with the right /etc/termcap it would work great. 
# eval 'tset -sQ "$TERM"'if [ "$TERM" = "" -o "$TERM" = "unknown"]; then TERM=linux
#PS1=''hostname':'pwd'# `
if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then
 PS1="! $"
elif [ "$SHELL" = "/bin/zsh" ]; then
 PS1="%m:%~%# "
elif [ "$SHELL" = "/bin/ash" ]; then
 PS1="$ "
else
PS1='/h:/w/$ ` fi PS2='> `
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof
umask 022
# set up the color-ls environment variables:
if [ "$SHELL" = "/bin/zsh" l; then
  eval 'dircolors -z'
elif [ "$SHELL" = "/bin/ash" l; then
  eval 'dircolors -s'
else
  eval 'dircolors -b'
fi
echo
fortune
echo
export TAPE="/dev/nftape" 
複製代碼

這個文件裏最多見到的命令一般是alias和變量的初始化。

PS:


經常使用的bash內部命令: alias: 設置bash別名。

bg: 使一個被掛起的進程在後臺繼續執行。

cd: 改變當前工做目錄。

exit: 終止shell。

export: 使變量的值對當前shell的全部子進程均可見 。

fc: 用來編輯歷史命令列表裏的命令。

fg: 使一個被掛起的進程在前臺繼續執行。

help: 顯示bash內部命令的幫助信息。

kill: 終止某個進程。

pwd: 顯示當前工做目錄。

unalias: 刪除已定義的別名。


PSS:


經常使用的bash內部命令: EDITOR, FCEDIT: bsah fc 命令的缺省編輯器。

HISTFILE: 用於貯存歷史命令的文件。

HISTSIZE: 歷史命令列表的大小。

HOME: 當前用戶的用戶目錄。

OLDPWD: 前一個工做目錄。

PATH: bash尋找可執行文件的搜索路徑。

PS1: 命令行的一級提示符。

PS2: 命令行的二級提示符。

PWD: 當前工做目錄。

SECONDS: 當前shell開始後所流逝的秒


from:什麼是shell? bash和shell有什麼關係?

相關文章
相關標籤/搜索