日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳解Linux shell注意事項(xiàng)

shell是系統(tǒng)的用戶(hù)界面,提供了用戶(hù)與內(nèi)核進(jìn)行交互操作的一種接口。它接收用戶(hù)輸入的命令并把它送入內(nèi)核去執(zhí)行。是在Linux內(nèi)核與用戶(hù)之間的解釋器程序,現(xiàn)在Linux通常指/bin/bash解釋器來(lái)負(fù)責(zé)向內(nèi)核翻譯以及傳達(dá)用戶(hù)/程序指令。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)科爾沁左翼,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):13518219792

一、標(biāo)準(zhǔn)輸入和參數(shù)的區(qū)別

這個(gè)問(wèn)題一定是最容易讓人迷惑的,具體來(lái)說(shuō),就是搞不清什么時(shí)候用管道符|和文件重定向>,

比如說(shuō),我現(xiàn)在有個(gè)自動(dòng)連接寬帶的 shell 腳本connect.sh,存在我的家目錄:

$ where connect.sh  
/home/fdl/bin/connect.sh

如果我想刪除這個(gè)腳本,而且想少敲幾次鍵盤(pán),應(yīng)該怎么操作呢?我曾經(jīng)這樣嘗試過(guò):

$ where connect.sh | rm

實(shí)際上,這樣操作是錯(cuò)誤的,正確的做法應(yīng)該是這樣的:

$ rm $(where connect.sh)

前者試圖將where的結(jié)果連接到rm的標(biāo)準(zhǔn)輸入,后者試圖將結(jié)果作為命令行參數(shù)傳入。

標(biāo)準(zhǔn)輸入就是編程語(yǔ)言中諸如scanf或者readline這種命令;而參數(shù)是指程序的main函數(shù)傳入的args字符數(shù)組。

管道符和重定向符是將數(shù)據(jù)作為程序的標(biāo)準(zhǔn)輸入,而$(cmd)是讀取cmd命令輸出的數(shù)據(jù)作為參數(shù),前文畫(huà)圖解釋過(guò):

輸入重定向就是說(shuō),程序想讀取數(shù)據(jù)的時(shí)候就會(huì)去 files[0] 讀取,所以我們只要把 files[0] 指向一個(gè)文件,那么程序就會(huì)從這個(gè)文件中讀取數(shù)據(jù),而不是從鍵盤(pán)。

同理,輸出重定向就是把files[1]指向一個(gè)文件,那么程序的輸出就不會(huì)寫(xiě)入到顯示器,而是寫(xiě)入到這個(gè)文件中。

管道符其實(shí)也是異曲同工,把一個(gè)進(jìn)程的輸出流和另一個(gè)進(jìn)程的輸入流接起一條「管道」,數(shù)據(jù)就在其中傳遞:

Linux 進(jìn)程、線(xiàn)程、文件描述符的底層原理

用剛才的例子說(shuō),rm命令源代碼中肯定不接受標(biāo)準(zhǔn)輸入,而是接收命令行參數(shù),刪除相應(yīng)的文件。作為對(duì)比,cat命令是既接受標(biāo)準(zhǔn)輸入,又接受命令行參數(shù):

$ cat filename  
...file text...  
$ cat echo 'hello world' | cat  
hello world

如果命令能夠讓終端阻塞,說(shuō)明該命令接收標(biāo)準(zhǔn)輸入,反之就是不接受,比如你只運(yùn)行cat命令不加任何參數(shù),終端就會(huì)阻塞,等待你輸入字符串并回顯相同的字符串。

二、后臺(tái)運(yùn)行程序

比如說(shuō)你遠(yuǎn)程登錄到服務(wù)器上,運(yùn)行一個(gè) Django web 程序:

$ python manager.py runserver 0.0.0.0  
Listening on 0.0.0.0:8080...

現(xiàn)在你可以通過(guò)服務(wù)器的 IP 地址測(cè)試 Django 服務(wù),但是終端此時(shí)就阻塞了,你輸入什么都不響應(yīng),除非輸入 Ctrl-C 或者 Ctrl-/ 終止 python 進(jìn)程。

可以在命令之后加一個(gè)&符號(hào),這樣命令行不會(huì)阻塞,可以響應(yīng)你后續(xù)輸入的命令,但是如果你退出服務(wù)器的登錄,就不能訪(fǎng)問(wèn)該網(wǎng)頁(yè)了。

如果你想在退出服務(wù)器之后仍然能夠訪(fǎng)問(wèn) web 服務(wù),應(yīng)該這樣把命令包裹成這樣(cmd &):

$ (python manager.py runserver 0.0.0.0 &)  
Listening on 0.0.0.0:8080...  
$ logout

底層原理是這樣的:

每一個(gè)命令行終端都是一個(gè) shell 進(jìn)程,你在這個(gè)終端里執(zhí)行的程序?qū)嶋H上都是這個(gè) shell 進(jìn)程分出來(lái)的子進(jìn)程。正常情況下,shell 進(jìn)程會(huì)阻塞,等待子進(jìn)程退出才重新接收你輸入的新的命令。加上&號(hào),只是讓 shell 進(jìn)程不再阻塞,可以繼續(xù)響應(yīng)你的新命令。但是無(wú)論如何,你如果關(guān)掉了這個(gè) shell 命令行端口,依附于它的所有子進(jìn)程都會(huì)退出。

而(cmd &)這樣運(yùn)行命令,則是將cmd命令掛到一個(gè)systemd系統(tǒng)守護(hù)進(jìn)程名下,認(rèn)systemd做爸爸,這樣當(dāng)你退出當(dāng)前終端時(shí),對(duì)于剛才的cmd命令就完全沒(méi)有影響了。

類(lèi)似的,還有一種后臺(tái)運(yùn)行常用的做法是這樣:

$ nohup some_cmd &

nohup命令也是類(lèi)似的原理,不過(guò)通過(guò)我的測(cè)試,還是(cmd &)這種形式更加穩(wěn)定。

三、單引號(hào)和雙引號(hào)的區(qū)別

不同的 shell 行為會(huì)有細(xì)微區(qū)別,但有一點(diǎn)是確定的,對(duì)于$,(,)這幾個(gè)符號(hào),單引號(hào)包圍的字符串不會(huì)做任何轉(zhuǎn)義,雙引號(hào)包圍的字符串會(huì)轉(zhuǎn)義。

shell 的行為可以測(cè)試,使用set -x命令,會(huì)開(kāi)啟 shell 的命令回顯,你可以通過(guò)回顯觀(guān)察 shell 到底在執(zhí)行什么命令:

Linux shell必知必會(huì)Linux shell必知必會(huì)

可見(jiàn) echo 和(cmd)”,結(jié)果差不多,但是仍然有區(qū)別。注意觀(guān)察,雙引號(hào)轉(zhuǎn)義完成的結(jié)果會(huì)自動(dòng)增加單引號(hào),而前者不會(huì)。

也就是說(shuō),如果 $ 讀取出的參數(shù)字符串包含空格,應(yīng)該用雙引號(hào)括起來(lái),否則就會(huì)出錯(cuò)。

四、sudo 找不到命令

有時(shí)候我們普通用戶(hù)可以用的命令,用sudo加權(quán)限之后卻報(bào)錯(cuò) command not found:

$ connect.sh  
network-manager: Permission denied  
$ sudo connect.sh  
sudo: command not found

原因在于,connect.sh這個(gè)腳本僅存在于該用戶(hù)的環(huán)境變量中:

$ where connect.sh  
/home/fdl/bin/connect.sh

當(dāng)使用sudo時(shí),系統(tǒng)認(rèn)為是 root 用戶(hù)在執(zhí)行命令,所以會(huì)去搜索 root 用戶(hù)的環(huán)境變量,而這個(gè)腳本在 root 的環(huán)境變量目錄中當(dāng)然是找不到的。

解決方法是使用腳本文件的路徑,而不是僅僅通過(guò)腳本名稱(chēng):

$ sudo /home/fdl/bin/connect.sh

以上就是全部?jī)?nèi)容,對(duì)于出現(xiàn)的一些難以理解的現(xiàn)象,要多思考和嘗試,熟練之后,shell 命令行真的可以帶來(lái)很大的便利。


本文題目:詳解Linux shell注意事項(xiàng)
文章網(wǎng)址:http://m.5511xx.com/article/djhjpei.html