Sunday, December 14, 2008

Shell|Freebsd shell setup

3.4. Shells

在 FreeBSD裡,有一大堆每天進行的工作是在一個命令列的介面下完成的  ,而那就叫做 shell 。 一個 shell 的主要工作就是取得您輸入的指令並  解執行它。有很多的 shell 也擁有幫助我們完成每天的工作的內建功能像是  檔案管理,檔案全域樣式,命令列編輯,巨集指令,和環境變數。 FreeBSD 也內含了幾個 shell ,如 sh,Bourne Shell,和 csh,the C-shell。許多 其他的 shell 在 FreeBSD Ports Collection 可以找到且他們的功能也更強 大,如 tcsh 和 bash 。

你用哪一種 shell ? 這就要取決於你的喜好。 如果你是一個 C 語言  程式設計師,你使用 C-like 的 shell 會感到更舒適,如 tcsh。如果你是  從 Linux 轉過來的或是你是一個 UNIX 命令列的新手,你應該試試 bash 。  這點告訴我們每一個 shell 都有其獨特的特性,他們有可能適合或不適合你  的工作環境,你必須選一個你要用的 shell 。

shell 的其中一個共通特性是檔案名稱自動補齊功能。 只要打前幾個你  要的檔名或是指令,你可以按 TAB 鍵來自動補齊其餘的檔名或是指令。這裡  有一個例子。假設你有兩個檔案叫做foobarfoo.bar 。你要刪除 foo.bar。然後你在鍵盤上打: rm fo[TAB].[TAB].

shell 會顯示 rm foo[BEEP].bar.

[BEEP] 是 console 的嗶聲,是 shell 告訴我們它無法完成全部的檔名  因為有超過一個的檔案符合。foobarfoo.bar 都是 fo開頭的,但是他只能完成到 foo。 如果你打 .,然後再按一次 TAB 鍵,這時候 shell 就會為你完 成其餘的檔名。

另一個 shell 的功能是環境變數。環境變數是一個儲存在 shell 空間的變數對 這個空間能夠被任何程式用 shell 所呼叫,而且因此包含了很多程式的設定組態。 這裡是一些常用的環境變數和他們所代表的意義的列表:

變數 詳細說明
USER 現在登入的使用者名稱。
PATH 以冒號分隔的目錄列表以便尋找執行檔的路徑。
DISPLAY X11 顯示連接的網路名稱,如果有的話
SHELL 目前用的 shell 。
TERM 使用者終端的名稱。 用來決定終端機的能力
TERMCAP Database entry of the terminal escape codes to perform various terminal functions.
OSTYPE 作業系統的種類,如 FreeBSD
MACHTYPE 現在系統所用的CPU。
EDITOR 使用者喜好的編輯器。
PAGER 使用者喜好的文字呼叫器。
MANPATH 以冒號分隔的目錄以便尋找線上手冊。

在不同的 shell 底下環境變設的設定看起來有些許的不同。舉個例子  ,在 C-Style 的 shell 像是 tcsh 和 csh ,你會用setenv 去設定和觀看你的環境變數。而在 Bourne shells像是sh和bash,你會用 setexport去設定和觀看 你現在的環境變數。再舉個例子,要去設定或是修改 EDITOR 這個環境變數,在 csh 和 tcsh下要將編輯器設定為/usr/local/bin/emacs 的指令會是:

    % setenv EDITOR /usr/local/bin/emacs 

而在 Bourne shells 則是:

    % export EDITOR="/usr/local/bin/emacs" 

你也可以在命令列用$放在變數的前面來取得環境變數  。像是, echo $TERM就會顯示出$TERM的  設定值,因為 shell 取得了$TERM並把他傳給 echo 顯示出來。

Shell 裡有很多特殊字元代表著一些資料我們叫他做 meta-characters。  最常用的就是*這個字元,他代表檔名的任何字元。  這一些 meta-characters會被用在檔案名稱的全域樣式。舉例來說,鍵入 echo *是和ls有同樣的效果因 為 shell 將所有符合*的檔案傳到命令列給 echo 顯示出來。

為了防止這些特殊的字元被 shell 轉譯,我們可以在前面放一個  反斜線(\)讓他們跳脫出來。echo $TERM 會顯示出你所設定的終端機。而echo \$TERM就會直接 顯示出 $TERM 這幾個字。

3.4.1. 改變你的 shell

改變你的 shell最簡單的方法就是用chsh指令。  執行chsh將會進入你在環境變數中所設定的編輯器 EDITOR裡;如果你沒有設定,你將會進入vi 。改變"Shell:"這一行的對應值。

你也可以用chsh的參數-s; 這樣你就可以設定你的 shell而不用任何的編輯器。例如,你想要將 shell 改變到 bash,只要依照下面這樣做:

    % chsh -s /usr/local/bin/bash 

執行 chsh而不加參數並且編輯也可以達到一向的作用。

Note: 你要使用的 shell 必須列在/etc/shells  裡面。如果你從ports collection安裝一個 shell ,那這個動作就不用再重複。如果你是手動自己安裝一個 shell,那 你就必須再手動做一次。

舉個例子,如果你手動安裝 bash並且裝到/usr/local/bin  裡面,你就必須:

    # echo "/usr/local/bin/bash" >> /etc/shells 

然後重新再執行chsh


====================
If you have always used bash on your machines and now you have FreeBSD with default shell sh/csh this is an article how to change it with bash.

Firstly we have to install the bash shell. We can use the ports packat manager of FreeBSD. We can follow this 2 commands:

cd /usr/ports/shells/bash
make install clean

This has installed bash on your system and now you need to edit the account so you can set the bash shell as default for it. For example I will use the root account. You can edit the file located at /etc/passwd. You can use vi or some other text editor to edit this file. For example:

vi /etc/passwd

There should be a line that looks like this:

root:*:0:0:Charlie &:/root:/bin/sh
or
root:*:0:0:Charlie &:/root:/bin/csh

you should change this line to be like this:

root:*:0:0:Charlie &:/root:/usr/local/bin/bash

As you can see from the example above that we are just changing the path to the shell. That's all. The path to the new shell is /usr/local/bin/bash.

Now after you have done these changes you can logout and login again with the same account and you will be using Bash shell.

=====================

FreeBSD的基本系统下Shell设置

http://developer.51cto.com 2005-09-27 11:11 freebsd使用大全 我要评论(00)

命 令解释程序shell是与用户关系最密切的应用程序,用户主要通过shell使用系统。在每次登录系统之后,就启动了一个与用户交互的shell,这个 shell将给出一个提示符等待用户输入,(sh为 “$” ,csh为 “%” ,如果是使用root用户,登录提示符将是 “#” ),然后对用户的 输入进行解释执行。

FreeBSD的基本系统中可以使用的shell有两个:sh和csh。这两个基本shell的风格不太相同,不同的使用者常常会根据喜好来在两者 之间进行选择。当然当前有更好的shell程序可供使用者选择,这些后续的 shell均是根据sh或csh的风格进一步发展出的,因此可以说在 shell中,也有两种风格,需要使用者根据自己的使用习惯进行选择。

对于管理员来将,要为使用不同shell的用户都设置好基本的环境,就必须了解这两种风格的shell设置方式。系统登录时,sh将首先执行 /etc/profile文件,为每个用户设置最基本的环境,而csh将使用 /etc/csh.cshrc,csh.login和csh.logout 作为系统csh 资源文件。执行了系统级别的登录文件之后,每个用户的shell就在该用户的主目录下寻找该用户个人的资源文件:sh使用. profile文件,csh使用.login和.cshrc文件。这些资源文件均使用相应的shell语言,/etc/profile和个人目录下的. profile使用sh风格的控制语言,/etc/cshrc和个人目录下的.login、.cshrc使用csh 风格的控制语言。系统管理员可以改动 这些资源文件,为用户提供一个最方便的使用环境。当然,系统管理员没有必要直接去修改个人主目录下的资源文件,这些文件应该由用户自己管理,但是系统管理 员可以在生成帐号时为用户产生缺省的资源文件,以减轻用户设置资源文件的麻烦。adduser命令缺省使用/usr/share/skel下的文件为用户 提供各种资源文件的缺省设置,这个目录下除了可以放入shell的资源文件之外,还可以放入其他应用程序的资源文件。由于这些资源文件都是以点开头的隐藏 文件,为了表示清楚,在skel目录下使用了一种转换方式,如使用dot.profile 作为.profile的模板。

# ls /usr/share/skel
dot.cshrc dot.mail_aliases dot.rhosts
dot.login dot.mailrc dot.shrc
dot.login_conf dot.profile

在/usr/share/skel中为用户设置的缺省配置文件,在用户生成之后,就不会对用户产生影响了。因此对系统登录文件进行修改更有效和直 接。对于sh风格的用户,可以更改/etc/profile文件,对csh应更改 /etc/csh.cshrc文件。在这些文件中可以改动shell使 用的环境变量,这样来改变shell的行为方式,或者执行一系列自动操作,完成一些用户登录时需要自动执行的任务。

常用的环境变量

EDITOR 设置用户常用的编辑器,很多程序查看这个变量来启动具体的编辑器,可以 根据系统的情况更改
HOME 用户的主目录的名字,这个变量由login程序设置,一般不需要更改DISPLAYX 使用这个环境变量来标识具体的显示位置,格式为“计算机名字:X服务 器序号.显示屏序号” ,例如:xt1:0.0,它不需要在资源文件中进行定义

LANG 系统使用的语言,用于系统的本地化,缺省为 “C” ,具体的设置可以查看 /usr/share/locale 目录,那里定义了不同的语言,可以将其设置为zh_CN.EUC来使得一些软件使用中文字符。

MAIL 用户mail文件的位置,也不需要改动PATH 使用冒号分隔的一系列路径,系统用它来查找具体可执行程序,因此这个变量非常重要,可以 根据具体的情况改动其值。为了安全的原因,不要将当前目录作为执行程序的搜寻路径,尤其对于root用户。这样在当前目录下启动程序,需要加上路径,例如 启动当前目录下的a.out 程序,输入 “./a.out” 。

MANPATH 使用冒号分隔的一系列路径,系统用它来查找具体命令的在线手册,设置方法与PATH相同。

PS1sh 风格的shell使用这个变量的值作为提示符,缺省值为 “$”(root为 “#” )。更现代的sh就增强了提示符的灵活性,可以在提示符中加入当前目录、用户名、机器名,命令的序号等。

PS2sh 风格的shell使用这个变量的值作为后续提示符,提示命令还没有完全输入,缺省为 “>“TERM 终端的类型,对于需要全屏操作的程序,非常重要。有时要根据情况对设置进行调整。

TZ 时区设置,具体的时区信息位于/usr/share/zoneinfo目录下,需要设置为适合本地 时区的标准值

可以将用户的shell设置为特殊的应用程序,来达到对特殊用户进行限制的目的。例如,仅仅给予用户一个电子邮件信箱,但不想给他终端使用权,可以 将用户的shell更改为/bin/true或者其他立即退出的程序。为了安全起见,用户shell应该是一个不存在漏洞的二进制程序,最好不要使用解释 性语言脚本作为登录shell。由于系统认可的shell 程序是在/etc/shells文件中列出的程序,将特殊用户的shell设置为特殊的应用程 序,但这些应用程序没有列入shells文件,那么这个用户就会被一些应用程序区分出与普通用户的差异,从而拒绝提供服务。例如ftp服务器程序 ftpd,通过检查用户的shell是不是标准shell,来区分这个用户是普通用户还是用于特定目的的用户。

注意,不能轻易更改root用户的shell,因为这可能会造成root无法正常登录,而使得无法正常执行系统维护。即使是将root的shell 更改为其他更新、更强功能的标准shell,例如bash或tcsh,也是不应该。虽然这些shell也是非常成熟的shell程序,仍然不应该使用它们 作为root的shell。主要原因是这些 shell一般没有被安装到根分区中,那么当系统进入单用户状态时就会发生问题。另外这些shell可能会由 于进行版本升级等原因,而偶然形成故障,造成root无法正确登录。此外,由于这些非标准shell不一定来自于系统的安装盘,因此也存在对shell来 源的安全信任问题,必须保证这些shell不是经攻击者更改过的版本。如果要使用它们 shell提供的方便特性,可以在系统登录之后再使用全路径执行它 们。

配置用户shell

事实上sh与csh,并不是普通用户的最佳选择,因为这两个shell在易用性方面做的不够好,例如命令行编辑功能不强、不能利用热键重复执行命令 等。较新的shell,如bash和tcsh都具有这些方便用户使用的功能,但必须安装了这些shell程序之后,才能更改普通用户的shell设置以使 用这些shell程序。更改用户的shell 可以使用pw、vipw或chsh。

这两个shell分别遵照sh和csh的风格,因此喜好csh风格的可以选择tcsh,而喜欢sh风格的选择 bash。除了这两种shell之 外,还有ksh、zsh等shell可供选择。如果对两种shell没有偏好,可以选择bash,它是一个GNU软件,比标准sh功能强大的多。

使用了这两些增强型shell之后,用户就可以使用shell提供的命令行编辑功能。按照习惯的不同,可以选择vi风格的编辑方式或emacs风格 的方式,缺省为emacs方式,这种方式使用方向键来回溯执行过的命令,并进行修改,而vi风格使用字母命令作编辑键,例如使用h、j、k、l四个键来移 动光标,vi风格的好处是不使用基本键盘之外的控制键,因而可以适用于任何终端设备,并且进行编辑时手不需离开基本键盘,熟练操作之后最为快捷。 emacs风格比起vi风格更适合从个人计算机转向Unix的使用者的习惯。bash, ksh ,zsh下使用下面的命令在emacs 风格和vi风格 切换:

bash$ set -o emacs
bash$ set -o vi
tcsh中使用不同的命令:
% bind emacs
% bind vi

还可以为常用的命令设置别名,简化用户输入,例如:

bash$ alias ec=”echo This is a alias”
bash$ ec
This is a alias

shell用于方便用户操作的另一项能力是自动补全命令或文件名的功能,因为FreeBSD下的文件名可能很长,将它们全部输入比较麻烦。事实上可 以输入部分名字,然后按Tab键(在vi风格下是连续两次按Esc键),shell 将自动补全文件名的剩余部分。如果已经输入的这部分名字不能确定具体 的命令或文件,那么shell只将能确定的部分补上,
然后响铃通知使用者继续输入以明确具体的文件。

事实上即使在基本的sh或csh下,也可以使用 “*” 等特殊字符,用模式匹配的方式来简化输入。

bash$ cd /usr/loca*
bash$ pwd
/usr/local

Unix中的多数程序都具备模式匹配的处理能力,而shell的模式匹配功能最为常用。

shell可以使用这些特殊模式来配置多个文件,达到简化操作的目的。如果要熟练掌握Unix,必须掌握模式匹配。

当试图在bash下输入汉字的时候,除了必须设置终端属性能接受8位字符之外(执行stty pass8命令),还需要设置bash的输入输出转换,可以在登录脚本.profile文件中 包括以下设置:

bind 'set convert-meta off'
bind 'set meta-flag on'
bind 'set output-meta on'

============================

Shell启动文件与环境变量

http://developer.51cto.com 2005-09-27 11:28 liuyude liuyude.bokee.com 我要评论(00)

每 个shell的起动动动,执行命令和程序的机制,如何处理命令和程序的输入输出,以及任何编程都受到某些环境变量设置的影响.每个系统都有一个初始的系统 启动文件,通常是/etc/profile.这个文件包含了对shell和其他一些实用程序起作用的重要环境变量的初始设置.另外特定的shell还有一 些隐藏的文件和点文件在你启动该shell的时候执行,这些文件也叫shell的启动文件,通常是一用户的主目录下的~/.profile,或者是一个特 定shell的profile或login文件.例如bash的profile汉蚻ogin文件通常是~/.bash_profile与 ~/.bash_login.

当你登录并且登录shell是bash时,bash首先执行/etc/profile文件中的命令(如果该文件存在),然后它顺序寻找 ~/.bash_profile,~/.bash_logi或~/.profile文件,并执行找到的第一个可读文件中的命令.当登录bash退出时,它 将执行~/.bash_logout文件中的命令.

当启动一个交互的bash时,它将执行~/.bashrc文件中的命令(如果该文件存在并且可读).当非交互地启动以运行一个shell脚本时,bash将查找bash_env环境 变亮康哪谌??确定执行文件的名称.

如果你使用的是TC shell,它将执行/etc/csh.cshrc或 etc/.chsrc文件中的命令(如果该文件存在并且可读).登录shell然后将执行/etc/csh.login文件中的命亮??如果该文件存在并 且可读).每一竤hell(登录shell或非登录 shell)然后将执行~/.tcshrc文件(假如~/.tcshrc不存在就是 ~/.cshrc文件)中的命令,并读取~/.history文件的内容.登录shell将执行~/.login和 ~/.cshdirs文件中的命令.当一个TC shell退出时,它将执行/etc/csh.logout和 ~/.login文件中的命令(如果该文件存在并且可读).

No comments: