>> [研讨会 - Unix shell中，环境]
[道格拉斯·克莱恩 - 哈佛大学]
[这是CS50。 - CS50.TV]
>>今天的话题是Unix的外壳。
我是道格拉斯·克莱恩，专家，或至少有能力的用户的shell。
shell是为用户的计算机的操作系统的接口。
这个名字是误导，因为，不同于动物的壳，
这是硬和保护性的，在计算机外壳允许进行通信。
所以多孔膜可能会是一个更好的比喻。
>>原壳对于Unix是Bourne shell的。
伯恩的拼写B-0-U-R-N-E。
伯恩是unix下的原作者之一，
所以外壳以他命名。
该shell作为命令的名字只是简单的sh。
这是可以执行的命令。
壳开始登录。
当您登录到计算机时，shell只是开始运行你，
而这正是需要你的命令。
它可以在其他时间开始也。
如果弹出一个窗口，没有其他指示，它会启动一个shell你。
这是怎么回事，你可以去到一个窗口，并开始键入命令
等等还有，即使你没有在该窗口中登录。
此外，如果你做一个远程登录，
然后它会启动远程计算机上的shell。
并有可能在没有交互式shell中运行命令。
这可以将当前操作中的意思，
它也可以指远程操作。
你可以发送一个命令到另一台计算机，
其中包括启动一个shell那里。
事实上，它有包括启动一个shell有
即使这是不是你的最终目的。
当事情开始，像这样，它并不一定启动一个新的shell。
如果你打开​​一个新的窗口，它可以告诉它带来了一个编辑器
或一些其它命令。
在这种情况下，编辑器会从头开始。
当编辑结束时，窗口结束。
这是一个有点不寻常，但它可以做到的。
在这些情况下，它不会是一个外壳。
因此，它不一定是一个窗口或一些这样的应用程序将弹出一个shell的情况。
>>贝壳解析命令。
解析装置识别所述各元素，并将它们分类。
在一个命令，你键入完整的字符串，
将有1个或多个要执行的单个命令。
其他元素可以是参数。
还有，也可以影响一个命令的执行的特殊字符。
他们可以将输出比屏幕其他地方
如果该命令将通常将其发送到屏幕上。
它可以重定向输入，它可以做其他事情也。
还有各种其他符号，字符，等等。
解析涉及检测和解释这些事情。
>>现在，如果没有其他问题了，这是相当可能的，因为没有更多的人，
我们会继续我的下一个页面在这里。
>>我刚才说的Bourne shell是初始的shell。
还有其他的。
一个是C壳。该命令是csh。
该名称为C壳只是一个文字游戏。
这个shell介绍了与伯克利的Unix在70年代中期。
伯克利的Unix在Unix的发展的一个开创性的事件。
这是一个巨大的革命，包括引入这个shell。
究其原因，对词游戏，C壳，
是，C-shell都有它的一些特性这类似于C语言，
这是Bourne shell没有 -
或者它没有在那个时候。
另外还有TC壳。
这是C壳的超集。
它有更多的功能，其中有许多是交互使用有用的，
如在历史机制回顾命令
我将描述有点迟 -
以简单的方式，编辑为蓝本。
它也有绑定，让你可以很短的密钥字符串绑定到一个较长的命令。
我们不打算今天要进入的。
它有一些功能是对编程有用。
然而，C-shell不是通常用于shell编程。
shell程序，如果你还不知道，
是程序，包括外壳采用特质。
你可以为程序运行它们。
你写了一堆shell命令到一个文件并执行该文件。
你并不需要编译它。这是一种解释性语言。
这句话的C-shell是现在暧昧，因为它可能仅仅指原来的C壳，CSH，
或将所有的C壳，包括tcsh的。这是一个有点暧昧。
>>后来的shell是Korn外壳程序，KSH，程序员而得名，科恩。
这个壳试图将其纳入1壳
在C-外壳交互使用的优势
和Bourne shell编程。
它已被用来作为一个交互式shell的一些人 - 少数。
后来虽然，还有一个介绍，在Bash shell中，BASH，
再一个文字游戏，伯恩 - 再次壳。
这是Bourne shell中的延伸。 Korn外壳是也。他们两人都是。
它具有Korn外壳程序的合并的目标一致的C shell的
和Bourne shell中的优势1外壳。
许多Korn shell中的增强功能还包括在Bash中。
击，但是，有更多，因此是优选的。
伯恩 - 再次壳和Korn外壳程序被称为Bourne类型的炮弹
因为它们包含了Bourne shell的特性，
这是不兼容的，在某些方面与C壳。
除了有这些，一些打算限制使用其他shell，
也许仅限于某些命令，也许专业的参考，不宜经常使用。
>>好吧。这里下一个项目。
在Bash shell中已经成为各种形式的Linux相关。
我不知道如果这是每一种真实。
有很多形式存在，并且我没有使用过他们，
但在那些我用它已经成为与它相关联。
所以，据我所知，没有什么关于Bash
这使得它的任何更多的Linux兼容
比外壳与操作系统的任何其他组合。
我想这可能只是反映了程序员的倾向。
它已经成为Linux的相关的另一个原因更喜欢bash来的ksh
因为事情很可能被写在它和它的可能扩散。
我给你以后的其他原因。
的Bourne shell脚本应该在了Korn Shell或bash运行。
如果你写的东西了Bourne shell的，
你或许可以在ksh下或bash执行它。
Korn外壳脚本可能会猛砸下运行，但我不能保证。
后来就到这里，C-shell脚本应该根据TC-shell运行。
在C壳竟是从未广泛用于脚本
因为Bourne shell的和后来的Bourne类型的炮弹是最好用于这一目的。
所以这真的不是那么重要。
有相当多的，其中书面不久前的Bourne shell脚本，
Korn shell中或者是Bourne-Again Shell的面前进行了介绍。
那些仍然在使用中，操作系统的一部分，
所以你会发现他们，如果你到操作系统
或一些老节目包。
>> Bash是在一定程度上成为一种通用语言的操作系统。
它已经被延伸到Windows和VMS。
VMS，如果你不知道，是一个专有操作系统
数字设备公司，该公司仍然在使用，主要是在幕后的。
如果它的将是在几个不同的操作系统上运行，
可能是人们往往转向它。
但这种发展也比较近。
这是刚刚开始，所以我无法预测这是否会变成真正那种用得上。
同时，由于文件路径名和库的不同
这些不同的操作系统之间，
你可能不能够在一个操作系统上编写一个Bash脚本
然后在另一个上运行它。
你应该能够将其移动不同的Unix，Linux之间
的Mac OS操作系统，但不一定Windows或VMS。
你可能需要更改文件路径名的描述，
而一些图书馆可能会有所不同，
这可能会影响的方式，一些命令的工作
或者他们如何处理参数等。
除此之外，这里的另一个注意事项是难保
所有我提到的不同弹 - 的Bourne shell，C壳，
TC-外壳，Korn shell中，伯恩 - 再次壳 - 将在任何Unix可用
或Linux或Mac OS的计算机。
他们可能根本不存在。
这是这里的注意事项之一。
这是一个不幸的限制，在这里，因为你想要的东西的工作无处不在，
但不幸的是，你不能依靠这一点。
>>好吧。这里下一个。
比方说，你想编写一个shell脚本，
一个方案，包括shell命令。
你写你的命令，将它们放在一个文件，执行该文件。
如果您要包含的参数？
在shell操作的情况下，参数被称为参数或位置参数
他们会用一个美元符号和数字，$ 1，$ 2中可以调用。
因此，如果脚本有这个名字，我的第一个参数可能是说法1
而我的第二个可能是参数2，
和我的脚本里面，如果我要引用这些东西 -
让我们抹去这一点，因为我不是真的要运行它 -
我的剧本里我可能有1美元是指ARG1，
$ 2中，会出来这样一来，ARG2。
因此，那些符号可供参考的参数，
和那些适用于所有的炮弹。
此外，还有一些其他字符。
$ *是指整个参数列表，所有的人。
$＃代表参数的个数。
再次，这适用于所有的炮弹。
这些符号，*和＃，可以与在其他地方还有那些含义。
我们不会进入的。
>>贝壳符线。那是什么呢？
比方说，你已经写了一个脚本，它是一个特定的shell，你要运行它。
你怎么知道哪个shell操作系统将使用运行你的脚本？
在一个点上，你可以认为它会运行在Bourne shell中
如果你不说，否则，
但人不是写在了Bourne外壳脚本那么多了
而且你甚至不能依靠这样了。
所以在这里，我们有一个shell符线就在这里。
指定猛砸。
请注意，它指定它的路径名，/斌/庆典。
如果一台计算机有在Bash shell中，但不是在bin目录下，/ bin中，这是不行的。
这是另一个预选赛，另一个小心这里。
英镑符号是注释行字符。
这适用于所有的shell。
这里的特殊情况下，＃！在脚本的开始，是一种特殊情况。
指定要在其中运行脚本的外壳。
正如我说的，它可能不是同一个地方/ bin中。
此外，还有这里另外一件事。
如果你只是用井号，没有感叹号和路径名，
应该指出一个C壳。
但是，我不建议这样做，因为我不能保证
这将始终工作。
如果你想一个C壳，倒不如说出来。
再有就是这里的东西相当混乱。
如果您使用的shell符线例如/ bin / bash的
而且外壳是不可有，
有没有这样的东西作为该特定计算机上的/斌/ bash中，
可能是因为它不具有击或者因为它在不同的位置，
你会得到一个错误，告诉你，你运行该脚本不存在。
当然还有你的脚本存在，使错误信息是混乱的。
操作系统为您提供了错误的原因
或者更准确地说，你在其中运行此交互式shell给出了错误，
是，它会报告你使用的命令，这是脚本的名称。
该命令实际上是由脚本的名称被叫做shell。
这就是你得到令人困惑的错误消息。
另一种方法来调用shell脚本
是通过指定的shell命令行上，如下。
这是一个命令。这是说运行猛砸，然后在Bash中运行我的脚本。
这将优先于符线，
这有让您为不同的路径名的功能。
如果你只是给一个命令时，操作系统将查找命令
在不同的地方。
如果有的话，就应该找到它。
电脑会发现猛砸无论它在哪里，并运行它，
所以你不需要再被关注的地方找到它。
还有潜在的其他问题在这里，
因为如果有超过1版本的Bash，这是可能的，虽然不太可能的。
所以这是另一种方式来处理这些事情。
说明行可以调用任何shell。
他们也可以拨打事情比其他炮弹。
例子我这里是用sed，这是流编辑器;
awk中，这是一个模式处理语言;
和perl，一个非常高度发达的脚本语言。
如果你把一个符线，表示这些方案之初之一，
它会直接进入该程序，而不是启动一个shell。
这些程序必须限制自己的能力。
Perl是很能干。 sed是一个编辑器。它可以做超越简单的编辑东西。
但它可能很难编程这一点。
此外，传递参数和东西向的脚本是不可能或混乱。
因此，在这种情况下，使用awk或sed的，它是，至少在我的经验，
最好写一个shell脚本和呼叫笨拙或从shell脚本sed的
而不是调用的awk或sed的作为脚本说明符线。
Perl是一个高度多元化的语言，如我所说。
您不能运行交互式命令在perl中，
这意味着你不能测试的脚本，你正在开发的部分
通过交互方式运行它们。
然而，这是一个非常有能力的语言
并已经发展成为一个非常广泛使用的工具。
这只是说明符线的括号备注一点点。
>>在所有或大多数形式的Linux - 再一次，我不能肯定这一切 -
而在Mac OS上，如果你输入你的csh tcsh的获得，
如果你输入sh你得到的是bash。
他们试图在那里给你这些炮弹更先进的版本，
但是这可能会造成混淆。
如果你写使用的tcsh脚本或Bash特性，同时呼吁csh或sh的
然后尝试不具有的tcsh或bash的计算机上运行它，
你可能会得到一些错误，如果有命令在那里
而那些炮弹不承认。
此外，你可能已经召集了在本地计算机上你的shell
称其为sh或csh的，然后得到更高级的壳。
你甚至可能不会想到的，你使用更高级的壳的事实。
因此，这是一个潜在的缺陷。
它是如何建立的，如果你输入sh你猛砸，
如果你输入的csh你TSCH？
有些事情在这些计算机被称为链接
它可以连接到文件的名称来引用同样的事情。
它可以是2的名称相同的文件或一个文件，其目的是指向另一个文件。
他们被称为硬链接和符号链接。我们今天不会进入这样了。
也可能有单独的文件 - 1文件SH，1档巴什 -
但它们都运行猛砸。
然后还有一个限定词在这里。
如果你调用这些炮弹的一个名字之一，
你可能会认为你会得到相同的功能由另一名调用它。
嗯，这其实未必是真实的。
这些命令可以检查它们被称为名
他们可以，那名的基础上，有不同的行为。
有可能是试图符合标准的问题。
你们有些人可能已经听说POSIX标准或其他的，
也许其他功能。
这有时可以通过命令行参数来选择
或通过设置shell变量。
调用它的sh或bash中实际上可能导致不同的执行
即使是你正在执行相同的文件。
另一个要考虑的是，即使另一台计算机的tcsh或bash，
如果他们没有链接，因为它们是在本地计算机上
如果你有一个Linux或Mac OS本地计算机，
话又说回来，你会得到你调用sh或csh的外壳，而不是你可能更喜欢的之一。
当前的Bourne shell有小的改进比那些在Bash中
但过去那些在原来的Bourne shell。
作为其结果，即使在当前的Bourne shell，SH，
即使它不是猛砸，类似于C语言超过了C壳一样。
这不是第一次建立了C壳时真实的，但它已经开发出的方式。
您可能会注意到这里，除了Bourne shell的所有这些壳的名字
有东西来表示他们是哪个shell - 长山壕时，bash -
但Bourne shell的仅仅是SH。
为什么呢？这是原来的外壳。
它是贝壳的话，不是一个shell，
而且由于它是外壳，没有理由从另一个shell区别。
所以这就是为什么它有这个名字，仍然一样。
>>这里这上面是从一个密码数据库中的行账户我有有
在另一台计算机。
我要设法让这个名字所以你可以看到，部分在年底，外壳。
密码数据库保存了所有用户的登录特性。
在开始的时候是用户名，你现在可以看到的最后2个字母的我。
这里的字段以冒号分隔。
最后一个字段，如你所见，是斌/ tcsh中，外壳。
这就是壳说明。
还有这里一些有趣的事情。
如果是首次开发的Unix，也仅有1外壳，
所以在那里别无选择。
那么，为什么他们允许在密码数据库中的字段指定一个shell？
我不知道，但它是幸运的，他们做到了。
这是相当困难的修改在密码数据库格式
因为很多程序是指它的格式
并且将不得不被重写。
那就是他们包括该字段的恰当的或偶然的发展。
那种一个密码文件中的行都是用在所有的Unix和Linux电脑，所以据我所知。
在Mac都有自己的系统。
它实际上与该格式的行的密码文件，
但是这不是在用户特征被定义。
另一个括号备注那里。
>>如果你调用一个shell，你可以把它作为一个子shell现有的炮弹。
所以，如果我去这里，让我们摆脱这些东西。
在这里，我在C壳。
该变量，从而准确地确定了我的壳，
其实并不总是确定你正在运行哪个shell的一个可靠的方法，
但在这种情况下，它是。
如果刚才的输入 -
现在我在Bash中。
有些事情会是相同的。 LS告诉我，我的命令。
如果我做了一个暂停回我的C壳，LS，一样的。对不对？
FG，前景，回到我的Bash shell。
PWD，当前目录，返回到了C壳。
PWD，不同的目录 - 其实不是在这种情况下，不同的目录。
这是相同的目录中。
比方说，我想在这里调用一个命令：其中LS。
那是什么呢？
它告诉我那里的ls命令，
一个，让我一个目录列表，位于LS。
让我们回去的Bash shell。让我们尝试同样的事情。
嗯，有趣的那里，在那里：找不到​​命令。
这是为什么？
where命令是建立在与C壳。
这不是必须从其它地方读入到存储器中并执行的命令。
在C-shell中执行存储在它自己的代码的一部分运行它
它不是在bash shell。
所以猛砸，没有这样的内置命令，查找它，没有找到它，
我们得到一个错误。
因此，我们有一个Bash shell中下一个C-shell中运行，我们称之为一个子shell。
而万一你很好奇，Bash shell中有它自己的定位命令的方式。
散列是指它可以更迅速地执行的事实，
被发现更迅速。
这是建在一些炮弹的增强功能之一。
>> Bourne类型的炮弹是首选的编程。
他们有像循环，条件语句控制结构，
您可能会在编程语言使用像C的排序命令
或任何一种语言。也许你正在编写Java或别的什么东西。
shell有这些呢。
伯恩的型壳，尤其是Bash有更多的
和它们的设计具有更大的灵活性。
在Bash shell中有数组。原来的Bourne shell没有。
所以，可以进行编程相当合算。
在C壳实际上确实有数组，但并没有很多的这些其他功能。
伯恩的型壳会执行得更快
如果它们不具有用于交互使用的功能。
你加载下来的东西只有一个目的，这将加载下来用于其他用途。
有这么权衡那里。
这是用于交互使用这些功能
真的是很少或根本没有使用的脚本。
它可以使用一个交互式子shell就像一个我在那里开始
测试一下，你打算在脚本中使用的命令。
这就是你不能用Perl做什么。你可以用贝壳做。
即使是像for循环等等的结构可以交互方式运行。
他们以交互方式运行偶尔有用，
但更可能你使用他们开发的脚本。
>>别名。
这将是有关C壳。
在那里，你会回到前面的命令历史机制
或其中某些部分，你已经运行。
再次，有关C壳，Bourne shell的和Korn外壳程序有这些东西，
但我不打算进入他们。
因此，这里有我有一些有用的别名。
而不是输入ls - 这是一个共同的命令 -
只要输入L和保存自己1个字符。
LS提供了各种选项，所有这些工作。
请注意，这些定义都有他们周围的报价。
在这些情况下，引号是没有必要的。
如果你可以定义这些别名不带引号，它仍然工作。
他们建议。
有在其中您不能使用的情况下报价
因为你想要的东西发生该报价将阻止。
有时候，你可以引述的定义的一部分，但不是全部。
这也是一般建议使用单引号而不是双引号。
双引号对变量定义的影响，
特别是使它们进行评估，而不是停止它。
为什么我们要停止的评价？
以及如何报价替我们？
>>这里是你可能会发现有趣的命令。
“LS G *'
G *，你可能知道，是一个通配符表达式
所有的文件名相克的开始。
如果我只是写在一个ls命令G *，我会在我的当前目录下的所有这些名字的列表。
如果我定义了别名，因为它是这里的引号，
它会在你运行它当前目录运行该命令。
但是，如果你不带引号运行别名定义，
它会评估通配符G *当运行定义命令。
所以别名的定义将被LS接着文件在目录列表
在其上执行命令的别名，
无论在哪里，你确实要运行的命令。
这是没有多大用处，而单引号防止星号的评价。
所以，你刚刚得到的定义之中LS G *。
然后，当你运行的别名，LGS，它进而提出了这一点。
现在有没有引号，并且在运行alias命令，将评估星号。
所以这是一件事。
双引号将有同样的效果在这里，
但也有其他案件中，双引号是行不通的这么好。
>>这里是另外一个。
你可能知道grep命令。
grep命令可以被用来扫描具有一定的字符串的行的文件。
所以，让我们在这里，我会退出从我的Bourne shell。
好吧。这里有一个文件。
比方说，它的grep ABC字符串。在那里，它是。
如果我做的grep zddd，我什么也得不到。好吧。
所以找到一个字符串，它会报告它没有找到，它不报告。
它输出一个具有该字符串就可以了任意行。
有各种各样的选择这里，你可以在文档中找到。
下面就来做到这一点的方法之一。
这个怎么样，别名grabc的'grep ABC'？
那将包括1参数的别名定义时。
所以，如果我这样做，在这里，现在如果我做grabc，
现在的别名包括超过简单的命令。它也有争论。
到目前为止的作品。
我这里有另一个命令，这一个，所以这些都是不同的字符串在那里
并且表明，该未发现任何存在，因为它不匹配。
>>如果我想在别名定义，以包括我将要搜索的文件
我想给作为参数传递给该别名，我要找的字符串？
我可能要说ABC作为参数传递给我的别名，
但该别名已经确定的文件。
而这也正是这个表达式的用武之地。
注意这里我们使用grep像以前一样。
我们有文件在这里，字符串。
\！^，有种奇怪的表情，我想，如果你还没有见过这个。
感叹号是C shell的历史记录机制的一部分。
它可以回忆较早的命令，它可以调用的参数的那些命令等等。
历史机制被用作混叠的一部分。
如果指定了感叹号后一条线，它会参考该行历史记录列表，
我们不会陷入现在，因为它是一个整体的其他话题。
它可以指定一个线路的一部分。
所以！3:2将指挥3号的第二个参数。
这里在这个表达式中插入符号代表第一个参数。
如果你不给它一个迹象，其中的命令你指的是，
它是指紧接前面的命令，
和插入符号是第一个参数的象征。
因为它是插入符号，而不是数量，你不需要使用冒号，
所以！^指的第一个参数前面的命令。
这里有点混淆。
在这种情况下，当你使用这个作为别名的定义，
历史上的参考指回在其中别名使用的命令。
因此，这是要回1命令作为历史操作，
但作为一个别名操作它指的是你会在其中键入命令，
说，grstrings_file。
我们这里有它的报价。什么是反斜杠呢？
在这种情况下，与其他地方一样，我们并不想执行的历史记录机制
在定义别名。
如果我们没有足够的反斜线出现，外壳会拉在第一个参数
右才跑了这个alias命令，这是我们不希望的命令。
我们希望这是内置在alias命令中的参数后调用。
单引号不要逃避感叹号，历史参考。
也许你知道的表情逃生手段来改变某事的意义。
在这种情况下，这意味着停止的东西从具有特殊的意义。
感叹号的特殊意义是历史。
逃跑，它不具有意义。
报价不这样做;反斜线一样。
所以，我们实际上正在使用2级逃逸这里。
我要提出这个命令到另一个窗口，而无需键入它
通过使用这些编辑操作，这可能对你有用。
别的东西在这里我会告诉你。
如果你只需要输入别名，不带任何参数，它会告诉你所有你的论点。
这是一堆的别名，我已经在这里了
除了那些我一直在使用今天已经。
但是，如果我只需要输入与别名的名称，它告诉我这是什么意思。
请注意，引号都走了，反斜杠也没有了。
这里这个字符串是别名定义的结果，
现在它刚刚！^在里面。
这要看看在文件字符串东西。
所以，如果我做grstrings_file字符串，我没有给它任何东西去寻找那里，
但它在寻找字符串。
它没有找到这个词的字符串在文件中的字符串，但它确实找到ABC。
它不觉得。
所以在这里我们给击中到别名的定义参数，
被插入到它。
这就是这个表情从何而来。
您可以使用超过1。
插入符号是第一个参数的象征。
如果你想使用第二个参数，你会然后说：2。
还有第二个参数没有特殊符号。
而且由于你使用的是数字，你将不得不使用冒号。
然而，还有就是，这里的另一种选择。
美元符号表示最后一个参数。
而且由于这是一个符号，你可以省略冒号。
所以它会在列表中的最后一个参数。
还有还有那一个。
星号意味着一切，所以这是完整的参数列表，
又一次，你可以省略冒号，因为它不是一个数字。
我希望你们都遵守了这一切。
>>历史机制可以回到更早线在历史列表中。
你可以在一个别名定义做到这一点。
我从来没有见过这样做。
那就得从历史列表中拉出前面命令的效果
当您执行的别名，这可能是不同的命令
这取决于你执行它的时间和地点。
可以想象你可能想拉出这样的引用
只知道一个较早的命令了。
我从来没有见过这种情况发生。
我想有人可能会想，但这是不太可能。
这里有另外​​一件事。
如果您使用的历史类型的引用，
那么只有参数其中有这样一个参考使用。
如果您有不使用的历史型参考别名定义，
如果它仅仅成为命令的开始
和你有进一步的论据，那么任何你之后键入
将被添加到该命令。
在这种情况下，我只是给了那里的例子中，我们使用的第一个参数;
我们没有使用任何其他人。
如果其他参数已经在命令行上被赋予，他们就不会被使用。
所以，如果你使用历史参考的话，那么你必须使用它来得到任何说法。
>>还有这里另外一件事我只想说，部分插入语，
即用感叹号这段历史机制
又回到了原来的C壳。
在tcsh的介绍历史操作
其中使用了各种各样的编辑命令和字符串，
无论是Emacs或VI。
我个人的意见是Emacs是非常容易使用用于此目的
即使你用vi进行常规的编辑。
有些是现在适用于各种历史Emacs的命令。
对照组p得到在历史列表中的前行。
另一个控制普将得到你之前的那个。
上箭头做同样的事情。
控制无获取下一个命令，如果你已经回滚动的一些方法。
向下箭头不太多。
您可以将左到右的箭头和其他各种东西。
这可以使历史机制的用途
比使用感叹号语法更容易，
但你不会使用，在一个别名定义。
我们就去了其他一些时间。
>>变数。
你知道哪些变量是编程语言。
炮弹让他们也。
在C-shell使用设置为变量赋值的命令，
因此，设置变量a为b的值 -
正如我所说，一个无用的定义，但它是如何使用的说明。
set命令将创建一个变量，如果它不存在。
对于shell脚本的位置参数可以被认为是变量，
但使用它们以及它们的规则有所不同。
您可以在脚本的过程中价值不分配到1美元。
你必须定义一个新的变量，为此目的，如果你们当中有些人想要。
输入设置不带参数，你会得到所有当前定义的变量的列表。
并让我们到我其他的shell这里，看看我们得到了什么，如果我们做到这一点。
相当长的清单中有，对不对？
向上滚动一点点。看着这一切。
有些事情是由shell自动定义的。
在shell创建变量并给它一个值。
其中有些是由shell定义，但随后由用户重新定义
根据他的喜好。
其中一些是由用户根据自己在做什么的那一天创建的。
这只是设置不带任何参数。
还有这里的这个东西一个奇怪的特点。
有要么没有等号和变量名之间的空格
并在等号两边的值或空格符号，
在这一个。
这可不行，这实际上是一个有效的命令
但它不会做什么，你打算。
该命令将工作，因为如果你只是说集和变量名
不带等号或集和变量名与一个等号和没有价值，
将变量设置为空值。
所以设置一个=是一个有效的命令。
该组指令可以在相同的行中定义多于1个变量。
所以这里这个命令定义a和b为null值的效果。
可能不是你想要的。
这一个在这里，前面所提到的，会导致一个错误
因为= b不合法的表达式。
变量名不能以等号。
并有在这里这些进一步的东西。
冒号是用来选择从历史行参数，
它们可以被用来 - 我没去成前 - 修改这些东西。
它们也可以被用于修改shell变量。
这一个在这里，$ A，有一个值。
：R将起飞的延伸。
一个扩展将是什么，下面的一个点，
一个点和任何在文件的末尾跟随它，
仅在该列表的最后一个斜线后结束。
所以，我有在这里。
一个是。它会下降的。Ö。
如果没有扩展名，只有最后的斜杠后的路径名，它不会有任何效果。
一：小时，该变量表达式，将脱下的目录列表的最后一个元素，
再次，只有在最后的斜线。
所以，/ A / B / C变为/ A / B，
但是这一次被改变，因为列表后的元素为null。
在这里有这也是我想强调某事。
这些限定符不搜索这些文件的存在。
他们只是寻找字符串。
这些都是为了操纵文件名，路径名，
但他们可以在任何字符串被使用，即使它不是一个文件名。
他们不找的存在，
因此，如果没有这样的文件，/ A / B / C，这仍然可以工作。
无论是任何使用的是另外一个问题，但它仍然可以工作。
变量是不同的的Bourne shell。我们将在稍后。
美元符号可以像感叹号和星号进行转义。
美元符号可以用反斜杠转义或单引号。
双引号在所有的炮弹效果奇
迫使一元钱的评价标志变量表达式。
所以，如果它被转义单程，双引号可以有效果
的导致它无论如何评价。
这是一个有点混乱。
如果有多个层次逃避，如在双引号单引号
或在单引号双引号，你应该测试一下，看看会发生什么
给一个变量，如果你正在使用一个。
那些2的情况下 - 的双单，单双层内内 -
不一定给你相同的结果。
环境变量，绑定C-shell变量。
环境变量也是在C-shell变量，
他们也是变量在其他炮弹了。
在C-壳，它们是有区别的。
的事情，我是说之前是关于shell变量。
环境变量是一组变量不同的
除了我们称之为绑定变量的几个变量，
这是非常重要的，我们将进入那些后。
环境变量被自动传递
以贝壳或从你的shell中运行的命令。
其他的东西都没有。在shell变量，别名都没有。环境变量。
这就是为什么我们称他们为环境变量，
的想法是，环境的延伸过去只是你当前的shell。
它们可以被用来定义活动为命令。
下面是一个例子。打印机，LPDEST。
这两个变量可以定义一个命令将用于打印的东西的打印机。
如果你身边有多个打印机，你可能想要把你喜欢的人。
我们有2个变量的原因是不同的命令集写
使用这些不同的变量。
你可能会给予他们不同的值。
最有可能你会给他们两个相同的值。
这些东西的工作，因为做印刷的命令
被编程来检查这些变量的值。
如果一个程序没有写这样一来，如果它被写做别的事情，
该变量是不相关的。
所以操作系统是不是找这些变量
每次你指的是打印机的时间。
，做印刷的命令是寻找这些变量，如果它是编程的方式。
这些变量通常在初始化文件中定义
但不一定。
你可以在命令行中定义它们。
它们可以在一个命令来定义。
运行一些命令可以有自己的选择的变量 -
变量所特有的特定软件包，例如。
当您运行该程序包，他们将被定义。
如何这些变量传递给子shell？
当一个子shell写，不写进入该地区。
子外壳，致力于环境变量的区域
不写入由子壳;它是由复制。
当你运行一个普通的命令，如这些命令来打印或什么的，
他们通过创建一个新的shell开始。
壳创建一个shell，然后重写它的一部分
与你正在运行的命令，这是一个有点混乱，
但是这是这些命令怎么弄的环境变量
他们然后参照后面。
该命令在这里定义的变量SETENV。
这就是你如何定义它。这3个元素：SETENV，变量的值。
如果你只是用的setenv没有参数，你会得到什么？
所有这些变量的列表。
再次，这是一个不错的长长的名单，并在这种情况下，在别人，
这些变量在很大程度上定义了我的登录操作由shell本身
而不是由任何我做到了。
还有这里的另一个命令，printenv的。
这也打印出了环境。
请注意这最后的东西在这里，编辑= VI。
那说，如果我使用的东西，调用一个编辑器
我没有指定一个编辑器，它可以让我选择，它可以给我六。
如果我做printenv的编辑器？它告诉我它是什么。
右之前，有一个变量，减。
这些是你的默认选项，当我运行less命令，
其中显示文件。
所以，如果我这样做，printenv将可能需要1或0自变量参数，
不超过1。
还有其他一些命令还可以，但我们不打算进入所有今天。
记得有修饰符的shell变量，如：H，
它会掉落一个路径名的最后一个元素，
或：R，这将下降的延伸。
现在，那些适用于环境变量了。他们没有用。
它曾经是他们不能被修改。现在，他们都可以。
它与炮弹多年来的发展的进步之一。
我是说，炮弹作为环境的一部分
而在C-壳壳变数，但有一些例外，不同的集合。
你可以建立一个环境变量和shell变量具有相同的名称。
他们将不同的变量，它们可以有不同的值。
改变一个变量的值不会改变另一个的值。
这些变量都是评估与美元符号 - 美元，$不管。
所以，如果你有这是什么？你知不知道你是哪一个？
在我的测试中，我得到了shell变量，
但这不是记录并不能依靠这一点。
所以我问你，是创造的shell和环境变量
具有相同名称的一个好主意？第好吧。
什么是那些主要的例外所处的环境和shell变量
被彼此连接？
有这些4。
大写字母TERM环境变量，
shell变量术语小写字母，终端仿真类型。
我只是要去在这里，我打算做的回声，一个有用的命令在这里，
$ $ TERM任期。和那里。
是的xterm终端类型为X Window系统显示的窗口。
xterm的颜色就是一个变化，它允许不同的颜色。
为什么我们定义这些？这是什么好处？
这就像重新编辑器屏幕的命令
发送特定序列，称为转义序列，
到一个终端或窗口来重新排列，并且依此类推。
这些序列是不同的不同类型的终端。
这告诉它使用哪个。
有时也有问题存在。
你可能想改变这种状况。
如果事情不工作，有时终端类型设置错误，
您可以通过重新定义术语变量来解决它。
在这种情况下，改变一个变量，环境变量或shell变量，
应改变另一个。
我通过经验发现，改变长期以大写字母
不经常变化的shell变量术语小写字母。
这是一个错误。
我不知道这是永远正确的。大多数时候它是不正确的，但它可以是。
所以，如果你做出改变，只是检查了这一点。
这不是经常，你需要更改该值，但一旦你这样做了一段时间。
环境变量USER。
再次，在大写字母的环境变量，在小字母shell变量。
这是您的用户名。
这是只有在非常特殊的情况下
你会想改变这种状况。
如果您的用户名是别人，它可以引发各种各样的事情了。
主目录，用户的主目录。
同样，你不会想改变这种状况。
在所有这些情况下和一个我们将要覆盖，路径变量注意，
环境变量是大写字母，被绑定的shell变量是小写字母。
如果你换一个，你应该改变对方。
这种结合不能成立，因为你不能绑定2个变量，
除了这4个，并在这些变量的绑定无法挽回，
你不能把它们分开。
因此，这4个变量对被绑定。
他们总是会。没有人会。
此外，这将有可能创造具有相同名称的变量
相反的类型。
你可以做一个shell变量术语小写字母
或环境变量TERM大写字母。
这些变量是独立于这些成对变量
并且他们将是相互独立的。
我无法想象，你为什么会这么做，除非你想迷惑人。
这一个在这里，path变量，这是一个非常重要的问题。
这里的另一件事是，有可能是个案
与未结合到彼此相似的成对的名称的变量。
可以有变量，壳和贝壳，在资本和小写字母。
基于这个名字，你不知道，如果该变量是一个shell变量
或一个环境变量，并且它们不彼此结合。
所以那种成对的名字并不意味着绑定变量。
路径变量，这是我之前展示，
是路径名的列表，其中的shell查找命令。
让我们在这个窗口在这里，我们会尽回声$ PATH中，大写字母 -
环境变量 - 回声$路径，小写字母 - shell变量。
注意，目录列表是相同的。这些约束。
改变一个人，你改变了其他。
在环境变量中的元素用冒号隔开。请注意。
在shell变量之间用空格分隔。
此环境变量是一个字符串。
shell变量是一个数组。
是Bourne shell没有数组。
bash的操作类似，但是这已经是外壳的固定部分。
这是一个字符串，而不是一个数组。
在C壳总是有数组。
该数组是非常容易的工作。
您可以参考它的一部分。
所以回声$ PATH [1]和我的/ usr / bin中，第一个元素。
再次，记得美元符号代表的历史列表的最后一个元素。
会发生什么呢？它试图寻找美元符号作为变量符号。
我逃避它。哎呀。它不会采取，要么。
有些事情不工作这么好。
也许我们就离开了这一点。
星号指的是整个事情，但是这就是你得到的，如果你不指定一个元素。
另一种方式，数组变量可以被操纵，
元素存在，7元素的数量。
在这里，我们把英镑符号变量名之前。
这里是另外一个。打上问号存在。
这是一个逻辑值。指示该变量是否存在。
这是使用变量的另一种方法。
这，顺便说一下，不一定是一个数组变量。
这可以是任何可变的。
如果我这样做，有没有这样的变量，我得到一个0。
有关变量的评价另一个小东西在那里。
回到这一个在这里，如果你想用这个来工作的一些原因
而不是与阵列工作，外壳变量
有一些命令可以基于冒号分开这些事情。
事实上，如果你将要在Bash shell中有可能这样做，
某种类型的脚本，那将是很可能你会怎么做。
但在C壳它更容易使用数组。
在Bourne shell中，变量是通过这样一个表达式赋值，
就像你可能会在一个编程语言赋给一个变量的方式，
这里必须没有空格。
这是必要的，它只是1串。
在Bourne类型的炮弹，所有的变量都是shell变量。
环境变量是shell变量的子集。
它们从非环境变量由出口区分开来。
要做到这一点的命令是出口，出口像打印机。
如果我们定义这样的变量，
如果我们想打印命令来找到它，它必须是一个环境变量，
这就是我们如何使它之一。
这里有什么东西那种混乱。
这表情，出口环境，源于这个Bourne shell的概念，
可是该表达式用于在C-壳的描述，
哪里有没有这样的命令出口。
如果你刚刚说出口本身，你得到的出口列表 -
所以，如果我只是做外销这里，没有这回事。
好了，我们走吧。
这些东西，顺便说一下，也由shell定义。
我没有我自己定义任何的这些。
外壳本身并各种各样的东西。
它应该会自动做的事情。
在bash或Korn shell，可以运行像这样的命令，
这都将给出一个变量的值，并在1命令导出。
在Bourne shell的命令，他们必须像出口的单独命令。
这里是另一个方面，这是令人困惑的。
在C-shell中set命令定义变量
和不带参数告诉你的变量的值是什么。
在bash shell，不带参数的set命令做同样的事情，
但随着争论它确实完全不同的东西。
因此，这些都是这里的各种参数。
其中也不乏一些环境变量，其中有些变量是shell变量。
他们都是shell变量真的。他们有些是环境变量。
带参数的set命令可以用来操作
对位置参数的脚本，
这是越来越一次全部的方法。
我们不能真正进入了今天。
它也可以用来改变壳的行为。
特别是在Bash中还存在变数，这将决定如何在shell的行为。
那么也只有这一个命令，你可能会看到，这个命令。
排版后跟变量和变量类型是用在Korn和击炮弹。
这不是强制性的，但它可以被用于限制变量的值，
这可能是有用的，以防止错误，而且它是相当常见的。
所以，我只是提的是，如果你在某处看到它。
where命令。
还记得我前面提到的where命令在C壳，
它可以告诉你一个命令路径名的位置。
下面是命令替换。
你应该找到你的键盘某处的字符，看起来像这样的。
在键盘上的位置会发生变化。
我们已经把它称为反引号。这是关于一个报价的大小。
它从左上角到右下角。
在这里，我的Mac键盘上它在左上角的角落。
该字符可以用来在命令中执行命令。
如果你有反引号里面的表达式，
该表达式是一个命令，它的运行。
该命令的输出
然后，替换为全反引号表达
然后与输出运行一个较长的命令里面
作为论据等等的字符串的一部分。
这里是它使用了一个命令。
让我们来演示操作在这里。
让我们在这里，取出后引号。
控制一个得到我与Emacs编辑语法行的开头。
到目前为止，路径名是什么地方呢，
但是当我做了这个样子，它的路径名的名单，然后塞
在这个地方整个反引号表达和运行ls-l的对他们。
一种方便的，对吧？
所以这是一个绝妙的事情。这就是反引号工作。
现在，让我们再稍微往下走。
这些都是别名。实际上我用这些。
我会尽力让这个与1的编辑操作。
好吧。
现在让我们看看这些定义是怎么来的。
别名长宽高告诉我它是如何定义的。
请注意，这只是这一点，但外报价已采取关闭
和感叹号被取下。
！*，所有参数的完整列表。
在别名定义，它会回到应用到哪里我用这个。
长宽高KSH是bash。好吧。
看到是如何工作的？它为我节省一些打字。
我们去了一点点只是提别的东西在这里。
注意这里这些不同的炮弹。我以前也说过这一点。
长山壕有一个2过这里，所以没有/ bin中/ tcsh的。
我们可以通过其他方式证明这些其实都是同一个文件。
记住我，如果你输入sh你让bash在说什么。
键入此，你会得到这个。
但这些都没有联系。那些具有单一的人那里。
这是不是一种文件，可以调用另一个。
因此，这些都是单独的文件，在C-壳的是同一个文件。
返回到这里，这里的另外一个，这个别名，
注意，正在运行此命令，文件。
该别名运行的。文件告诉你的文件的类型。
所以FWH KSH是bash。好吧。
这是该文件命令的输出。
我不知道，如果你知道这意味着什么在这里，
Mach-O的通用二进制与2架构。
有在Mac的2个可能的处理器类型，
有的也编写程序能够与这两种运行，
和文件命令可以确定，所以这就是这个意思。
这两个文件被写入的方式。
于是我们看到了别名的作品中，我们看到了反引号的作品，
我们看到的实际文件ls或者文件的工作。
这可能无法正常工作。试试“哪里哪里”和“长宽高其中”。好吧，让我们来试试。
哪里哪里。
那里是一个shell内置的。
记得早些时候我们发现，猛砸没有在那里。
如果您在Bash shell中键入，你会得到一个错误信息。
它的外壳只是一部分，而不是作为一个单独的命令。
会发生什么，如果我键入长宽高找哪里？看看会发生什么存在。
跑到哪里哪里，得到这个输出，然后试着运行ls
作为升在哪里是一个shell内置的。
其中是存在的，但其他的人不存在。
这些都不存在，其实。
所以这并不总是有效，而且还说明了如何一些事情
不这样做挺你可能认为。
让我们往下走远一点这里。
这这里是在Bash中。这也是像反引号命令替换。
但是，与反引号，它使用这个变量的风格。
有许多的以一个美元符号表达式，
虽然这些都不是变量，他们借来使用美元符号
提示某种形式的表达。
可以用括号或方括号或双括号括起来，
它有不同的目的。
这里单括号是一个命令替换就像反引号。
双括号实际上是一个算术运算。
还有其他的语法，以及其他操作。
反引号语法可在Bash中。
然而，这一次是优选的。它更容易阅读和它允许嵌套。
您可以在$（命令）另一个命令，
类似的东西 -
我到那里列表。
这将工作，如果我有反引号也。
如果我想要做这样的事情 -
你可能不会真正使用这个命令，
但这个内部命令替换呼应了开头的所有文件的名称，
那么这一个运行ls-l的这些文件，
然后这个刚相呼应的输出。
你可能不会做到这一点，你只会做回声或LS，
但是这说明了命令的嵌套工作。
所以，只是一个在这里的功能。
我提到这早些时候，当你有地方在C壳，
请在Bourne类型的炮弹作品定位的命令。
内置命令，正是我说有。
命令是外壳，像其中的一部分。
当shell执行命令ls之类，它找到它穿过的路径，
发现它在某些目录中的某个地方，
读取到内存中，创建一个新的shell，
读取命令ls或任何入壳
那里的环境变量已经位于，
然后将执行转移到它。
内置的命令，该命令的代码是壳体内，
因此外壳刚开始执行它自己的代码的一部分。
其中这样的命令。它实际上变得更快。
它不具有读取在存储器中的任何事情;它已经在存储器中。
内置的命令总是优先于命令同名。
命令是在目录中的路径可能具有相同的名称，
在不同的目录命令，文件在不同的目录。
早在路径中发生的一个是一个，你会得到。
如果有一个内置的命令，你总是能得到它。
有没有办法给它的优先级低于路径的命令。
如果您想获得该路径的命令，你可以输入完整的路径名。
如果在那里的路径是一个命令的地方，
您可以键入/ bin中/在那里，你会得到它。
如果您不想输入完整的路径名，你可以定义一个别名。
事实上，如果你给的别名名称相同的内置命令，它会工作
因为别名定义进行评估
前壳确定它是应执行的内置命令。
那么这个就有点更复杂一些的命令在这里。
一些命令的情况下，实际上是内置的命令和路径。
其中之一是回声，命令我只是用了一小会儿前的那些例子。
回声路径中的一个命令，它在每个shell。
他们不一定所有的行为相同的方式。
它最初是一个命令只在路径中。
它后来被内置在外壳。
因为有依赖于环境的选择
和命令行选项，内置的命令
写的功能相同，已经在路径中的命令，
这是不可能的，他们将被写入的方式
如果该命令不是已经被写入的路径。
因此，这有副作用。它的历史在这里有效果。
有选择在那里。
还有一个变量名为echo_style的tcsh中定义的选项。
这就是这些变量，可以改变回声的工作方式之一。
还有其他一些情况下，您可以指定一个变量
改变的方式，外壳操作，包括一个内置的命令，有效。
它不会影响任何东西
因为其他的命令都不能访问的shell变量，
只有环境变量。
但shell操作可以读取shell变量。
这不会csh的工作。这是唯一的tcsh。这就是增强功能之一。
解析具有序列时，其评估的元字符，
当它评估的变量，别名，历史文献。
有这些东西一个特定的序列。
如果这样做的事情中的特定序列
并得到的东西，这是一个排序的表达式
它已经被评估，就不会再对其进行评估。
如果它得到它，那么它只会传递的字符。
所以，如果像命令替换一些表达式的求
或变量或任何会引起表达式
您希望进行评估，
将工作只有在评估后的序列中出现。
我希望我是清楚的在那里。
也就是说解析序列，在C壳的操作，
是不一样的内置命令，因为它是对非内置命令。
我不知道关于Bash那里。
例如，如果一个shell变量产生的历史参考，
它可能不会回到过去的历史。
这将刚才得到的感叹号。
其实，我们只要尝试了，现在。
设置=，我们将不得不把这个在那里。
哦，等等。抱歉。我在Bash这样做。我想在这里做。
见，所以也没评价，历史参考
因为它已经过去的历史评价表达的点
当计算的变量。
所以这是解析1日起生效。
再次，内置命令没有执行同样的方式。
好的。让我们去到下一个位置。
这旨在是1行，但它更容易阅读。
那是什么呢？
你可能还记得，我们可以评估为星号通配符的文件名，
还有其他的文件名通配符，如问号和括号表达式。
这样的评价被称为通配。
设置noglob在这个命令的开头说，不这样做。
未设置noglob说回去做。
需要注意的是一套水珠不会有这种效果。
在日常语言中，设置水珠或取消noglob似乎是相等的，
但在这里它不是。这是未设置noglob。
现在TSET。 TSET站为终端集。
它不使用，往往现在，但窗口系统面世之前，
和你有一个单一的终端，您可能需要确定类型。
如果什么东西过来以太网或从网络，
你可能要说这是一个VT100。
VT100是一种在终端业务的一个标准。它来自DEC终端。
如果你只是做拨号 - 注意到了吗？这又回到一个办法，是吧？
所以，如果我们只是做TSET在这里，
如果我只是做TSET，它重置我的终端，但你什么也没看见。
它并没有真正改变什么。
-S
好吧。
的setenv TERM xterm的颜色。
我们已经知道，这个词所设定的方式，所以这并没有改变。
这就是我们会想这样做的方式。
但是请注意，这个命令，TSET-S，只输出这些命令。它没有运行它们。
它没有运行这些命令，它输出它们。
所以这是为了以产生将被执行的命令。
你还记得该文件中的命令，我刚才给你什么也问答。
因此，让我们做到这一点。
在Q抑制一些输出，但是这不要紧这里，你可以看到。
我只是这样做，告诉你，这并不重要。
这是在反引用语法。
注意反引号在这里，反引号在这里。
我省略这些东西在这里。
这是告诉它要做什么案件
特别类型的终端的情况下 -
以太网，网络，拨号，你有什么。
不要紧，在这里，因为我们实际上没有做任何这些东西。
我只是说明了命令。
如果我做这个反引号，我该怎么走？
还要注意这里，这包括了一套noglob和取消设置noglob，
所以那些现在多余的定义。
这并不总是正确的，但现在他们包含在该命令。
但是让我们看看如果我这样做会发生什么
和我一起去参加一个控制该行的开头，我这样做。
好了，设置：命令未找到。种奇怪的，不是吗？
集是一个众所周知的命令。它的外壳的一部分。
设置：命令没有发现呢？这是为什么？
嗯。好吧，让我们来想一想。
它运行一个反引号命令替换，
和发生在解析命令的序列的某一部分。
集是一个内置的命令。
因此，通过它的命令替换的时候，
它已经得到了过去识别的内置命令的地步。
所以它把设置，就像它是在路径的命令。
不用说，它没有找到它，你会得到一个错误。
好吧。有解析顺序的一个例子。
和我们做对什么？
这里请注意，这非常有趣的命令，EVAL。
我不知道是什么一样。
如果你看看手册 - ，让我们就这样做
显示这些手册是如何混乱是 -
男人的tcsh，迷茫说明书，发现这里的东西是不容易。
在这里，我们走了，EVAL精氨酸，所以我们可以有1个或多个参数
而且也没有的事情的清单。
把参数作为输入到shell
而在当前shell的上下文中执行产生的命令。
这通常是用来作为执行命令的结果生成的命令
或变量替换，因为这些替代之前的解析发生。
很不错的。
在这里，他们甚至提到了tset命令的使用示例
就像我刚才给你看。
现在我已经拿到窗口返回到一个有用的地方。
让我们在这里，我们将看到的eval只是在这之前使用。
因此，让我们看看如果我们把会发生什么 - 在这里，我们去了箭头的命令
并控制一个开头，EVAL。
好了，所以它的工作原理。
当你这样做的eval，它需要什么来后，它并使它的命令。
这使您能够基本上解析它的两倍。
这里的部分​​运行此命令的反引号里面，
得到的输出。
输出应该是因为这些命令在这里运行这样的
在这一个，这一个。
因此这些命令现在这里在这个序列，
但这些内置的命令，它不能让他们的时候了。
所以，我们去评估，EVAL挑选一个了，全部重新开始整个事情，和它的作品。
一个例子既backquoting的，EVAL，解析，解析的后果，
并命令这可能是非常小的使用，以你现在的。
好吧。好吧，umask的。
让我们来看看这个命令在这里，使用umask 022。我不知道是什么一样。
让我们只输入umask一无所有之后。 22。好吧。
022，做一遍。
正如你可能已经猜到了，umask的不带参数将告诉您当前的面具;
umask命令与参数使得它，但是这是一个我已经有了。
什么是022意思？
这是这里的规定保障的文件。
他们确定谁可以读取或写入或执行文件。
保护也称为权限。
r代表读，在W写入，
和x，它不存在在那里，代表执行。
有3个类别，有。
在过去3个元素是用户的类别。那些适用于我，则用户。
这3个在这里适用于组。
该文件属于1组，用户可以属于多个组，
但是，如果用户是其中此文件所属于的组中，
那么这些保护措施将适用于他，如果他不是用户。
而这一次是所有的人。
这些类别是互斥的。
用户的保护适用于他，
该组保护应用到组的成员以外的用户，
和其他保护只适用于人比用户与该组成员的其他。
如果有一个r或AW或一个x，这意味着保护是理所当然的。
如果有一个连字符，这意味着它不是。
有实际上是可以放置在这里，除了这些其它的东西，
我不会进入现在。
umask的定义了一个默认为您创建的文件。
而作为一个面具，基本上它说，你不设置的位。
这是如何成为位？
如果您认为所有这些作为一个八进制数，
这是1秒位，这是2秒，这是4秒。
所以0到7
将描述什么样的组合存在的R，W的，而x的你有这些3
然后同样数量的这些，然后对这些。
因此，022表示为0外，2组，2为用户。
但是，这是一个面具。面具是你没有的东西。
对不起。我只是给你的东西在错误的顺序。
这是第3。这3个是用户，这3个都是群，这3个是其他。
对不起，我错了顺序给你这些。
的0，这是第一个的那些，不显示该值，
但如果一个数字是不存在的，它是一个0。
这意味着所有3这些将被允许。
注意，在这个特定的一个的X是不允许的。
其原因是，外​​壳是能够确定的
文件是否应执行与否。
因为这不是一个可执行文件，它没有设置x。
2方法，在这里写权限，第二类，
一个在中间，被拒绝。
所以，再一次，这些都是东西，它否认。
那么，x被允许的，但它不是在这里，因为它不是可执行
并且类似的其他人。
所以这是一个常见的​​umask。
另一个常见的​​一种是700 - 给自己的一切，没有人任何东西。
而且还有其他的可能性。
我会回去的。使用历史，我可以搜索回来的，长宽高到那里。
好吧。所以在这里，这些都是炮弹。
猛砸，车主是谁的系统帐户，可以做任何事情。
集团和其他人可以做读或执行，但不能写入。
这其中甚至没有让主人来写它。
如果业主想写它，系统帐户，
他必须首先改变的保护。
但同样，umask的通过屏蔽它设置默认值，
通过指示将不会被设置的位。
这通常是在你的初始化文件之一，它是的。cshrc为C壳
或者，天寒Bourne类型的炮弹。
它可以是别处也如果有系统上的其他初始化文件。
无论如何，这是的umask。
还有一些那种奇怪在这里，
那就是，为什么有一个单一的命令呢？
如果我写这个，我想使它成为一个变量来说，umask =一定的价值。
为什么有一个整体的命令只是为了这个目的？
原因是这只是又回到了Unix的起源。
Unix的只是一些编程项目在贝尔实验室在70年代初期。
人们只是聚在一起的程序。
他们从来没有打算让它成为一个世界性的操作系统。
不同的人写不同部分不假思索非常
如何自己将要被使用 - 比较简略。
它走到了一起这样，它仍然像在某些方面。
因此，反映了历史，并且仍然有这些矛盾和它的奇怪的元素。
好吧。这里下一个。
正如我前面写的C壳是不是真的用得非常多的编程，
虽然它可以是。
它执行更慢，再交互使用之间的权衡，
其中有涉及比速度更多的处理，
它可以不用处理。
由Korn和伯恩 - 弹再次加入到Bourne shell中的额外功能
似乎并没有慢下来，我不知道这是为什么。
它可能只是更好的编程，但我不是在一个位置就知道了。
这里的速度其实并不是什么大不了的，虽然它被提及。
其原因是shell脚本实际上得到较快。
如果有很多像命令的程序量的计算，
你可能不会在shell脚本做到这一点。
该操作还有相当简单明了。
我已经经历过的那些是太慢
涉及缓慢命令的重复应用。
刚才我提到的sed流编辑器。该命令是缓慢的。
如果你执行的sed很多次了，你会得到一个缓慢的脚本，但它不是shell，它是缓慢的。
在Bourne shell中运行它不会比在C-shell中运行它要快得多，
虽然有可能一些优势在那里。
额外的编程能力，另一方面，
有显著的原因，你会使用Bourne类型的炮弹。
C-shell有奇怪的特性，它 -
事实上，你不知道，如果一个变量是一个shell变量或环境变量。
它可以是非常混乱。
这不是那么容易写
只是根据你在其他语言的编程经验。
我想你可能会发现Bourne类型的炮弹与您体验更加一致。
一些脚本，不过，可以在成千上万行的长度的。
那些我见过的用于修补操作系统。
那些可以执行很慢，但是你不运行这些非常频繁。
只有当你在做修补，
而且只有系统管理员谁做的那些事，
所以它不是一个真正大问题。
那些数百行的长期实际执行相当迅速。
这里提到这一点，那些是什么改进？
我已经提到其中的几个 - 阵列，计算，
在$（）表达式的计算在Bash shell中，
另一种命令替换的。
有不同类型的测试命令
通过它可以对文件或其他东西的存在做条件测试。
最后在这里，在这里此命令。
这是什么做的，为什么会有人用吗？
printenv的变量名。
我们知道printenv的一样。它告诉我们一个变量的值。
和printenv的变量名不会告诉我们很多，因为没有这样的变量。
空白。
但是，让我们给它一些有意义的事情。
那是不是有两种。好吧。我想我从来没有定义的。
让我们只检查我的环境。
这是另一个命令，通过它可以检查你的环境。
有很好的老编辑，我们之前看到的那个。
那是什么呢？
在这里，我们有一个反引号表达。
请记住这是C壳。
所以printenv的编辑器会给我们EDITOR的值。这是六。
然后它会将该值设置为变量a，set命令。
所以，现在如果我做回声美元，我得到六。
这似乎并不十分有用。
然而，它实际上有一个目的。
由于我们不知道一个变量是否是一个shell变量或环境变量
通过使用美元符号评价语法，我们可以使用printenv的
以确保它是一个环境变量。
所以，如果有一个shell变量编辑器，这会不会得到它。
这仅适用于环境变量。
如果有一个shell变量，我想它的价值，
我必须找到一些其他的方法来做到这一点。
要做到这一点的一种方法是通过做套和管道。
这是元字符，特殊字符中的一个。
它发送组的输出到别的东西。
让我们来看看我们可能会发现在那里。
什么都没有。好吧。就让我们看看有什么在那里都在一起。
这是echo_style，就是我前面提到的。好吧，让我们做到这一点。
还记得我前面提到的，echo_style
决定的方式，echo命令将运行。
BSD代表伯克利标准分布。
这是伯克利的Unix从20世纪70年代。
这是呼应可以运行的方式之一。
在TC壳设置echo_style该值将导致回波的行为是那样。
这样设置确实如此，但设置只得到shell变量。
它不会找到的编辑器，这是不是一个shell变量。
什么都没有。
所以这是区分它们的一种方法。
但是，你有一个事实要经过一些奇怪的命令一样，
shell变量或环境变量来区分
显示了一种在C-外壳为了某种目的的不切实际的性质。
而现在，最后，也许至少，这是手册页。
那些你可能知道是谁的，男人是命令缩写手册。
该手册页的炮弹是难以阅读。他们是很长的。
他们是有组织的方式，可能使其很难找到你要找的内容。
所以，如果你正在寻找一些有目的的，
你可能不知道，如果这个目的是一个shell变量或别的东西，
所以你可能不知道到哪里寻找它。
你可以找不同的字符串，但字符串经常重复。
所以它一般难以阅读。
我们只是看着有点过了TC壳手册页找到eval命令。
有些事情走得更快。
一种方法是将搜索字符串。
您可以使用寻呼机。
寻呼机有斜线寻找一个命令或一个字符串寻呼机操作里面。
男人在默认情况下会使用传呼机，或者是更多或更少。
我不知道你是否熟悉这些，但这些可以通过位显示文件位。
我一直在使用较少，显示现在我们得到的这些特定的文件。
你可以在里面搜索那里。
您可以尝试使用不同的搜索字符串。
还man页在不同的操作系统可能不一样。
它们可以是对于csh和tcsh单独的页面。
他们是不是在Mac上，但他们可能是，如果那些是独立的命令。
如果SH并没有真正叫击，有可能是一个单独的手册页。
有些系统有单独的手册页只用于C-shell内置命令。
有时，如果你想读一个内置的命令的说明
这也是在路径中，如回声，你需要阅读的手册页上的回声命令的
以确定它将如何工作作为一个内置的命令
即使你不调用内置的命令。
这是操作系统的一个缺点在一般情况下，不仅为壳，
虽然供弹特别的手册页很长，
部分原因是他们已经增加实用的功能对他们来说，这可能是一个利好。
好吧。有没有问题？你想提出什么议题？
与此有关什么？
好吧，它已经很高兴与你交谈的所有。
我希望你有东西出来这个研讨会
这将在你未来的事业对您有用。
[CS50.TV]