成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于Linux shell你必須知道的

系統(tǒng) Linux
那么對于 Linux 命令行,本文不是介紹某些命令的用法,而是說明一些簡單卻特別容易讓人迷惑的細(xì)節(jié)問題。

 我個人很喜歡使用 Linux 系統(tǒng),雖然說 Windows 的圖形化界面做的確實(shí)比 Linux 好,但是對腳本的支持太差了。一開始有點(diǎn)不習(xí)慣命令行操作,但是熟悉了之后反而發(fā)現(xiàn)移動鼠標(biāo)點(diǎn)點(diǎn)點(diǎn)才是浪費(fèi)時間的罪魁禍?zhǔn)住!!?/p>

那么對于 Linux 命令行,本文不是介紹某些命令的用法,而是說明一些簡單卻特別容易讓人迷惑的細(xì)節(jié)問題。

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

2、在后臺運(yùn)行命令在退出終端后也全部退出了。

3、單引號和雙引號表示字符串的區(qū)別。

4、有的命令和sudo一起用就 command not found。

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

這個問題一定是最容易讓人迷惑的,具體來說,就是搞不清什么時候用管道符|和文件重定向>,<,什么時候用變量$。

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

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

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

  1. $ where connect.sh | rm 

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

  1. $ rm $(where connect.sh) 

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

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

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

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

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

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

labuladong,公眾號:labuladong

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

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

  1. $ cat filename  
  2. ...file text...  
  3. $ cat < filename  
  4. ...file text...  
  5. $ echo 'hello world' | cat  
  6. hello world 

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

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

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

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

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

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

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

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

底層原理是這樣的:

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

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

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

  1. $ nohup some_cmd & 

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

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

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

shell 的行為可以測試,使用set -x命令,會開啟 shell 的命令回顯,你可以通過回顯觀察 shell 到底在執(zhí)行什么命令:

可見 echo $(cmd) 和 echo "$(cmd)",結(jié)果差不多,但是仍然有區(qū)別。注意觀察,雙引號轉(zhuǎn)義完成的結(jié)果會自動增加單引號,而前者不會。

也就是說,如果 $ 讀取出的參數(shù)字符串包含空格,應(yīng)該用雙引號括起來,否則就會出錯。

四、sudo 找不到命令

有時候我們普通用戶可以用的命令,用sudo加權(quán)限之后卻報錯 command not found: 

  1. $ connect.sh  
  2. network-manager: Permission denied  
  3. $ sudo connect.sh  
  4. sudo: command not found 

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

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

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

解決方法是使用腳本文件的路徑,而不是僅僅通過腳本名稱: 

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

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

如果本文解決了一點(diǎn)你的疑惑,可以點(diǎn)個在看分享鼓勵下我。 

 

責(zé)任編輯:龐桂玉 來源: Linux學(xué)習(xí)
相關(guān)推薦

2012-11-05 09:19:37

2019-05-30 08:25:50

5G4G網(wǎng)絡(luò)

2015-07-23 10:37:13

Linux命令

2011-12-16 17:05:58

2012-02-08 09:44:05

ChromeAndroid

2019-06-05 15:43:46

固態(tài)硬盤PC

2009-06-04 10:20:34

Hibernate持久化Java

2017-10-17 15:18:58

綜合布線網(wǎng)絡(luò)

2021-06-29 15:56:39

MYSQL開發(fā)數(shù)據(jù)庫

2017-12-07 15:47:25

2012-09-29 10:29:56

.Net內(nèi)存分配繼承

2012-09-29 09:22:24

.NETGC內(nèi)存分配

2017-12-07 15:28:36

2016-06-29 13:50:12

云計算

2015-01-20 11:24:52

Win 10

2015-05-29 09:45:42

Google IOA

2021-10-29 08:44:22

推拉機(jī)制面試broker

2015-06-29 09:40:10

Rails新特性

2011-11-30 09:09:13

王濤Windows Pho移動開發(fā)

2017-10-11 15:50:18

光纖通信傳輸
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 自拍视频在线观看 | 国产精品国产自产拍高清 | 午夜电影福利 | 玖玖玖在线观看 | 亚洲一区二区在线视频 | 精品国产99 | 欧美5区| 婷婷久久五月天 | 亚洲一区视频在线 | 午夜影晥 | 99久久精品免费看国产四区 | 国产高清精品在线 | 国产成人精品高清久久 | 操操日 | 精品欧美色视频网站在线观看 | 国产一区二 | 久久国产99 | 精品久久久久久久久久久久 | 国产激情一区二区三区 | 一级做a爰片性色毛片16美国 | 国产精品久久久久久久久久软件 | 一区久久 | 欧美性大战久久久久久久蜜臀 | 国产高清免费视频 | 亚洲精品久久久久久首妖 | 99久久精品免费看国产免费软件 | 中文字幕日韩欧美一区二区三区 | 日韩在线看片 | 欧美精品久久久久久久久久 | 国产精品99久久久久久大便 | 国产精品乱码一二三区的特点 | 中国美女av | 丝袜久久| 一级免费毛片 | 在线观看av免费 | 精品一区二区三区av | 欧美精品一区在线 | 欧美日韩一区在线观看 | 日本不卡一区 | 国产美女久久 |