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有什么关系?

相关文章
相关标签/搜索