linux built-in shell commands,3-8 C Shell 的内建指令(Built-in Commands) umask exit source...

3-8-1 umask 指令

umask (显示设定值)

umask nnn (设定umask,设定值为000~777的整数)

umask

指令的功能是用来“限定”每一个新增的档案、目录的基本使用权限(permission)。譬如说当使用者以编辑器新产生的档案,或者是从系统的某处拷贝来的新档案,或者是以输出重导向的方式产生的新档案,或是以指令mkdir

新建的目录等等,一切新产生的档案、目录,它们的最初使用权限,均会受到这个内建指令umask

的设定值所影响。就是我所说的“限定”。

指令里的nnn 所代表的意义与chmod 指令的nnn 相似。不同的是chmod 指令nnn

是“给于”使用或者是将要改变的许可权限,而umask 则是“取消”nnn

的使用许可权限。这点是根本性的差异,使用者必须分清楚。

指令umask 的设定值以三个八进位的数字“nnn”代表。第一个设定数字给使用者自己(owner

user),第二个则是设定给用使用者所属的群体(group),第三个给不属于同群体的其它使用者(other)。每一位数字的设定值都是三项不同权限的数值加总,read

权限数值为4;write 权限数值为2;execute 权限数值为1。结合了前三者的权限数值,单一的数字可设定的范围是0 ~

7;整体的可设定范围是000 ~ 777。

要知道设定后会得到什么结果。原则上,方法很简单。就是用最大值减去设定值即可得到你想要知道的结果。对目录而言最大值是777;对档案而言,最大值则是666。这个方法对目录而言完全正确;但对档案而言会有无法应付的意外。

以下为了说明上的方便,我将以实际运用上,不可能会采用的设定值067 作为本节例子来加以说明。

譬如当你设定umask 为670 ,使用档案的最大值666

减去设定值670,得到的是数值是负4,已超出数值的定义范围变成没有任何意义的数值。但真正使用者会得到的结果却是档案对other

开放rw 权限;对owner 与group 关闭所有权限。所以使用者无法使用减去的方法来获得完全正确的结果。

表面上,C shell 让系统使用者使用umask 时只需输入一组3

个数字的设定值。但是,这组设定值对于目录及档案却有着不同的作用结果。所以农夫我打算更进一步地说明其中运作的细节,让看官们能完全的理解。

对系统程式而言,内建指令umask

的设定值实际上是群组化的参数,也就是S_IRWXU、S_IRWXG、S_IRWXO。代表的群组情况如下:

S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR

S_IRWXG = S_IRGRP | S_IWGRP | S_IXG​​RP

S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH

也就是说umask

所设定的三个数字,其实包含了九个不同意涵的参数,用来对映九种不同的使用权限,这些参数会被要产生档案的程式,或者是要产生目录的程式带入并执行出结果。一个C

shell 的使用者必须要有能力完全掌握umask 的设定,并演算出设定后所得到的结果。

系统在产生一个新目录,会完全使用到上述的九种权限的参数,所以最大值是777 ,这对umask

内建指令而言,可以很容易地使用减去权限的方法来获得正确的结果。但在产生一个新档案时,就不是如此。

系统在产生一个新档案时,creat function 只取用read 与write 权限相关参数,也就是access

permission bits 里的S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH,

S_IWOTH 来定义产生的档案应该具有何种程度的权限。由于read(数值4) 与write(数值2)

的权限相加的结果是6。所以最大的有效数值为 666。至于所有的execute 权限(数值1)在此被忽略(access

permission bits 为S_IXUSR, S_IXG​​RP, S_IXOTH),所以creat function

在输出时一律定义为0,也就是无执行的权限。会对档案如此限制的理由其实很容易理解。因为几乎不可能有一个使用者他的所有档案都绝对必要被固定成为给予execute

权限(档案包含的型态相当多,如文字档、资料档、图形档、执行档等等),如果功能被如此设定的话,反而会造成相当多的系统漏洞,所以必须管制成必要时再由使用者自己来打开execute

权限(这就是为什么每当你新编辑完成的C Shell script ,还要用指令chmod

来加上可执行使用权限才能执行的原因)。

明了上述的原因之后,看官们您能理解,指令umask 的设定值里面,如果包含了excute

权限,又运算产生档案的使用权限时,应该要先减去(或者应该称为disable),才来作运算。所以当设定值为670,其中是第二位数字是奇数,明显的包含了S_EXGRP

的数值,所以先减去1,所已有效设定为660。此时使用最大值666 减去660,得到的便是正确的档案使用权限。

农夫我使用最大值减去设定值的方式来说明,对一般的使用者应该能较容易理解与运用。在前一版的文字说明中,我曾经提到计算的方式此用的是XOR

运算法则,它才是实际上程式的运算法则。也就是设定值被程式拆成参数后的参数演算法则。我想学习过逻辑运算的人都清楚XOR

的运算方式(如右图所示)。

以下我使用设定值067 当作例子,以XOR 的演算法则来实际设定会应该得到的结果。

a4c26d1e5885305701be709a3d33442f.png

希望看官们,能理解以上的说明(农夫我发觉改写后的版本,看起来实在相当啰唆)。以下提供一些比较常用的设定值供看官们参考:

檔案權限的最大值

設定值

結果

代表的使用權限

666

002

664

rw-rw-r--

666

022

644

rw-r--r--

666

037

640

rw-r-----

666

077

600

rw-------

目錄權限的最大值

設定值

結果

代表的使用權限

777

002

775

rwxrwxr-x

777

022

755

rwxr-xr-x

777

037

740

rwxr-----

777

077

700

rwx------

顺便附上单一设定值与档案及目录的互动对照表,如下:

umask

設定值

檔案

使用許可權

目錄

使用許可權

0

rw-

rwx

1

rw-

rw-

2

r--

r-x

3

r--

r--

4

-w-

-wx

5

-w-

r--

6

---

--x

7

---

---

假如使用者想要显示umask 的设定值,可键入指令umask,设定值即会显示出:

% umask

22

以上所显示的设定值“22”即代表“022”。因第一个数字为“0”时不显示。假如显示值为“2”则代表“002”,显示值为“0”则代表“000”。一般系统的常用的设定值有“002”、“022”、“037”或“077”等几种。

接着我们实际来设定指令并观看其使用结果:

5 % umask 022 ; umask

22

6 % ls -l > aa ; ls -l aa

1 -rw-r--r-- 1 akira 61 Aug 31 11:32 aa

7 % mkdir dd ; ls -l

total 2

1 -rw-r--r-- 1 akira 61 Aug 31 11:32 aa

1 drwxr-xr-x 2 akira 512 Aug 31 11:33 dd/

一般而言如果使用者要自行设定或更改这个指令的设定值,最好的方式是将这个指令放在“~/.cshrc”档案中,让C Shell

来为你执行。如果login

后还有须要更动,可直接在指令行模式下键入指令重新设定之。如果使用者不自行设定则系统会给于系统的设定值,一般均为“022”。

3-8-2 exit [status value] 指令

这个指令会终止C shell 的执行,并退出该C shell。如果你login shell

中执行,则功能便相当于logout。如果在subshel​​l 中执行则回到其parent

shell,并且可以在退出subshel​​l

时,给于一个执行状态变数的参数值。在不指定的情况下退出的执行状态变数为“0”。这个功能在C Shell

程式设计时,常用来设定程式不正常结束的状态值,以供我们做执行状态的查询使用,是一个非常有用的功能。请读者特别注意之。

下例中,我们在login shell

中下指令csh,其作用便是产生一个subshel​​l,如此一来我们的执行环境便由login shell 转移到subshel​​l

中了。然后我们执行指令“exit 1” 来结束这个subshel​​l 的执行,并且设定$status

变数的值为“1”。当我们回到login shell 中以指令“echo $status”显示该subshel​​l

的执行状态时,所得的结果便是我们执行指令exit 时所传回的设定值“1”。在最后使用指令exit,我们将会退出系统。

7 % csh

8 % ps

PID TT STAT TIME COMMAND

293 p0 S 0:01 -csh (csh)

361 p0 S 0:00 -sh (csh)

362 p0 R 0:00 ps

1 % exit 1

9 % echo $status

1

10 % ps

PID TT STAT TIME COMMAND

293 p0 S 0:01 -csh (csh)

364 p0 R 0:00 ps

11 % exit

3-8-3 source [-h] filename 指令

[-h] 选项将所读取的指令列入过去指令使用记录(history

list)中,但并不执行所读入的指令。

source

指令能从指定的档案中读取指令来执行,常用以执行修改过后的特殊档案,如“.cshrc”、“.login”档案等。比方你以vi

指令更改“.cshrc”的path 变数后,要如何来“执行”呢?你必须使用source 这个内建指令来执行它。如下:

% source ~/.cshrc

执行后path 变数便是你所更新的设定值。这可是一个相当重要的内建指令。

在使用source

指令来读取档案的执行过程中,请注意一个特殊情况。就是一但产生指令无法执行或产生错误时,则执行的动作将会在该指令行被终止,未执行部份将不再执行。关于这种情况,我们用指令source

来执行一个分离的别名档案来做说明:

假定档案“.aliases”内容为下:

2 % cat -n .aliases

1 alias rmr rm -r

2 alias cd 'cd \!*;set prompt = "\!

3 alias vicsh 'vi \!:1 ; chmod u+x \!:1'

4 alias lsa ls -asF

3 % source .aliases

Unmatched '.

4 % alias

rmr rm -r

5 %

当我们以执行指令“source .aliases”时,产生错误讯息“Unmatched

'.”。表示档案“.aliases”中有不合语法的alias 设定,产生了无法执行的情况。此时我们用指令alias

来看我们执行成功的别名时,发现仅第一行设定成功,而第二至第四行均没有被设定。这是因为我们用指令source

执行档案“.aliases”时,读取档案的第二行要执行时,产生了的语法错误,指令source

于是便停止以下各行指令的“执行”所造成的结果。当然第二行以后便不会执行读取的动作了。

此外在不加选项情况下使用source 指令,执行时所读取执行的指令并不会加入history list

中。如果有需要加入history list 中,必需加选项-h。但加上选项-h 的执行方式与不加选项-h

时,有相当大的差异。首先是它只读取整个档案的所有指令行进入history list

中,但并不执行指令行。其次是它也不会检查指令行的语法是否正确。所以在产生像上述的错误时,加上选项-h

的指令source,依然会继续读取下一行直到整个档案读取完毕为止。让我们再利用上面的档案“.aliases”来说明:

18 % csh -v

1 % alias

alias

首先我们执行csh -v,用意在产生一个可观看执行情况的subshel​​l。当执行指令alias

查看时发现到并没有任何别名已设定。

2 % source -h .aliases

source -h .aliases

alias rmr rm -r

alias cd 'cd \!*;set prompt = "\!

alias vicsh 'vi \!:1 ; chmod u+x \!:1'

alias ls ls -asF

此时我们执行​​指令source -h

.aliases,可明显得看出档案内容被全部读取,而且也没有错误讯息产生了。

7 % alias

alias

8 % history ; exit

history ; exit

1 alias

2 source -h .aliases

3 alias rmr rm -r

4 alias cd 'cd \!*;set prompt = "\!

5 alias vicsh 'vi \!:1 ; chmod u+x \!:1'

6 alias ls ls -asF

7 alias

8 history ; exit

9 % 19 %

我们再用指令alias 查看别名设定,结果依旧是没有任何设定。然后用指令history

却清楚看到所读取的指令行已列入其中。我们可清楚地了解到source 指令加上选项-h

之后的执行情况,与原先的差别是相当大的。在使用上请多加注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值