[Powered by Google Translate] [研討會 - Unix的砲彈，環境]
[道格拉斯·克萊恩 - 哈佛大學]
[這是CS50。 - CS50.TV]
>> 今天的話題是Unix的外殼。
我是道格拉斯·克萊恩，專家，或者至少是合理的主管用戶的外殼。
shell是用戶電腦的操作系統界面。
這個名字是誤導，因為，不同於動物的外殼，
硬盤和保護，計算機外殼允許進行通信。
所以多孔膜可能會是一個更好的比喻。
>> 對於Unix原來的shell是Bourne shell的。
伯恩拼寫B-O-U-R-N-ê。
伯恩的Unix的原作者之一，
因此外殼後，他的名字命名。
該shell命令的名稱只是簡單的sh。
這是命令，你可以執行。
外殼登錄開始。
當您登錄到計算機時，外殼為你剛開始運行，
這就是你的命令。
它也可以在其他時間開始。
如果彈出一個窗口，沒有其他指示，它會為你啟動一個shell。
這是怎麼回事，你可以去到一個窗口，並開始鍵入命令
等等，即使你沒有登錄到該窗口。
此外，如果你做一個遠程登錄，
然後，它會在遠程計算機上啟動一個shell。
它可能沒有一個交互式shell來運行命令。
這可能意味著在你的當前操作，
它也可以指遠程操作。
你可以發送一個命令到另一台計算機，
其中包括啟動一個shell。
事實上，它包括啟動一個shell
即使那是不是你的最終目的。
當事情開始像這樣，它不會啟動新的外殼。
如果你帶上了一個新的窗口，它可以告訴它帶來了一個編輯器
或其他一些命令。
在這種情況下，編輯器將從頭開始。
當在編輯結束時，該窗口結束。
這有點不尋常，但它可以做到。
在這種情況下，它不會是一個shell。
因此，它不一定是一個窗口，或一些這樣的應用程序的情況下會帶來一個shell。
>> 殼牌解析命令。
解析裝置吞吐量的各種因素和性質。
在命令中，您輸入的完整字符串，
將有1個或多個單要執行的命令。
其他元素可以是參數。
還可以有另外一個命令的執行的影響的特殊字符。
他們可以將輸出發送其他地方比屏幕
如果該命令通常將其發送到屏幕上。
它可以重定向輸入，它也可以做其他事情。
有各種其他的符號，字符，等等。
解析涉及檢測和解釋這些東西。
>> 現在，如果沒有更多的問題，這是相當有可能的，因為沒有更多的人，
我們將繼續在這裡我的下一個頁面。
>> 我剛才說的是Bourne shell是初始殼。
還有其他的。
一個是C殼。該命令是csh。
名C殼僅僅是一個文字遊戲。
在20世紀70年代中期引入這個shell的Berkeley Unix。
伯克利的Unix在Unix的發展是一個開創性的事件。
這是一個巨大的革命，包括引入這個殼。
那文字遊戲的原因，C殼，
是，在C-shell有一些特點，它類似於C語言，
Bourne shell的沒有 -
或它沒有在那個時候。
還有TC-殼。
這是一個超集的C殼。
具有額外的功能，其中有許多是有用的交互使用，
如召回命令歷史機制，
我將描述有點遲 -
在一個簡單的方式，仿照後編輯。
它也有綁定允許你綁定一個快捷鍵字符串到一個較長的命令。
我們不會陷入今天。
它有一些功能是有用的編程。
然而，C殼不經常使用shell編程。
殼牌計劃，如果你還不知道，
外殼採用特質的節目組成。
你可以運行這些程序。
你寫一堆的shell命令到一個文件中，並執行該文件。
你不需要進行編譯。這是一種解釋性語言。
短語C-外殼是曖昧的，因為它可能只是指原來的C殼，長山壕，
或將所有的C-砲彈，包括tcsh在內。這是一個有點曖昧。
>> 後殼是Korn shell，請ksh的，程序員而得名，光輝。
這個shell試圖納入1殼
的優點為C shell交互使用
和Bourne shell編程。
它已被用來作為一個交互式shell被一些人 - 少數。
但後​​來，有一個介紹，在Bash shell中，BASH，
又是一個文字遊戲，伯恩再次殼。
這是一個Bourne shell的擴展。 Korn shell的也是。他們兩人都是。
它具有相同的目標Korn shell的合併的C殼
和Bourne shell的優勢1外殼。
許多Korn shell的增強還包括在Bash。
bash中，但是，有更多的，因此是優選的。
伯恩再次殼和Korn外殼被稱為Bourne類型的砲彈
因為它們包括Bourne shell的特性，
是不相容的，在某些方面與C殼。
除了這些還有其他的砲彈，一些旨在限制使用，
可能僅限於某些命令，也許專門的用途，不經常使用。
>> 好吧。這裡的下一個項目。
Bash shell中已經成為Linux的各種形式的關聯。
我不知道如果這是真的，各種形式。
有很多形式在那裡，我沒有用他們所有，
但是，我已經使用它已經成為與它相關聯。
所以，據我所知，沒有什麼關於Bash
這使得任何與Linux兼容
比殼和操作系統的任何其他組合。
我覺得這可能只是反映了傾向的程序員。
它已成為與Linux相關的另一個原因是與ksh喜歡猛砸
因為事情很可能在它被寫入，並很可能蔓延。
我給你後來的其他原因。
的Bourne shell腳本應該運行在的Korn外殼或猛砸。
如果你寫的是Bourne shell的東西，
你也許可以執行ksh下或bash。
Korn shell的腳本可能會運行bash下，但我不能保證。
後來就到這裡，C-shell腳本應該運行下TC殼。
C-殼其實從未被廣泛用於腳本
因為Bourne shell的和後來的Bourne類型的砲彈，目的是最好的。
所以這真的不是那麼重要。
有相當多的Bourne shell腳本，其中書面不久前，
Korn 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。
因此，這些符號可參閱論據，
和那些適用於所有的砲彈。
此外，還有其他的字符。
$ *是指整個參數列表，所有的人。
$＃是指參數的個數。
同樣，這適用於所有的砲彈。
可以使用這些符號，*和＃，在其他地方也與意義。
我們不會進入的。
>> 殼牌符線。那是什麼？
比方說，你已經寫了一個腳本，它是一個特定的殼，你要運行它。
你怎麼知道你的操作系統將使用什麼殼運行腳本？
在一個點上，你可以認為，這將在Bourne shell中運行
如果你不說，否則，
但人們不寫腳本在Bourne shell中，多了
，你甚至不能依靠了。
所以，在這裡，我們有一個shell符線就在這裡。
指定猛砸。
請注意它指定的路徑名，/斌/慶典。
如果一台計算機有Bash shell的，但不是在bin目錄中，/ bin，這將無法正常工作。
這是另一個預選賽中，這裡另一個謹慎。
英鎊符號是註釋行字符。
這適用於所有的shell。
這裡的特殊情況下，＃！在腳本的開始，是一種特殊情況。
指定的shell中運行腳本。
正如我說的，它可能是不一樣的地方/ bin中。
此外，還有這裡是另一回事。
如果你只是沒有感嘆號和路徑名，使用井號
應該指出的C殼。
不過，我不建議這樣做，因為我不能保證
那將總是工作。
如果你想要一個C殼，它會更好，這樣說。
然後有東西，而在這裡混淆。
如果您使用的shell例如/ bin / bash的符線
和殼是不是有
與/ bin / bash的特定的計算機上有沒有這樣的事情，
可能是因為它不具有bash或因為它在不同的位置，
你會得到一個錯誤，告訴你，你跑的腳本不存在。
當然，你的腳本存在，這樣的錯誤消息是混亂的。
操作系統的原因，給出了這樣的錯誤
，或者更準確地說，交互式shell中運行此給出了這個錯誤，
它報告你用過的命令，這是腳本的名稱。
該命令有效地叫做shell腳本的名稱。
這就是你在哪裡得到的，令人困惑的錯誤消息。
另一種方法來調用shell腳本
是通過在命令行上指定的殼一樣，這裡。
這是一個命令。這說運行B​​ash和Bash中，然後運行我的腳本。
符線路將優先，
這功能允許您提供不同的路徑名。
如果你只給一個命令，操作系統將會尋找該命令
在不同的地方。
如果它是可用的，它應該找到它。
電腦會發現猛砸無論它在哪裡，並運行它，
所以你不需要再關心它發現它的地方。
其他潛在的問題在這裡，
如果有超過1 Bash的版本，這是可能的，雖然不太可能。
所以這是另一種方式來處理這些事情。
符線可以調用任何外殼。
他們也可以調用其他的東西比砲彈。
我這裡的例子是SED，這是流編輯器;
笨拙，這是一個模式處理語言;
和perl，一個非常高度發達的腳本語言。
如果你把一個符線表明在開始的程序之一，
將直接進入程序，而不是啟動一個shell。
這些程序有自己的能力的限制。
Perl是非常有能力的。 sed是一個編輯器。它可以做的事情，超越了簡單的編輯。
但它可以是難以編程。
此外，通過腳本的參數和東西是不可能的或混亂。
因此，在這些情況下，用awk或sed，它的，至少在我的經驗，
最好寫一個shell腳本調用的awk或sed shell腳本
而不是調用awk或sed的腳本說明符線。
Perl是一個高度多元化的語言，我說的。
你不能在perl運行交互式命令，
這意味著你不能你正在開發測試腳本
通過交互式運行。
然而，這是一個非常有能力的語言
並已經發展成為一個非常廣泛使用的工具。
這只是括號言論符線一點點。
>> 在全部或大部分形式的Linux - 再次，我不能肯定這一切 -
在Mac OS中，如果你鍵入csh的你得到tcsh的，
如果你鍵入SH您得到的是bash。
他們試圖給你這些砲彈更先進的版本，
但是這可能會造成混淆。
如果你寫一個腳本使用的tcsh或Bash特性，而調用csh或sh
然後嘗試上運行它的計算機不具備的tcsh或bash，
在那裡，如果有命令，你可能會得到一些錯誤
不承認這些砲彈。
此外，你可能已經被稱為你的shell在本地計算機上
sh或csh調用它，然後讓更先進的砲彈。
你甚至可能不會想到的事實，你使用更先進的外殼。
所以這是一個潛在的缺陷。
它是如何建立的，如果你鍵入SH猛砸，
如果你鍵入csh的你得到TSCH的？
在這些計算機中有一些事情稱為鏈接
它可以連接到文件名是指同樣的事情。
它可以是同一個文件或一個文件，其目的是指到另一個文件名稱。
他們被稱為硬鏈接和符號鏈接。我們不會去到了今天。
也有可能是單獨的文件 - 1文件SH，1文件猛砸 -
但他們都運行猛砸。
再有就是這裡的另一個預選賽。
如果你調用這些砲彈的一個名字之一，
你可能會認為你會得到相同的功能調用它一個名字。
嗯，這其實未必是真實的。
這些命令可以檢查所使用的名稱，他們被稱為
具有該名稱的基礎上，它們可以有不同的行為。
有可能是試圖符合標準的問題。
你們當中有些人可能已經聽說POSIX標準或其他
也許其他功能。
這可以選擇，有時通過命令行參數
或通過設置shell變量。
sh或bash中調用它實際上可能會導致不同的執行
即使是相同的文件，你執行。
另一個要考慮的是，即使另一台計算機上有tcsh或猛砸，
如果他們沒有聯繫，因為它們是在本地計算機上
如果你有一個Linux或Mac OS本地計算機，
話又說回來，你會得到的外殼，你調用sh或csh的，而不是一個，你可能更喜歡。
目前Bourne shell的增強較少比那些在Bash
但過去那些在原有的Bourne shell。
其結果，即使是目前的Bourne shell，sh的
即使它不是bash，類似於C語言，超過了C-殼牌確。
這是不是真的是第一次創建時的C殼，但它已經開發出這種方式。
在這裡您可能會注意到，所有這些殼除了Bourne shell的名稱
擁有的東西，以表明他們是哪個殼 - CSH時，bash -
但Bourne shell的僅僅是SH。
為什麼呢？這是原來的外殼。
這是殼，然後，不是一個shell，
因為它是外殼，沒有任何理由以區別於另一個shell。
所以這就是為什麼它有這個名字，仍然如此。
>> 這家頂級這裡是一條線，我有一個帳戶的口令數據庫
在另一台計算機上。
我要嘗試獲得這個名字，所以你可以看到在最後的那部分，外殼。
密碼數據庫保存所有用戶的登錄特性。
在開始的用戶名，你可以看到現在我的最後2個字母。
這裡的字段之間用冒號隔開。
最後一個字段，你可以看到的，是bin / tcsh的外殼。
這是殼規範。
還有一些有趣的東西在這裡。
當Unix是首次開發，有只有1個外殼，
所以有沒有別的選擇。
那麼，為什麼他們允許的密碼數據庫中的字段指定一個shell？
我不知道，但幸運的是，他們做了。
這是相當困難的，進行修改密碼數據庫格式
因為許多程序是指其格式
和將被重寫。
這是一個恰當的或偶然的發展，包括那場。
據我所知，所有的Unix和Linux計算機上使用的密碼文件中的行那種。
Mac有其自己的系統。
它實際上有一個密碼文件與該格式中的行，
但是這不是用戶的特徵被定義。
另一個括號備註。
>> 如果你調用一個shell，你可以調用它作為一個子shell現有的砲彈。
所以，如果我去這裡，讓我們擺脫這些東西。
在這裡，我在C殼。
這一變量，它準確地識別我的殼，
實際上並不總是可靠的方法來確定你正在運行什麼殼，
但在這種情況下，它是。
如果我只需要輸入 -
現在，我在Bash。
有些東西是一樣的。 LS告訴我，我的命令。
如果我做了一個暫停，以我的C殼，LS相同。對嗎？
FG，前景，回到我的Bash shell。
PWD當前目錄，返回到C殼。
PWD，不同的目錄 - 在這種情況下，其實並不是一個不同的目錄。
這是同一個目錄。
比方說，我想在這裡調用一個命令：LS。
那是幹什麼的？
它告訴我在哪裡ls命令，
一個，讓我一個目錄列表，坐落在LS。
讓我們回到bash shell的。讓我們嘗試同樣的事情。
嗯，有趣那裡，其中：命令未找到。
這是為什麼？
where命令是內置到C殼。
這不是一個命令，該命令具有從別的地方被讀取到內存中執行。
C-殼運行將執行其自己的代碼的一部分
它不是在bash shell。
因此，猛砸，不是有這樣的內置命令，看起來，它沒有找到它，
我們得到一個錯誤。
因此，我們有一個Bash shell中運行下一個C殼，我們稱之為一個子shell。
以防萬一你很好奇，Bash shell的定位命令都有自己的方式。
哈希運算是指這樣的事實，它可以更迅速地執行，
更迅速地被發現。
這是一個內置的增強一些這些砲彈。
>> Bourne類型的砲彈進行編程的首選。
他們有控制結構，如循環，條件語句，
之類的命令，你可能使用的編程語言，如C
或任何一種語言。也許你在Java或任何編程。
殼。
Bourne類型的砲彈，尤其是Bash有更多的
它們被設計具有更大的靈活性。
Bash shell中有數組。原Bourne shell就不會。
因此，可以進行編程相當合算。
C-殼確實有陣列，但這些功能不會有很多。
Bourne類型的砲彈會執行得更快
如果它們不具有用於交互使用的功能。
您加載下來的東西只有一個目的，這個負載下來用於其他目的。
權衡存在。
這些功能用於交互使用
真的是很少或沒有使用腳本。
它就像一個，我開始有可能使用一個交互式的子shell
測試出來，你打算在腳本中使用的命令。
這就是你不能做什麼用perl。你可以做到這一點的砲彈。
即使是結構喜歡for循環等等，可以交互運行。
以交互方式運行，它們偶爾有用，
但更可能的，你用它們來開發一個腳本。
>> 別名。
這將是有關C-殼。
你在哪裡得到較早的命令歷史機制
或其中某些部分，你已經運行。
再次，關於C-殼，是Bourne shell和Korn shell的這些東​​西，
但我不打算進入。
所以在這裡，我有一些有用的別名。
而不是輸入ls - 這是一個常見的命令 -
L型和保存自己的1個字符。
ls命令的各種選項，所有這些工作。
請注意，這些定義他們周圍有引號。
在這些情況下，引號是沒有必要的。
如果可以定義那些不帶引號的別名，它仍然會正常工作。
他們建議。
有情況下，您不能使用引號
因為發生的報價將防止你想要的東西。
有時你可以引述定義的一部分，但不是全部。
這也是一般建議使用單引號，而不是雙引號。
雙引號有變量定義的影響，
特別是使它們被停止，而不是評估。
為什麼我們要停止的評價？
引號怎麼做，我們呢？
>> 這裡是一個命令，你可能會發現有趣。
“LS克*'
G *，你可能知道，是一個通配符的表達式
開頭的文件名相克。
如果我只是寫在一個命令ls克*，我會得到我的當前目錄下的所有這些名字的列表。
如果我定義別名，因為它是帶引號，
您在何處運行它，它會運行該命令在當前目錄中。
但是，如果運行不帶引號的別名定義，
它會評估通配符克*當運行定義命令。
因此，定義的別名將是ls目錄中的文件列表
alias命令被執行時，
不管你確實要運行的命令。
這是沒有多大用處，單引號防止星號的評價。
所以你剛剛得到的定義是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得到在歷史列表中的前行。
另一個控制P，將讓你在這之前的一個。
的向上箭頭做同樣的事情。
控制無得到下一個命令，如果你已經回滾動的一些方法。
向下箭頭。
您可以將左到右的箭頭和其他各種東西。
這可以使使用歷史機制
容易得多，比使用驚嘆號語法，
但你不會使用別名定義中的。
我們就去了，其他一些時間。
>> 變量。
你知道哪些變量在程序設計語言。
砲彈也有他們。
C-shell使用命令給變量賦值，
所以，設置的變量a，b的值 -
正如我所說，一個無用的定義，但它是如何使用的一個例證。
set命令將創建一個變量，如果它已經不存在。
shell腳本的位置參數，可以考慮變量，
但它們的使用和它們的規則有所不同。
在腳本的過程中，你不能指定一個值1美元。
你必須定義一個新的變量，用於這一目的，如果一些人想要。
類型不帶參數的設置，你會得到一個當前定義的所有變量列表。
讓我們到這裡，看看我的其他外殼，我們得到了什麼，如果我們做到這一點。
有相當長的名單，對不對？
向上滾動一點點。看著這一切。
這些東西有些是自動定義的殼。
外殼創建變量，並賦予它一個值。
他們中的一些由shell定義，然後由用戶重新定義
根據他的喜好。
，其中一些是由用戶根據他在做什麼的那一天。
這僅僅是不帶參數的設定。
有一個奇怪的特點，這裡的這個東西。
已有要么之間沒有空格，等號和變量名
值或空格兩邊的等號，
在這其中。
這將無法正常工作，這實際上是一個有效的命令
但它不會做你的打算。
這條命令會工作，因為如果你只是說集和變量名
沒有等號或一組變量名，一個等號和沒有價值，
它將設置變量為空值。
因此，設置A =是一個有效的命令。
set命令可以超過1個變量定義在同一行上。
所以這個命令在這裡有定義a和b都為空值的效果。
也許不是你想要的。
這一個在這裡，前面提到的，會導致一個錯誤
因為= b是不是有效的表達式。
變量名不能用等號開始。
有這些進一步的東西在這裡。
冒號用來選擇從歷史線的參數，
，他們可以使用 - 我並沒有進入前 - 修改這些東西。
它們也可以用於修改shell變量。
在這裡，這其中一個，有一個值。
：r將採取延期。
的擴展將是任何一個點，
點和任何在文件末尾的，
只有在最後的名單後，最後的斜線。
所以，我在這裡。
一個是。它會下降的。o。
如果沒有擴展，只有最後的斜線後的路徑名，將沒有任何影響。
答：h時，該變量的表達式，將起飛目錄列表的最後一個元素，
再次，只有在最後的斜線。
SO / A / B / C成為/ A / B，
但是這一次更改後的名單，因為該元素是空的。
這裡我也想強調的東西。
這些限定符不搜索這些文件的存在。
他們只是看字符串。
這些旨在操縱文件名，路徑名，
但它們可以被用於任何字符串上，即使它不是一個文件名。
別看他們的存在，
所以，如果沒有這樣的文件，/ A / B / C，這將仍然工作。
無論是任何使用是另一個問題，但它仍然可以工作。
變量是不同的Bourne shell。稍後我們會得到。
美元符號可以逃脫，就像感嘆號和星號。
美元符號可以用反斜杠或單引號轉義。
雙引號有奇的效果在所有的砲彈
強制評估的美元符號變量表達式。
因此，如果它被逃脫單程，雙引號可以有效果
使其進行評估反正。
這是一個有點混亂。
如果有多個層次，如單引號雙引號內逃避
單引號或雙引號裡面，你應該測試一下，看看會​​發生什麼
如果你使用一個變量。
這些情況 - 單，雙單裡面的雙內側 -
不一定給你相同的結果。
環境變量，結合C-shell變量。
環境變量是在C殼的變量，
而且他們也是其他shell中的變量太多。
在C殼，它們是不同的集合。
我之前說的事情是shell變量。
環境變量是一組不同的變量
除了幾個變量，我們稱之為綁定變量，
這是非常重要的，稍後我們將進入那些。
環境變量自動傳遞
的砲彈或命令，從你的shell中運行。
其他的東西都沒有。殼變數，別名都沒有。環境變量。
這就是為什麼我們稱他們為環境變量，
的想法是，過去只是當前的shell環境延伸。
它們可以被用來定義命令的東西。
下面就是一個例子。打印機，LPDEST。
這些變量都可以定義一個命令將使用一台打印機，打印的東西。
如果你有多個打印機周圍，你可能想要把你喜歡的人。
我們有2個變量的原因是不同的命令集寫
使用這些不同的變量。
你可能會給予他們不同的價值觀。
你最有可能會給他們倆相同的值。
這些東西的工作，因為做打印的命令
被編程，以檢查這些變量的值。
如果一個程序沒有書面方式，如果它被寫做別的事，
變量會是不相干的。
因此，操作系統是不是找這些變量
每一次，你是指一台打印機。
正在尋找一個命令，並打印這些變量，如果是這樣編程。
這些變量通常在初始化文件中定義
但不一定。
你可以在命令行上定義它們。
它們可以被定義在一個命令中。
運行的命令的東西可能有其自己選擇的變量 -
是唯一的一個特定的軟件包，例如變量。
它們將被定義，當您運行該程序包。
這些變量傳遞到一個子shell是如何？
當一個子shell寫的，它不寫進入該地區。
子shell的面積是專門的環境變量
不寫子shell，它通過複製的書面。
當你運行一個普通的命令，這些命令，如打印或什麼的，
他們開始通過創建一個新的外殼。
殼創建一個shell，然後重寫它的一部分
你正在運行的命令，這是一個有點混亂，
但如何將這些命令得到的環境變量
然後，他們請參閱稍後。
這裡的命令用於定義變量SETENV的。
這是你如何定義它。這是3個元素：SETENV，變量值。
如果你只是做SETENV不帶任何參數，你會得到什麼？
所有這些變量的列表。
再次，這是一個很好的長列表，在這種情況下，在其他
這些變量被定義shell本身很大程度上是由我的登錄操作
而不是由我做的東西。
這裡還有另外一個命令，printenv。
這也打印環境。
請注意，這最後一件事，在這裡，編輯= VI。
說，如果我用的東西，調用編輯器
我不指定一個編輯器，它可以讓我選擇的話，它可以給我六。
如果我做printenv編輯器？它告訴我它是什麼。
在這之前，有一個變量，少。
這些是你的默認選項，當我運行less命令，
顯示文件。
所以，如果我這樣做，printenv可以採取1參數或參數，
不超過1。
也有一些其他的命令，但我們不打算進入今天。
記得有修飾符殼變數，如：H，
這將下降一個路徑名的最後一個元素，
：R，這將拖放擴展。
那些現在也適用於環境變量。他們沒用過。
它曾經是他們不能被修改。現在，他們都可以。
這是多年來的進步與發展的砲彈之一。
我是說，砲彈作為環境的一部分
在C殼和shell變量，也有一些例外，不同的集合。
你可以建立一個具有相同名稱的環境變量和shell變量。
他們將不同的變量，它們可以有不同的價值觀。
更改一個值不會改變其他的價值。
這些變量都與美元符號 - $ A，$任何評價。
所以如果你有這樣的嗎？你知不知道你會得到哪一個？
在我的測試中，我得到的shell變量，
但是這不是記錄上，你不能依賴。
所以我問你，是創建殼和環境變量
具有相同名稱的一個好主意？好吧。
主要的例外是那些什麼所處的環境和shell變量
彼此相連？
有這4個。
大寫字母TERM環境變量，
shell變量長期小寫字母，終端仿真類型。
我只是要去這裡，我要做的迴聲，一個有用的命令在這裡，
長期任期。和那裡。
xterm的終端類型，在X窗口系統顯示的窗口。
xterm的顏色是變化的，這允許不同的顏色。
為什麼我們定義這些？這是什麼？
喜歡的編輯器，重新排列屏幕的命令
發送特定序列，稱為轉義序列，
到終端或一個窗口，並且重新排列等等。
這些序列是不同的不同類型的終端。
這告訴它的使用。
有時也有問題存在。
你可能想改變這種狀況。
如果事情不工作，有時終端類型設置錯誤，
您可能能夠解決它重新定義長期變量。
在這種情況下，改變一個變量，環境變量或shell變量，
應該改變對方。
我通過經驗發現，改變長期以大寫字母
並不總是改變shell變量長期小寫字母。
這是一個錯誤。
我不知道這是否總是如此。大多數時候，它是不正確的，但它可以。
所以，如果你做出改變，只是檢查了這一點。
這不是經常，你需要更改該值，但是一旦在一段時間你。
環境變量用戶。
同樣，環境變量以大寫字母，小寫字母的sh​​ell變量。
這是您的用戶名。
它只有在非常特殊的情況下，
你想改變這種狀況。
如果您的用戶名是別人，它可以拋出各種事情。
主目錄，用戶的主目錄。
同樣，你不希望改變這種狀況。
請注意，在所有這些情況下，我們覆蓋的路徑變量，
環境變量是在大寫字母和綁定shell變量是小寫字母。
如果你換一個，你應該改變。
這種綁定不能成立，因為你不能綁定2個變量，
除這4個，這些變量中的綁定，不能撤消
你不能把它們分開。
因此，這4個變量對約束。
他們將永遠是。沒有別人會。
此外，這將有可能使用相同的名稱來創建變量
相反的類型。
你可以做一個小字母shell變量長期
環境變量TERM大寫字母。
這些成對的變量，這些變量將獨立
，它們是相互獨立的。
我無法想像，為什麼你會做，除非你想蠱惑人心。
在這裡，這一個路徑變量，這是一個非常重要的一個。
這裡的另一件事是可以有例
對方不一定要與類似的配對名稱的變量。
可以是變量，殼和外殼，大寫和小寫字母。
基於這個名字，你不知道，如果這個變量是一個shell變量
或一個環境變量，它們不是相互綁定。
因此，那種配對名稱並不意味著綁定變量。
路徑變量，這是我之前展示，
是一個列表的外殼看起來命令的路徑名。
讓我們到這個窗口，在這裡，我們會盡迴聲$ PATH中，大寫字母 -
環境變量 - 迴聲路徑，小字母 - shell變量。
請注意，所列出的目錄是一樣的。這是必然的。
換一個，你改變。
在環境變量中的元素是由冒號分隔。請注意這一點。
shell變量用空格分開。
此環境變量是一個字符串。
shell變量是一個數組。
Bourne外殼沒有陣列。
Bash的，但是這已經是一個固定的部分外殼。
這是一個單一的字符串，而不是一個數組。
C-殼總是有陣列。
陣列更容易的工作。
您可以參考它的部分。
所以迴聲路徑[1]，我得到/ usr / bin中的第一個元素。
同樣，請記住美元符號代表的歷史列表中的最後一個元素。
那裡發生了什麼？它試圖找到作為一個變量符號的美元符號。
我逃避它。哎呀。它不會採取。
一些這些事情沒有這麼好。
也許我們就離開了這一點。
星號是指整個事情，但你會得到什麼，如果你不指定元素。
另一種方法可以被操縱，數組變量，
的元素數，7的元素。
在這裡，我們把英鎊符號在變量名前。
這裡是另一個。有打上問號。
這是一個邏輯值。這表明存在變量。
這是另一種方式使用變量。
順便說一句，不必須是一個數組變量。
這可以是任何變量。
如果我這樣做，有沒有這樣的變量，我得到一個0。
另一個鮮為人知的事情有關變量的評價。
這裡回到這個，如果由於某種原因，你想工作
而非工作與陣列，shell變量，
有一些命令，可以單獨根據結腸這些東西。
事實上，如果你打算這樣做可能在bash shell，
某種腳本，這將是可能你會怎麼做。
但在C殼，它更容易使用數組。
在Bourne shell中，像這樣的表達式由一個單一的變量被分配，
喜歡的方式，你可能分配一個編程語言中的一個變量，
這裡不能有空格。
這是必要的，它只是1串。
在Bourne類型的砲彈，所有的變量是shell變量。
環境變量是shell變量的一個子集。
它們的區別在於非出口環境變量。
命令做到這一點是出口，如出口打印機。
如果我們定義一個變量，
如果我們想要一個打印命令，找到​​它，它必須是一個環境變量，
這就是我們如何做它一。
這裡有一種混亂的東西。
這種表達，出口環境，源於此Bourne shell的概念，
尚未表達式用於描述的C殼，
有沒有這樣的命令出口。
如果你剛剛說出口的本身，你會得到一個出口清單 -
所以，如果我只是做出口在這裡，沒有這樣的事情。
好吧，我們走吧。
順便說一下，這些東西，還定義了殼。
我沒有定義任何自己。
外殼本身做各種事情。
它應該做的事情自動。
在bash或Korn shell，你可以運行這樣的命令，
都會給一個變量值和出口在1命令。
在Bourne shell中，他們必須是獨立的命令，如出口。
這裡是另一個方面的混亂。
為C shell中的set命令定義變量
不帶參數告訴你變量的值是什麼。
在bash shell，不帶參數的設置命令做同樣的事情，
但參數做完全不同的東西。
因此，這些都是這裡的各種參數。
這些都是一些環境變量，其中一些shell變量。
所有這些都是真的shell變量。有些是環境變量。
參數設置命令可以用來操作
腳本的位置參數，
這是一種讓他們都在一次。
我們不能真正進入今天。
它也可以被用於改變外殼的行為。
特別是在Bash有殼的行為，這將決定的變量。
然後也只是你可能會看到一個命令，這個命令。
排版Korn和Bash的殼中使用的變量和變量類型。
它不是必須的，但它可以被用於限制變量的值，
這可能是有用的，以防止錯誤，這是相當常見的。
所以，我剛剛提的情況下，你看到它的地方。
其中命令。
還記得我前面提到的命令在C殼，
它可以告訴你一個命令路徑名的位置。
下面是命令替換。
你應該找到某處鍵盤上的字符，看起來像這樣。
在鍵盤上的位置會發生變化。
我們把它稱為反引號。它報價的大小。
從左上角到右下角。
在這裡，在我的Mac鍵盤上左上角。
該字符可用於在一個命令中執行一個命令。
如果你有一個表達反引號內，
該表達式是一個命令，它的運行。
該命令的輸出
然後取代整個反引號表達
裡面一個較長的命令，然後運行與輸出
作為其字符串參數的一部分，等等。
下面是一個使用該命令。
讓這裡的演示操作。
讓我們去這裡，拿出反引號。
控制A得到我Emacs編輯語法線的開始。
到目前為止，路徑名是哪裡，
但是當我做這個樣子，然後插入該目錄名
在這整個反引號表達對他們的運行ls-l的。
都挺方便的，對吧？
所以這是一個美妙的事情。這是反引號是如何工作的。
現在，讓我們去遠一點。
這些別名。實際上我用這些。
我會盡力得到這個1編輯操作。
好吧。
現在，讓我們來看看如何將這些定義出來。
別名長寬高告訴我它是如何定義的。
請注意它只是這一點，但已採取關閉外引號
驚嘆號。
*所有參數的完整列表。
別名定義中的，將適用的地方我用這個。
長寬高KSH的bash。好吧。
請參閱如何工作的？它為我節省一些打字。
讓我們去一點點別的東西在這裡只提。
這裡請注意這些不同的砲彈。我應該提到這之前。
如此長山壕在這裡，有一個2 / BIN / tcsh的。
我們可以通過其他手段，其實這些都是同一個文件建立。
記住我說的，如果你鍵入SH你的bash。
鍵入此，你會得到。
但是，那些不掛。那些有單一的存在。
這是不是什麼樣的文件，可以調用另一個。
因此，這些都是單獨的文件中的C殼的是同一個文件。
回到了這裡，其他人在這裡，這個別名，
注意，運行此命令，文件。
該別名運行。文件告訴你的文件的類型。
所以FWH KSH的bash。好吧。
這是該文件的命令的輸出。
我不知道，如果你知道這意味著什麼，在這裡，
Mach-O的通用二進制2架構。
有2種可能在Mac的處理器類型，
寫一些程序能夠同時運行，
文件命令可以判斷，這是什麼意思。
這兩個文件是書面的方式。
所以我們看到了別名的作品，我們看到的反引號工程，
我們看到了實際的文件的ls或文件工程。
這可能不起作用。嘗試“哪裡哪裡”和“長寬高”。好吧，讓我們來試一下。
哪裡哪裡。
那裡是一個shell內置。
還記得前面我們表明猛砸沒有哪裡。
如果你在Bash shell的類型，你會得到一個錯誤信息。
這只是一部分的外殼，而不是作為一個單獨的命令。
會發生什麼，如果我鍵入長寬高尋找哪裡？看看會發生什麼。
冉其中，得到了這個輸出，然後試圖運行ls
L是一個shell內置。
那裡是有的，但不存在其他的。
沒有這些存在，其實。
因此，並不總是工作，而且它還說明一些事情
不這樣做是什麼，你可能會想到。
我們下去這裡遠一點。
我們在這裡可以看到，這是在Bash。這也是像反引號的命令替換。
但不像反引號，它使用這個變量的風格。
有許多以美元符號的表達式開始，
而這些都不是變量，他們借來的美元符號的使用
表明某種形式的表達。
這可括號或方括號或雙括號包圍，
其中有一個不同的目的。
單括號在這裡是一個命令替換，就像反引號。
實際上是一個雙括號運算。
有其它的語法，以及其他操作。
反引號的語法可以在Bash。
然而，這是優選的。這是很容易閱讀，它允許嵌套。
你可以有另一個命令，在$（命令）
類似的東西 -
我得到一個列表。
這工作，如果我也有反引號。
如果我想要做這樣的事情 -
你可能不會實際使用此命令，
但這個內部命令替換一個呼應開頭的所有文件的名稱
那麼這一個運行這些文件，ls-l的
那麼這個人只是輸出相呼應。
你可能不會做到這一點，你剛剛做的迴聲或LS，
但是這說明了如何嵌套的命令作品。
所以這裡只是另一個特徵。
我提到這個，當你有在C殼，
Bourne類型的砲彈定位命令類型的工作。
內置的命令，正是我說有。
命令是外殼的一部分，就像哪裡。
當shell執行命令LS一樣，它找到它的路徑，
一些目錄中找到它的地方，
讀取到內存中，創建一個新的外殼，
讀取命令ls或任何入殼
那裡的環境變量已經位於
然後將執行轉移到它。
內置的命令，該命令的代碼是內殼，
因此外殼剛開始執行其自己的代碼的一部分。
是這樣的命令。實際上，它變得更快。
它不具有在內存中讀出任何東西，它已經在內存中。
內置的命令總是優先於具有相同名稱的命令。
路徑中的目錄的命令，它們可能具有相同的名稱，
命令在不同的目錄中，在不同的目錄中的文件。
路徑中發生較早，你會得到一個。
如果有一個內置的命令，你總是能得到它。
有沒有辦法給它一個較低的優先級比命令路徑中。
如果您想獲得該路徑命令，您可以輸入完整的路徑名。
如果有一個命令，在路徑的某處，
您可以鍵入/ bin中/在哪裡，你會得到它。
如果你不想輸入整個路徑名，你可以定義一個別名。
事實上，如果你給的別名名稱相同的內置命令，它會工作
因為評估別名定義
前殼決定了它是一個內置的命令，應執行。
然後得到一個稍微複雜一些命令。
一些命令的情況下，實際上是建立在命令和路徑。
其中之一是迴聲，我只用了一小會兒前在那些例子中的命令。
迴聲路徑中是一個命令，它是在每個shell中。
他們不一定所有的行為方式相同。
它最初是一個只在路徑命令。
它始建於砲彈後。
因為有選擇，這取決於對環境的
命令行選項，內置的命令
寫功能相同的路徑已經在作為命令，
這是不可能的，他們將被書面方式
如果該命令尚未被寫入的路徑。
因此，這有副作用。它的歷史影響。
有選擇在那裡。
還有一個變量tcsh的echo_style中定義的一個選項。
這是一個可以改變這些變量的方式，呼應作品。
還有其他的情況下，您可以指定一個變量
改變殼操作方式，包括一個內置的命令，工程。
它不會影響任何東西
因為沒有其他命令shell變量的訪問，
只有環境變量。
但shell操作可以讀取shell變量。
這不會csh的工作。這只是tcsh的。這是一個增強。
解析序列評估的元字符時，
當它評估變量，別名，歷史參考。
這些東西有一個特定的順序。
如果在一個特定的序列做的事情
得到的東西，這是一個表達的一種
已經被評估，因此無法再次評估。
如果得到它，那麼它將只通過字符。
所以，如果命令替換一些表情，如評估
或可變的或任何一個表達式產生
你想進行評估，
只有當評估後發生序列中，將工作。
我希望我有明確。
，解析序列，在C殼的操作，
內置的命令是不一樣的，因為它是對非內置命令。
我不知道有關於Bash。
例如，如果一個shell變量產生一個歷史參考，
它可能不會回去的歷史。
將剛剛得到的驚嘆號。
事實上，我們可以嘗試，現在。
設置=，我們將不得不把這個在那裡。
哦，等等。抱歉。我這樣做是在Bash。我想在這裡做。
見，所以沒有評估，歷史參考
因為它已經過去的角度評價歷史表達式
時，評價該變量。
所以這是1解析效果。
再次，內置的命令沒有做過同樣的方式。
好的。讓我們去這裡到下一個。
這樣做的目的是1行，但它更容易閱讀。
那是幹什麼的？
您可能還記得，我們​​可以評估作為文件名通配符星號，
還有其他的文件名通配符，如問號和括號表達式。
這樣的評價被稱為通配符。
設置noglob在此命令的開頭說，不這樣做。
未設置noglob說回去這樣做。
需要注意的是一套水珠不會有如此效果。
在日常語言中，設置水珠或未設置noglob的的似乎是等價的，
但在這裡，它是沒有的。的設置noglob。
現在TSET。 t將站在終端集。
這不是經常使用，但在此之前視窗系統成為可
你有一個單一的終端，您可能需要的類型來確定。
如果有什麼過來以太網或從網絡，
你可能要說這是一個VT100。
VT100是一種在終端業務的標準。來自DEC的終端。
如果你只是做撥號 - 注意到了嗎？這又回到一個方面，是吧？
因此，如果我們只是在這裡做TSET
如果我只是TSET，我的終端復位，但你什麼也沒看見。
它並沒有真正改變什麼。
-S
好吧。
SETENV TERM xterm的顏色。
我們已經知道，這個詞被設定方式，所以並沒有改變。
這是我們想做的事情。
但是請注意，此命令，TSET-S，只輸出這些命令。它沒有運行它們。
它沒有運行這些命令輸出。
因此，這是旨在產生，然後運行命令。
你還記得我只是表明你有一個Q值在該文件中的命令。
因此，讓我們做到這一點。
Q可取消一些輸出，但是這不要緊，在這裡，你可以看到。
我只是在做，告訴你，這並不重要。
這是在反引用的語法。
在這裡請注意反引號，反引號。
我在這裡省略這些東西。
這些案件是告訴它做什麼
在的情況下，特定類型的終端 -
以太網，網絡，撥號，你有什麼。
不要緊，因為我們實際上沒有做任何這些東西。
我只是說明該命令。
如果我這樣做是反引號，我該怎麼走？
也注意到了，這裡包括一套noglob和未設置noglob的，
所以這些都是多餘的定義。
這並不總是真實的，但現在他們在此命令中包含。
但是，讓我們看看會發生什麼，如果我這樣做，
去與控制A開頭的行，我該怎麼做。
好吧，集：命令未找到。這是一種奇怪的，是不是？
集是一個眾所周知的命令。它的外殼的一部分。
集：命令沒有發現呢？這是為什麼？
嗯。好吧，讓我們想想這個。
它的運行反引號的命令替換，
和解析命令序列的某一部分發生在。
集是一個內置的命令。
所以它的時間，命令替換，
它已經得到過去點識別的內置命令。
因此，它將設置，如果它是一個命令路徑中。
不用說，它沒有找到它，你會得到一個錯誤。
好吧。解析序列的一個例子。
什麼，我們怎麼辦呢？
在這裡請注意這個非常有趣的命令中，eval。
我不知道是什麼做的。
如果你看一下手冊 - 讓我們就這樣做
展示如何混淆這些手冊是 -
男人的tcsh，困惑手冊，發現這裡的東西是不容易的。
在這裡，我們去評估精氨酸，所以我們可以有1個或多個參數
那裡的東西，有一個列表。
黃柏作為輸入參數外殼
並執行所產生的命令在當前shell的上下文中。
這通常是用於執行命令的結果而生成的命令
或變量替換，因為解析發生之前，這些換人。
非常不錯。
在這裡，他們甚至提到了tset命令的使用範例
像我剛才向您展示。
現在我有一個有用的地方，以獲得窗口。
讓我們在這裡，我們將看到之前使用eval的。
因此，讓我們看看會發生什麼，如果我們把 - 在這裡，我們去的箭頭，命令
和控制的開頭中，eval。
好了，所以它的工作原理。
當你這樣做的eval，它需要什麼跟在它後面，並使得它的命令。
這使你完全解析它兩次。
這裡的部分反引號內運行此命令，
得到的輸出。
輸出應該是這裡像這些運行這些命令
在這個而這一次。
因此，這些命令是在這個序列中，現在在這裡
但這些都是內置命令，它不能立即得到他們的權利。
所以，我們去評估，評估選秀權，開始一遍整個事情，它的工作原理。
一個例子的backquoting中，eval，解析，解析的後果，
和命令，可能是很少使用時下。
好吧。所有權利，umask的。
讓我們來看看在這裡，在這個命令的umask 022。我不知道是什麼做的。
讓我們只是類型的umask沒有後。 22。好吧。
022做一遍。
正如你可能已經猜到了，不帶參數的umask告訴您當前的面具;
參數的umask使得它，但我已經是一個。
022什麼意思？
這些保護的文件。
他們確定誰被允許讀或寫或執行文件。
也被稱為保護權限。
r代表讀，寫的w，
與x，這是不存在的存在，代表執行。
有3個類別。
最後3個元素是在用戶類別。那些適用於我的用戶。
這3組。
該文件屬於1組，用戶可以屬於多個組，
但是，如果用戶是在此文件所屬的組，
那麼這些保護措施將適用於他，如果他不是用戶。
而這一次，是其他人。
這些類別是相互排斥的。
用戶保護適用於他，
組保護申請以外的用戶組的成員，
和其他的保護只適用於人以外的用戶和組成員。
如果有一個r或一個W或x的，這意味著給予保護。
如果有一個連字符，這意味著它不是。
其實除了這些其他的東西可以放在這裡，
到現在，我不會得到。
定義了默認的umask為您創建的文件。
作為掩模，基本上是說，你不設置的位。
如何成為位？
如果你覺得這些作為一個八進制數，每
這是1秒的位，這是2秒，這是4秒。
所以，從0到7
將描述什麼的r相結合，W，X的，你有這3
然後類似的這些，然後對這些數。
因此，022表示0，2組，為用戶。
但是，這是一個面具。面具是你沒有什麼。
對不起。我只是給你的東西的順序錯誤。
這是第3。這3個用戶，這3個，這3個組。
對不起，我給你的這些錯誤的順序。
0，這是最初的那些，不顯示該值，
但如果一個數字是不存在的，它是一個0。
這意味著所有這些都將被允許。
請注意，在這個特定的一個的x是不允許的。
其原因是，外​​殼是能夠確定
一個文件是否應該執行與否。
因為這不是一個可執行文件，它沒有設置x。
2表示寫權限，這裡的第二類，
一個在中間，被拒絕。
所以，再一次，這些都是否認的事情。
好吧，x是允許的，但它不是在這裡，因為它不是可執行
類似地，對於其他的。
所以這是一個常見的umask。
另一種常見的是700 - 給自己的一切，沒有人還有什麼別的。
還有其他的可能性。
我就回去了。使用的歷史，我可以搜索回來，長寬高有。
好吧。所以在這裡，這些砲彈。
擊，系統帳戶的所有者是誰，能做的一切。
集團和其他人都可以做讀或執行，但不能寫。
這其中甚至沒有讓主人給它寫信。
如果業主想寫信給它，系統帳戶，
他就必須首先改變的保護。
但同樣，umask的默認設置來掩蓋它，
表示將不會被置位。
這通常是在一個初始化文件，這是為C殼的。cshrc
或配置文件Bourne類型的砲彈。
如果有其他的初始化系統上的文件，它可以是在其他地方也。
無論如何，這是的umask。
有一種奇怪的東西在這裡，
那是，為什麼有一個單一的命令嗎？
如果我寫，我會成為一個變量，它的umask =一定的價值。
為什麼會出現一個完整的命令只是為了這個目的嗎？
究其原因是這只是追溯到Unix的起源。
UNIX是貝爾實驗室在20世紀70年代初的一些編程項目。
人們只是聚在一起程序。
他們從來沒有打算成為一個世界性的操作系統。
不同的人寫不同部位非常不假思索
他們是如何將要使用 - 比較簡略。
它走到了一起類似的，它仍想在某些方面。
所以，它反映了歷史，而仍然有這些不一致問題，它的奇數元素。
好吧。接下來，這裡的人。
正如我之前寫的，C-殼沒有真正用得非常多的編程，
雖然它可以。
它執行更慢，再次權衡之間的交互使用，
其中有更多的處理比速度，
可以不用處理。
添加額外的功能是Bourne shell，Korn和伯恩再次彈
似乎並沒有慢下來，我不知道這是為什麼。
它可能是更好的編程，但我不知道的位置。
速度在這裡其實是沒有什麼大不了的，雖然它被提及。
究其原因是shell腳本實際上得到相當快。
如果有許多命令，像在一個計算程序，
你可能不會做一個shell腳本。
操作是相當簡單明了。
我所經歷的那些太慢
涉及重複應用緩慢命令。
剛才我提到的流編輯器sed。該命令是緩慢的。
如果執行sed的許多倍，你會得到一個緩慢的腳本，但是它不是貝殼，是緩慢的。
在Bourne shell中運行它不會有太大的速度比運行在C殼，
雖然有可能有一定的優勢。
的額外的編程能力，另一方面，
原因是顯著的，你為什麼會使用Bourne類型的砲彈。
C-shell有奇數的功能，它 -
你不知道的事實，如果一個變量是一個shell變量或環境變量。
它可以是非常混亂。
這不是那麼容易寫
只是基於你的經驗在其他語言編程。
我想你可能會發現更符合你的經驗Bourne類型的砲彈。
一些腳本，不過，可以成千上萬行的長度。
我見過的那些用於修補操作系統。
這些可以執行的速度非常緩慢，但您不要運行那些非常頻繁。
只有當你做修補，
而且只有系統管理員誰做的這些事情，
所以它不是真的太大的問題。
那些有幾百行的長期實際執行相當迅速。
提到這一點，在這裡，什麼是那些改進？
我已經提到過他們幾個 - 陣列，計算，
$（）的表達在bash shell的計算，
其他類型的命令替換。
有各種不同的測試命令
通過它可以做條件測試，對存在的文件或其他東西。
上次離開這裡，這個命令在這裡。
這是什麼做的，為什麼會有人使用它呢？
printenv變量名。
我們知道printenv做什麼。它告訴我們一個變量的值。
而printenv變量名不會告訴我們非常，因為沒有這樣的變量。
空白。
但是，讓我們給它一些有意義的事情。
這是不存在。好吧。我想我從來沒有定義。
我們只是檢查我的環境。
這是另一個命令，通過它可以檢查您的環境。
有良好的老編輯，之前我們看到的。
那是幹什麼的？
在這裡，我們有一個反引號表達。
記住，這是C-殼。
所以printenv編輯會給我們的編輯器的值。它的VI。
然後將它設置該變量的值，set命令。
所以，現在如果我做迴聲$一個，我得到六。
這似乎並不十分有用。
然而，它確實有一個目的。
因為我們不知道一個變量是否是一個shell變量或環境變量
通過使用美元符號評估語法，我們可以使用printenv
以確保它是一個環境變量。
所以，如果有一個shell變量編輯器，這會不會得到它。
這僅適用於環境變量。
如果有一個shell變量，我想它的價值，
我必須找到一些其他的辦法做到這一點。
做到這一點的方法之一是做設置和管道。
這是一個元字符，特殊字符。
它的輸出集發送到別的東西。
讓我們來看看，我們可能會發現有。
什麼也沒有。好吧。讓我們只看到裡面是什麼都在一起。
這是我之前提到的echo_style。好吧，讓我們做到這一點。
記得我之前提到的，echo_style
決定的方式echo命令將運行。
代表BSD伯克利標準分佈。
這是從20世紀70年代的Berkeley Unix。
這是一個呼應的方式，可以運行。
設置echo_style該值TC殼將導致迴聲的行為是那樣。
所以設置，但設置只得到shell變量。
它不會找到編輯器，這是不是一個shell變量。
什麼也沒有。
所以這是區分它們的方法之一。
但事實上，你必須要經過這樣的一些奇怪的命令
區分shell變量或環境變量
顯示了一種不切實際的性質，用於某些目的的C殼。
而現在，最後，也許，這是手冊頁。
那些你可能知道是誰，這名男子是命令手冊。
砲彈的手冊頁都難以閱讀。他們是很長的。
他們是有組織的方式，這可能使其很難找到你正在尋找什麼。
所以，如果你正在尋找的東西，有目的的，
你可能不知道，如果目的是一個shell變量或別的東西，
所以，你可能不知道到哪裡尋找它。
你可以看一下不同的字符串，但的字符串經常重複。
所以它一般難以閱讀。
我們只是看著TC殼男子之前一點點找到eval命令。
有些事情走得更快。
一種方法是在搜索字符串。
您可以使用尋呼機。
尋呼機的斜線尋找一個命令或一個字符串在尋呼機操作。
默認情況下，男人會用傳呼機，要么是更多或更少。
我不知道你是否熟悉這些，但那些可以顯示文件的點點滴滴。
我一直在使用顯示這些特定的文件，我們在這裡已經得到了。
您可以搜索裡面。
您可以嘗試使用不同的搜尋字串。
同樣的人在不同的操作系統中的頁面可能是不一樣的。
它們可以單獨的頁面csh和tcsh。
他們是不是在Mac上，但他們可能是，如果這些都是單獨的命令。
如果，sh不會真的叫擊，有可能會是一個單獨的手冊頁。
有些系統有獨立的手冊頁為C殼內置命令。
有時候，如果你想讀的描述一個內置的命令
這也是在路徑，如迴聲，迴聲，你需要閱讀該命令的手冊頁
以確定如何它將作為一個內置的命令
即使你不調用內置的命令。
這是一個缺點，在一般的操作系統，不僅供彈，
雖然特別man頁面相當長的供彈，
部分是因為他們已經給他們增加了有用的功能，這可能是一個利好。
好吧。有什麼問題嗎？任何話題，你要提出來呢？
凡是與此有關嗎？
嗯，這是很不錯的，大家說話。
我希望你有本次研討會的東西
在你的未來努力，這將是對您有用。
[CS50.TV]