[研討會 - 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]