Linux命令行與shell腳本編程大全-2.2

第二部分 shell腳本編程基礎

第11章構建基礎腳本
第12章結構化命令
第13章更多的結構化命令
第14章處理用戶輸入
第15章呈現數據
第16章腳本控制

第15章 呈現數據

15.1 理解輸入和輸出

15.1.1 標準文件描述符

Linux 系統會將每個對象當作文件來處理,這包括輸入和輸出。Linux 用文件描述符來標識
每個文件對象。

15.1.2 重定向錯誤 #

15.2 在腳本中重定向輸出

15.2.1 臨時重定向

如果你有意在腳本中生成錯誤消息,可以將單獨的一行輸出重定向到STDERR。這只需要使
用輸出重定向符號將輸出重定向到STDERR 文件描述符符。在重定向到文件描述符時,必須在文件描述符索引值之前加一個&
echo "This is an error message" >&2
這行會在腳本的STDERR 文件描述符所指向的位置顯示文本。

$ cat test10
#!/bin/bash
# redirecting all output to a file
exec 1>testout
echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line"
$ ./test10
$ cat testout
This is a test of redirecting all output
from a script to another file.
without having to redirect every individual line
$
15.2.2 永久重定向:?exec 命令

如果腳本中有大量數據需要重定向,那么逐條重定向所有的echo 語句會很煩瑣。這時可以
用exec 命令,exec 命令會啟動一個新shell 并將STDOUT 文件描述符重定向到指定文件。腳本中送往STDOUT 的所有輸出都會被重定向

15.3 在腳本中重定向輸入

在Linux 系統中,exec 命令允許將STDIN 重定向為文件:
exec 0< testfile

15.4 創建自己的重定向

15.4.1 創建輸出文件描述符

可以用exec 命令分配用于輸出的文件描述符

exec 3 > test13out

15.4.2 重定向文件描述符

exec 3>&1? ?#?將文件描述符3 重定向到了文件描述符1(STDOUT)的當前位置,

將發送給STDOUT 的輸出直接送
往該文件。

$ cat test14
#!/bin/bash
# storing STDOUT, then coming back to it
exec 3>&1   # 將文件描述符3 重定向到了文件描述符1(STDOUT)的當前位置
exec 1>test14out   # 將STDOUT 重定向到了test14out文件
echo "This should store in the output file"
echo "along with this line."
exec 1>&3 #令將STDOUT 重定向到了文件描述符3 的當前位置
echo "Now things should be back to normal"
$
$ ./test14
Now things should be back to normal
$ cat test14out
This should store in the output file
along with this line.
$
15.4.3 創建輸入文件描述符 #
$ cat test15
#!/bin/bash
# redirecting input file descriptors
exec 6<&0 #文件描述符6 用于保存STDIN 指向的位置
exec 0< testfile #將STDIN 重定向到一個文件
count=1 
while read line  # read 命令的所有輸入都來自輸入文件
do
echo "Line #$count: $line"
count=$[ $count + 1 ]
done
exec 0<&6
read -p "Are you done now? " answer
case $answer in
Y|y) echo "Goodbye";;
N|n) echo "Sorry, this is the end.";;
esac
$ ./test15
Line #1: This is the first line.
Line #2: This is the second line.
Line #3: This is the third line.
Are you done now? y
Goodbye
$
15.4.4 創建讀/寫文件描述符 #

打開單個文件描述符兼做輸入和輸出,這樣就能用同一個文件描述符對文件進行讀和寫兩種操作

15.4.5關閉文件描述符 #?

要關閉文件描述符,只需將其重定向到特殊符號&-即可。在腳本中如下所示:
exec 3>&-

15.5 列出打開的文件描述符

bash shell 提供了lsof 命令

$ /usr/sbin/lsof -a -p $$ -d 0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 3344 rich 0u CHR 136,0 2 /dev/pts/0
bash 3344 rich 1u CHR 136,0 2 /dev/pts/0
bash 3344 rich 2u CHR 136,0 2 /dev/pts/0
$

15.6 抑制命令輸出

不想顯示腳本輸出。將腳本作為后臺進程運行時這很常見。要解決這個問題,可以將STDERR 重定向到一個名為null 文件的特殊文件。跟它的名字很像,null 文件里什么都沒有。shell 輸出到null 文件的任何數據都不會被保存,全部會被丟棄。

$ ls -al > /dev/null
$ cat /dev/null
$

15.7 使用臨時文件

15.7.1 創建本地臨時文件

在默認情況下,mktemp 會在本地目錄中創建一個文件。在使用mktemp 命令時,只需指定
一個文件名模板即可。模板可以包含任意文本字符,同時在文件名末尾要加上6 個X:
$ mktemp testing.XXXXXX
?

15.7.2 在/tmp目錄中創建臨時文件

-t 選項會強制mktemp 命令在系統的臨時目錄中創建文件。在使用這個特性時,mktemp
命令會返回所創建的臨時文件的完整路徑名,而不只是文件名:
$ mktemp -t test.XXXXXX

15.7.3 創建臨時目錄

-d 選項會告訴mktemp 命令創建一個臨時目錄。你可以根據需要使用該目錄,比如在其中
創建其他的臨時文件:

$ cat test21
#!/bin/bash
# using a temporary directory 
tempdir=$(mktemp -d dir.XXXXXX)  # 創建了一個臨時目錄
cd $tempdir
tempfile1=$(mktemp temp.XXXXXX) # 創建了兩個臨時文件
tempfile2=$(mktemp temp.XXXXXX)
exec 7> $tempfile1 # 這兩個臨時文件又被分配給了文件描述符以用來保存腳本的輸出
exec 8> $tempfile2
echo "Sending data to directory $tempdir"
echo "This is a test line of data for $tempfile1" >&7
echo "This is a test line of data for $tempfile2" >&8

15.8 記錄消息

確實需要將輸出同時送往顯示器和文件。與其對輸出進行兩次重定向,不如改用特殊的tee 命令。
tee 命令就像是連接管道的T 型接頭

$ date | tee testfile
Sun Jun 21 18:56:21 EDT 2020
$ cat testfile
Sun Jun 21 18:56:21 EDT 2020
$

第16章 腳本控制

16.1 處理信號

16.1.1 重溫Linux信號

16.1.2 產生信號
1. 中斷進程:Ctrl+C 組合
2. 暫停進程:?Ctrl+Z 組合
16.1.3 捕獲信號:trap 命令

trap 命令可以指定shell腳本需要偵測并攔截的Linux 信號。如果腳本收到了trap 命令中列出的信號,則該信號不再由shell 處理,而是由本地處理。
trap 命令的格式如下:
trap commands signals

$ cat trapsignal.sh
#!/bin/bash
#Testing signal trapping
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT   # 捕獲信號
#
echo This is a test script.
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
echo "This is the end of test script."
exit
$$ ./trapsignal.sh
This is a test script.
Loop #1
Loop #2
^C Sorry! I have trapped Ctrl-C
Loop #3
^C Sorry! I have trapped Ctrl-C
Loop #4
Loop #5
This is the end of test script.
$
16.1.4 捕獲腳本退出

在shell 腳本中捕獲信號,也可以在shell 腳本退出時捕獲信號。這是在shell 完成任務時執行命令的一種簡便方法。要捕獲shell 腳本的退出,只需在trap 命令后加上EXIT 信號即可

$ cat trapexit.sh
#!/bin/bash
#Testing exit trapping
#
trap "echo Goodbye..." EXIT   # 捕獲腳本退出
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
exit
$
$ ./trapexit.sh
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
Goodbye...
$
16.1.5 修改或移除信號捕獲

想在腳本中的不同位置進行不同的信號捕獲處理,只需重新使用帶有新選項的trap 命令即可

16.2 以后臺模式運行腳本

使用ps -e 命令,可以看到Linux 系統中運行的多個進程

16.2.1 后臺運行腳本

以后臺模式運行shell 腳本非常簡單,只需在腳本名后面加上&即可

$ cat backgroundscript.sh
#!/bin/bash
#Test running in the background
#
count=1
while [ $count -le 5 ]
do
sleep 1
count=$[ $count + 1 ]
done
#
exit
$
$ ./backgroundscript.sh &
[1] 2595
$
16.2.2 運行多個后臺作業

在使用命令行提示符的情況下,可以同時啟動多個后臺作業

$ ./testAscript.sh &
[1] 2753
$ This is Test Script #1.
$ ./testBscript.sh &
[2] 2755
$ This is Test Script #2.
$ ./testCscript.sh &
[3] 2757
$ And... another Test script.
$ ./testDscript.sh &
[4] 2759
$ Then...there was one more Test script.

16.3 在非控制臺下運行腳本:?nohup

即便退出了終端會話,你也想在終端會話中啟動shell 腳本,讓腳本一直以后臺模式運行到結束。這可以用nohup 命令來實現

nohup 命令的格式如下:
nohup command
下面的例子使用一個后臺腳本作為command:
$ nohup ./testAscript.sh &
[1] 1828
$ nohup: ignoring input and appending output to 'nohup.out'

注意 nohup.out 文件一般在當前工作目錄中創建,否則會在$HOME 目錄中創建

16.4 作業控制

在作業停止后,Linux 系統會讓你選擇是“殺死”該作業還是重啟該作業。用kill 命令可以“殺死”該作業。要重啟停止的進程,則需要向其發送SIGCONT 信號。

16.4.1 查看作業

jobs 是作業控制中的關鍵命令,通過jobs 命令可以查看分配給shell 的作業

jobs 命令的-l 選項(小寫字母l)查看作業的PID。

16.4.2 重啟已停止的作業

要以后臺模式重啟作業,可以使用bg 命令

$ ./restartjob.sh
^Z
[1]+ Stopped ./restartjob.sh
$
$ bg
[1]+ ./restartjob.sh &
$
$ jobs
[1]+ Running ./restartjob.sh &
$

16.5 調整謙讓度

在多任務操作系統(比如Linux)中,內核負責為每個運行的進程分配CPU 時間。調度優先
級[也稱為謙讓度(nice value)]是指內核為進程分配的CPU 時間(相對于其他進程)

調度優先級是一個整數值,取值范圍從-20(最高優先級)到+19(最低優先級)。

只要記住那句俗話“好人難做。”(Nice guys finish last.)即可。越是“謙讓”(nice)或是值越
大,獲得CPU 的機會就越低。

16.5.1 nice命令

nice 命令允許在啟動命令時設置其調度優先級。要想讓命令以更低的優先級運行,只需用
nice 命令的-n 選項指定新的優先級即可:

$ nice -n 10 ./jobcontrol.sh > jobcontrol.out &

注意,nice 命令和要啟動的命令必須出現在同一行中。ps 命令的輸出證實,謙讓度(NI列)已經調整到了10。

16.5.2 renice命令

修改系統中已運行命令的優先級。可以使用renice 命令

renice 命令對于非特權用戶也有一些限制:只能對屬主為自己的進程使用renice 且只能降低調度優先級。

16.6 定時運行作業

Linux 系統提供了多個在預選時間運行腳本的方法:at 命令、cron 表以及anacron。

16.6.1 使用at命令調度作業

at 命令允許指定Linux 系統何時運行腳本。

1. at 命令的格式

at 命令的基本格式非常簡單:
at [-f filename] time

在使用at 命令時,該作業會被提交至作業隊列。作業隊列保存著通過at 命令提交的待處
理作業。針對不同優先級,有52 種作業隊列。作業隊列通常用小寫字母a~z 和大寫字母A~Z 來
指代,A 隊列和a 隊列是兩個不同的隊列。

2. 獲取作業的輸出

at 命令會顯示分配給作業的作業號以及為作業安排的運行時間。-f 選項指明使用哪個腳本
文件。now 指示at 命令立刻執行該腳本。

3. 列出等待的作業

atq 命令可以查看系統中有哪些作業在等待

4. 刪除作業

就可以用atrm 命令刪除等待中的作業。指定要刪除的作業號即可

$ atq
1 Thu Jun 18 16:11:00 2020 a christine
5 Fri Jun 19 16:00:00 2020 a christine
6 Fri Jun 19 16:53:00 2020 a christine
7 Thu Jun 18 20:30:00 2020 a christine
8 Thu Jun 18 17:54:00 2020 a christine
$
$ atrm 5
16.6.2 調度需要定期運行的腳本

使用cron 程序調度需要定期執行的作業。cron 在后臺運行,并會檢查一個特殊的表(cron 時間表),從中獲知已安排執行的作業。

1. cron 時間表

cron 時間表通過一種特別的格式指定作業何時運行,其格式如下:
minutepasthour hourofday dayofmonth month dayofweek command

2. 構建cron 時間表

要列出已有的cron 時間表,可以用-l 選項:
$ crontab -l

3. 瀏覽cron 目錄

創建的腳本對于執行時間的精確性要求不高,則用預配置的cron 腳本目錄會更方便。
預配置的基礎目錄共有4 個:hourly、daily、monthly 和weekly

$ ls /etc/cron.*ly
/etc/cron.daily:
0anacron apt-compat cracklib-runtime logrotate [...]
apport bsdmainutils dpkg man-db [...]
4. anacron 程序

使用場景:如果某個作業在cron 時間表中設置的運行時間已到,但這時候Linux 系統處于關閉狀態,那么該作業就不會運行。當再次啟動系統時,cron 程序不會再去運行那些錯過的作業。

anacron 判斷出某個作業錯過了設置的運行時間,它會盡快運行該作業

16.7 使用新shell啟動腳本

每次啟動新shell,bash shell 都會運行.bashrc 文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713431.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

T3SF:一款功能全面的桌面端技術練習模擬框架

關于T3SF T3SF是一款功能全面的桌面端技術練習模擬框架&#xff0c;該工具針對基于主場景事件列表的各種事件提供了模塊化的架構&#xff0c;并包含了針對每一個練習定義的規則集&#xff0c;以及允許為對應平臺參數定義參數的配置文件。 該工具的主模塊能夠執行與其他特定模…

CDN原理探究

來源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通過上圖&#xff0c;我們可以了解到&#xff0c;使用了CDN緩存后的網站的訪問過程變為&#xff1a; 用戶向瀏覽器提供要訪問的域名&#xff…

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么?

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么&#xff1f; 對于4到8人的玩家&#xff0c;推薦的配置是4核16G的CPU和16G的內存。10到20人的玩家選擇8核32G的CPU和32G或以上的內存。2到4人的玩家則建議選擇4核8G的CPU和8G的內存。對于32人的玩家&#xff0c;推…

YOLOV8介紹

原文鏈接&#xff1a; 1、 詳解YOLOv8網絡結構/環境搭建/數據集獲取/訓練/推理/驗證/導出 2、Yolov8的詳解與實戰 3、YOLOV8模型訓練部署&#xff08;實戰&#xff09;&#xff08;&#xff09;有具體部署和訓練實現代碼YOLOV8模型訓練部署&#xff08;實戰&#xff09;&…

Mybatis plus核心功能-IService

目錄 1 前言 2 使用方法 2.1 繼承ServiceImpl,> 2.2 基礎業務開發的使用 2.3 復雜業務開發的使用 2.3 Lambda查詢 2.4 Lambda更新 1 前言 我本以為Mapper層的類能夠繼承BaseMapper<XXX>&#xff0c;而不用我們手動寫一些mapper方法已經夠離譜了。沒想到海油膏…

linux上pip3 install torch==1.11和pip3 install torch==1.11+cu115區別

在linux上安裝torch時&#xff0c; 如果環境安裝好了CUDA環境&#xff0c; 那么安裝torch時不用刻意指定帶cuda的版本&#xff0c; 最終安裝的也是支持GPU的torch版本。但是仍然有一些小的區別&#xff0c;主要就是支持CUDA版本的不同。 (leo_py37) pinefieldedge-gpu-01:/dat…

Gradle構建項目

1.自己下載對應的gradle版本到本地。 2.maven國內鏡像&#xff08;settings.gradle中進行配置&#xff09; // google()maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repository/google/}maven { url https://maven.aliyu…

【機器學習300問】25、常見的模型評估指標有哪些?

模型除了從數據劃分的角度來評估&#xff0c;我上一篇文章介紹了數據集劃分的角度&#xff1a; 【機器學習300問】24、模型評估的常見方法有哪些&#xff1f;http://t.csdnimg.cn/LRyEt 還可以從一些指標的角度來評估&#xff0c;這篇文章就帶大家從兩個最經典的任務場景介紹…

Day08:基礎入門-算法分析傳輸加密數據格式密文存儲代碼混淆逆向保護

目錄 傳輸數據-編碼型&加密型等 傳輸格式-常規&JSON&XML等 密碼存儲-Web&系統&三方應用 代碼混淆-源代碼加密&逆向保護 思維導圖 章節知識點&#xff1a; 應用架構&#xff1a;Web/APP/云應用/三方服務/負載均衡等 安全產品&#xff1a;CDN/WAF/I…

【stata】漸進式雙重差分/交錯式雙重差分(staggered-DID) 實現過程

Staggered-DID 的實現 為保證本貼的簡潔性與一般適用性,本文并沒有使用現有真實數據,而是模擬了一個一般數據。如果你手中有正在處理好的project數據,可以跳過1.數據生成,直接從2.數據預加工開始。 1.數據生成 (1)數據生成過程 我將隨機生成一個數據來模擬staggered-DID…

leetcode 熱題 100_移動零

題解一&#xff1a; 雙指針遍歷&#xff1a;將非零的值往數組前端依次放置&#xff0c;將放置之后數組后端多余的位置都置為0&#xff0c;參考下圖&#xff08;來源. - 力扣&#xff08;LeetCode&#xff09;&#xff09; class Solution {public void moveZeroes(int[] nums)…

c語言的數據結構:隊列

1.隊列存在的實現方式及其存在意義 1.1為什么隊列使用單鏈表實現更好 動態內存分配&#xff1a;鏈表在C語言中通常使用動態內存分配&#xff0c;這意味著可以在運行時根據需要動態地添加或刪除節點。這對于實現一個動態大小的隊列非常有用&#xff0c;因為隊列的大小可以在運…

界面控件Telerik UI for ASP. NET Core教程 - 如何為網格添加上下文菜單?

Telerik UI for ASP.NET Core是用于跨平臺響應式Web和云開發的最完整的UI工具集&#xff0c;擁有超過60個由Kendo UI支持的ASP.NET核心組件。它的響應式和自適應的HTML5網格&#xff0c;提供從過濾、排序數據到分頁和分層數據分組等100多項高級功能。 上下文菜單允許開發者為應…

[unity] c# 擴展知識點其一 【個人復習筆記/有不足之處歡迎斧正/侵刪】

.NET 微軟的.Net既不是編程語言也不是框架,是類似于互聯網時代、次時代、21世紀、信息時代之類的宣傳口號,是一整套技術體系的統稱&#xff0c;或者說是微軟提供的技術平臺的代號. 1.跨語言 只要是面向.NET平臺的編程語言(C#、VB、 C、 F#等等)&#xff0c;用其中一種語言編寫…

帶著問題閱讀源碼——Spring MVC是如何將url注冊到RequestMappingHandlerMapping?

背景 在 Spring MVC 中&#xff0c;DispatcherServlet 是前端控制器&#xff08;front controller&#xff09;&#xff0c;它負責接收所有的 HTTP 請求并將它們映射到相應的處理器&#xff08;handler&#xff09;。為了實現這一點&#xff0c;Spring MVC 使用了適配器模式將…

大街款商城項目03-微服務之間調用

目錄 RestTemplate OpenFeign 1.引入依賴open-feign 2.聲明要調用的服務和接口 3.注入FeignClient啟用 4驗證 RestTemplate 在微服務架構中&#xff0c;使用RestTemplate是一種常見的方式進行服務間的HTTP通信。以下是一個簡單的示例&#xff0c;演示如何使用RestTempla…

Android minigbm框架普法

Android minigbm框架普法 引言 假設存在這么一個場景&#xff0c;我的GPU的上層實現走的不是標準的Mesa接口&#xff0c;且GPU也沒有提專門配套的gralloc和hwcompoer實現。那么我們的Android要怎么使用到EGL和GLES庫呢&#xff0c;并且此GPU驅動是支持drm實現的&#xff0c;也有…

Galaxy生信云平臺:集合操作工具大全

Galaxy平臺上的文件稱為數據集&#xff08;Dataset&#xff09;&#xff0c;如果將多個文件組合在一起&#xff0c;則形成數據集合&#xff08;Dataset collection&#xff09;。 上傳文件后&#xff0c;可以通過工具將文件構建成數據集合。具體操作可以參考前面介紹轉錄組流程…

后臺組件體系

從今天開始進入更細粒度說明。后臺微服務是由組件構成的。平臺的開發理念是為甲方打造一個生態環境。安裝實施時為客戶安裝私倉來管理組件。開發微服務時鼓勵拆分為組件。開發新功能時&#xff0c;先看有沒有相關組件&#xff0c;有的話就在pom.xml文件&#xff08;不要問我這個…

OpenDDS中避免訂閱發布同一主題時的自環現象(適用于所有DDS)

目錄 1、摘要2、理解"自反傳輸"2、解決方案2.1、使用 DataReaderListener 進行過濾3.2、使用 Partition 進行隔離3.3、 使用不同的 Topic 總結 1、摘要 在 OpenDDS 中&#xff0c;同時訂閱并發布同一主題會導致自環現象&#xff0c;即接收到自己發送的消息。本文介紹…