色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>shell編程之 shell問答錄

shell編程之 shell問答錄

2017-11-07 | rar | 0.3 MB | 次下載 | 1積分

資料介紹

分享到: 前些天在CU上討論一個統計正在執行的腳本數量的問題過程中,發現自己對于shell如何執行命令方面了解還是甚少,慚愧慚愧。..期間得到waker兄的指點,在此表示感謝!他的說法除了個別地方不太準確外,基本上是正確的。這些天抽時間找了些資料研究了一下,又學到了不少!這里把我的一點心得以問答的形式貼出來,供大家參考。小弟才疏學淺,錯誤的地方一定很多,歡迎大家拍磚、指正!
  Q1: shell如何執行“簡單”命令?
  A: 這里的簡單命令和bash參考手冊里的含義相同,形式上一般是:命令的名稱加上它的參數。有三種不同的簡單命令:
  1.內置命令(builtin)
  是shell解釋程序內建的,有shell直接執行,不需要派生新的進程。有一些內部命令可以用來改變當前的shell環境,如:
  cd /path
  var=value
  read var
  export var
  。..
  2.外部命令(“external command” or “disk command”)
  二進制可執行文件,需要由磁盤裝入內存執行。會派生新的進程,shell解釋程序會調用fork自身的一個拷貝,然后用exec系列函數來執行外部命令,然后外部命令就取代了先前fork的子shell。
  3.shell腳本(script)
  shell解釋程序會fork+exec執行這個腳本命令,在exec調用中內核會檢查腳本的第一行(如:#!/bin/sh),找到用來執行腳本的解釋程序,然后裝入這個解釋程序,由它解釋執行腳本程序。解釋程序可能有很多種,各種shell(Bourne shell,Korn shell cshell,rc及其變體ash,dash,bash,zshell,pdksh,tcsh,es.。.),awk,tcl/tk,expect,perl,python,等等。在此解釋程序顯然是當前shell的子進程。如果這個解釋程序與當前使用的shell是同一種shell,比如都是bash,那么它就是當前shell的子shell,腳本中的命令都是在子shell環境中執行的,不會影響當前shell的環境。
  Q2: shell腳本是否作為單獨的一個進程執行?
  A: 不是,shell腳本本身不能作為一個進程。如上面講的,shell腳本由一個shell解釋程序來解釋、運行其中的命令。這個shell解釋程序是單獨的一個進程,腳本中的外部命令也都作為獨立進程依次被運行。這也就是為什么ps不能找到正在運行的腳本的名字的原因了。作為一個替代方案,你可以這樣調用腳本:
  sh script-name
  這時shell解釋程序“sh”作為一個外部命令被顯式地調用,而script-name作為該命令的命令行參數可以被我們ps到。
  另外,如果你的系統上有pidof命令可用,它倒是可以找出shell腳本進程(實際上應該是執行shell腳本的子shell進程)的進程ID:
  pidof -x script-name
  Q3: shell何時在子shell中執行命令?
  A: 在此我們主要討論Bourne shell及其兼容shell。在許多情況下shell會在子shell中執行命令:
  1.(。..)結構
  小括號內的命令會在一個子shell環境中執行,命令執行的結果不會影響當前的shell環境。需要注意是此時變量$$會顯示當前shell的進程id,而不是子shell的進程id。
  參考:
  {。..;}結構中的命令在當前shell中執行,(內部)命令執行的結果會影響當前的shell環境。
  2.后臺執行或異步執行
  command&
  命令由一個子shell在后臺執行,當前shell立即取得控制等候用戶輸入。后臺命令和當前shell的執行是并行的,但沒有互相的依賴、等待關系,所以是異步的并行。
  3.命令替換
  `command`(Bourn shell及兼容shell/csh)
  $(command)(在ksh/bash/zsh中可用)
  將command命令執行的標準輸出代換到當前的命令行。command在子shell環境中執行,結果不會影響當前的shell環境。
  4.管道(不同的shell處理不同)
  cmd1|cmd2
  cmd1和cmd2并行執行,并且相互有依賴關系,cmd2的標準輸入來自cmd1的標準輸出,二者是“同步”的。
  對管道的處理不同的shell實現的方式不同。
  在linux環境下大多數shell(bash/pdksh/ash/dash等,除了zshell例外)都將管道中所有的命令在子shell環境中執行,命令執行的結果不會影響當前的shell環境。
  Korn shell的較新的版本(ksh93以后)比較特殊,管道最后一級的命令是在當前shell執行的。這是一個feature而非BUG,在POSIX標準中也是允許的。這樣就使下面的命令結構成為可能:
  command|read var
  由于read var(read是一個內部命令)在當前shell中執行,var的值在當前shell就是可用的。
  反之bash/pdksh/ash/dash中read var在子shell環境中執行,var讀到的值無法傳遞到當前shell,所以變量var無法取得期望的值。類似這樣的問題在各種論壇和news group中經常被問到。個人認為command|read var的結構很清晰,并且合乎邏輯,所以我認為Korn shell的這個feature很不錯。可惜不是所有的shell都是這樣實現的。:(如開源的pdksh就是在子shell執行管道的每一級命令。
  Korn shell對管道的處理還有一個特殊的地方,就是管道如果在后臺執行的話,管道前面的命令會由最后一級的命令派生,而不是由當前shell派生出來。據說Bourne shell也有這個特點(標準的Bourne shell沒有測試環境,感興趣的朋友有條件的可以自行驗證)。但是他們的開源模仿者,pdksh和ash卻不是這樣處理。
  最特殊的是zshell,比較新的zshell實現(好像至少3.0.5以上)會在當前shell中執行管道中的每一級命令,不僅僅是最后一條。每一條命令都由當前shell派生,在后臺執行時也是一樣。可見在子sehll中執行管道命令并不是不得已的做法,大概只是因為實現上比較方便或者這樣的處理已經成為unix的傳統之一了吧。;-)
  讓我們總結一下,不同的shell對管道命令的處理可能不同。有的shell中command|read var這樣的結構是ok的,但我們的代碼出于兼容性的緣故不能依賴這一點,最好能避免類似的代碼。
  5.進程替換(僅bash/zsh中,非POSIX兼容)
  《(。..)
  》(。..)
  與管道有點類似,例子:cmd1 《(cmd2) 》(cmd3), cmd1, cmd2, cmd3的執行是同步并行的。
  《(command)形式可以用在任何命令行中需要填寫輸入文件名的地方,command的標準輸出會被該命令當作一個輸入文件讀入。
  》(command)形式可以用在任何命令行中需要填寫輸出文件的地方,該命令的輸出會被command作為標準輸入讀入。
  兩種形式中的command都在子shell環境中執行,結果不會影響當前的shell環境。
  6.if或while命令塊的輸入輸出重定向
  在SVR4.2的Bourne shell中對此情況會fork一個子shell執行if塊和while塊中的命令;在linux下似乎其它的shell中都不這樣處理。
  7.協進程(ksh)
  只有Korn shell和pdksh有協進程的機制(其它shell中可以用命名管道來模擬)。類似于普通的后臺命令,協進程在后臺同步運行,所以必須在子shell中運行。協進程與后臺命令不同的是它要和前臺進程(使用read -p和print -p)進行交互,而后者一般只是簡單地異步運行。
  Q4: 既然在當前shell中執行命令也會派生子shell,那么它與在子shell中執行命令又有什么區別呢?
  A: 這種說法不準確。
  在當前shell中執行內部命令不會派生子shell,因此有些內部命令才能夠改變當前的shell執行環境。
  在當前shell中執行外部命令或腳本時會派生子shell,所以這時命令的執行不會影響當前 的shell環境。注意:子shell中執行的內部命令只會改變子shell的執行環境,而不會改變當前shell(父shell)的環境。
  Q5: 怎樣把子shell中的變量傳回父shell?
  A: 例如(echo “$a”) | read b不能工作,如何找到一個替代方案?下面給出一些可能的方案:
  1.使用臨時文件
  。..
  #in subshell
  a=100
  echo “$a”》tmpfile
  。..
  #in parent
  read b
  2.使用命名管道
  mkfifo pipef
  (。..
  echo “$a” 》 pipef
  。..)
  read b
  3.使用coprocess(ksh)
  ( echo “$a” |&)
  read -p b
  4.使用命令替換
  b=`echo “$a”`
  5.使用eval命令
  eval `echo “b=$a”`
  6.使用here document
  read b 《`echo “$a”`
  END
  7.使用here string(bash/pdksh)
  read b 《《《`echo “$a”`
  8.不用子shell,用。命令或source命令執行腳本。
  即在當前shell環境下執行腳本,沒有子shell,也就沒有了子shell的煩惱。:)
  解決的方法還不止于此,其它的進程間通信手段應該也能使用,這有待于大家一起發掘了。^_^
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1AN158 GD32VW553 Wi-Fi開發指南
  2. 1.51MB   |  2次下載  |  免費
  3. 2嵌入式軟件開發符合ISO 26262 功能安全標準
  4. 1.61 MB  |  1次下載  |  免費
  5. 3AN148 GD32VW553射頻硬件開發指南
  6. 2.07MB   |  1次下載  |  免費
  7. 4PZT驅動開關電路
  8. 0.09 MB   |  1次下載  |  免費
  9. 5模擬電路仿真實現
  10. 2.94MB   |  1次下載  |  免費
  11. 6PCB繪制基礎知識
  12. 2.44MB   |  1次下載  |  免費
  13. 7EE-38:ADSP-2181 IDMA端口-周期竊取時序
  14. 75.0KB   |  次下載  |  免費
  15. 8EE-82:使用ADSP-2181 DSP的IO空間對另一個ADSP-2181進行IDMA引導
  16. 86.86KB   |  次下載  |  免費

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  452次下載  |  免費
  3. 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
  4. 5.67 MB   |  139次下載  |  1 積分
  5. 3基于STM32單片機智能手環心率計步器體溫顯示設計
  6. 0.10 MB   |  132次下載  |  免費
  7. 4美的電磁爐維修手冊大全
  8. 1.56 MB   |  24次下載  |  5 積分
  9. 5如何正確測試電源的紋波
  10. 0.36 MB   |  19次下載  |  免費
  11. 6感應筆電路圖
  12. 0.06 MB   |  10次下載  |  免費
  13. 7LZC3106G高性能諧振控制器中文手冊
  14. 1.29 MB   |  9次下載  |  1 積分
  15. 8萬用表UT58A原理圖
  16. 0.09 MB   |  9次下載  |  5 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935121次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420062次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73810次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
主站蜘蛛池模板: 双腿打开揉弄高潮H苏安安秦慕深 | 夜夜穞狠狠穞 | 天天操天天干天天透 | 日本一本二本三区免费免费高清 | 浪荡女天天不停挨CAO日常视 | 日本枯瘦娇小 | yellow日本高清在线 | 亚洲精品乱码久久久久久直播 | 日日干夜夜啪蕉视频 | 999视频精品全部免费观看 | 在线免费看a | 日本VA在线视频播放 | 国产成人精品综合久久久 | 办公室的秘密2中文字幕 | 色裕插插插影视 | 亚洲欧美中文日韩视频 | 二级毛片免费观看全程 | 老阿姨才是最有味的一区二区 | 日本高清无人区影院 | 亚洲视频免费 | 哺乳期妇女挤奶水36d | 在线观看免费小视频 | 污污内射久久一区二区欧美日韩 | 欧美亚洲曰韩一本道 | 午夜宅宅伦电影网 | 国厂精品114福利电影 | 亚洲阿v天堂在线2017 | 日韩亚洲人成在线 | 日本特黄网站 | 国产午夜精品一区理论片飘花 | 久久热在线视频精品店 | 亚洲AV 中文字幕 国产 欧美 | 亚洲三级在线中文字幕 | www.色片| 黑丝制服影院 | 高清无码中文字幕在线观看视频 | 亚洲精品久久久久AV无码林星阑 | 在线天天看片免费视频观看 | 嫩草影院地址一二三 | 国产精品VIDEOSSEX久久发布 | 亚洲国产精品自在自线观看 |