這個名字很奇怪的“heredocuments”允許您在Linux上的Bash指令碼中使用輸入/輸出重定向。他們是一個偉大的方式來自動化命令,你需要在遠端計算機上執行。
Linux中的許多命令都有兩個或三個字母的名稱。這在一定程度上導致了這樣一種觀念:Linux很難學習,而且充滿了神祕的命令。但是Linux中最奇怪的名字之一併不是一個神祕的短名字。“Here documents”不是文件,也不清楚“Here”指的是什麼。
它們是一個相對模糊的結構,但它們是有用的。當然,這是Linux作業系統,所以剝貓皮的方法不止一種。這裡提供的一些功能可以透過其他方式複製。這些替代方法通常更復雜。在程式設計和指令碼中,“更復雜”也意味著“更容易出現錯誤”,而且程式碼更難維護。
這裡真正的excel文件是自動化命令,您希望透過指令碼中建立的連線將這些命令傳送到遠端計算機。建立連線很容易,但是一旦建立了連線,如何將指令碼中的命令“泵送”到遠端計算機的shell中?這裡的文件讓您可以非常簡單地做到這一點。
here文件的慣用表示形式如下所示:
COMMAND << limit_string . . text data variables . . limit_string您可能會在這裡看到使用“EOF”作為限制字串的文件示例。我們不贊成這種做法。它可以工作,但“EOF”意味著“檔案結束”。除了極少數情況下主文件是指令碼檔案中的最後一個內容外,“EOF”被錯誤地使用。
如果您使用一個引用您正在執行的操作的限制字串,它將使您的指令碼更具可讀性。如果您透過secureshell(SSH)向遠端計算機發送一系列命令,那麼一個名為“\u remote\u commands”的限制字串將非常有意義。您不需要用下劃線“216;”字元開頭。我們這樣做是因為它在你的劇本中把它們標記為不同尋常的東西。
您可以在命令列和指令碼中使用此處的文件。在終端視窗中鍵入以下內容時,每次點選“Enter”時,都會看到“>;”行繼續提示。鍵入“\u text的結束”限制字串並點選“Enter”時,網站列表將傳遞給cat,並顯示在終端視窗中。
cat << _end_of_text How-To Geek Review Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text這不是最有價值的練習,但它確實演示了在整理整個資料列表並遇到限制字串之前,不會向命令傳送任何內容。在輸入限制字串“\u end\u of \u text”並按“enter”鍵之前,cat命令不會接收任何輸入。
我們可以在劇本里做同樣的事情。在編輯器中鍵入或複製此示例,將檔案另存為“heredoc-1.sh”,然後關閉編輯器。
#!/bin/bash cat << "_end_of_text" Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text在閱讀本文時,每次建立指令碼時,都需要使其在執行之前可執行。在每種情況下,使用chmod命令。將每個示例中的指令碼名稱替換為此處使用的指令碼名稱。
chmod +x heredoc-1.sh這個指令碼包含兩個環境變數,$PWD和$BASH\u VERSION。執行指令碼時,環境變數名將替換為當前工作目錄和Bash版本中的資料值。
該指令碼還對whoami命令使用命令替換。命令的名稱將替換為它自己的輸出。整個指令碼的輸出由cat命令寫入終端視窗。我們透過名字來執行指令碼:
./heredoc-1.sh如果修改指令碼並將限制字串括在here文件的第一行的引號“”中,則資料列表將逐字傳遞給here文件命令。將顯示變數名而不是變數值,並且不會進行命令替換。
#!/bin/bash cat <<- "_end_of_text" Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text./heredoc-1.sh
預設情況下,資料列表中的製表符將保留並寫入終端視窗。複製這個例子並儲存為“herdeoc-2.sh”。使用chmod命令使其可執行。編輯縮排的行,以確保它們在行首有一個或兩個製表符,而不是一系列空格。
#!/bin/bash cat << _end_of_text Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-2.sh選項卡將寫入終端視窗。
透過向重定向運算子新增破折號“-”,here文件將忽略前導製表符。將此示例另存為“heredoc-3.sh”,並使其可執行。
#!/bin/bash cat <<- _end_of_text Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-3.sh這些選項卡將被忽略。這看起來可能很瑣碎,但這是一種處理前導製表符的好方法,因為前導製表符是指令碼的縮排部分。
迴圈和其他邏輯結構通常是縮排的。如果您的here文件包含在指令碼的縮排部分中,則在重定向運算子中使用破折號“-”可以消除由前導製表符引起的格式問題。
#!/bin/bash if true; then cat <<- _limit_string Line 1 with a leading tab. Line 2 with a leading tab. Line 3 with a leading tab. _limit_string fi與here文件一起使用的命令的輸出可以重定向到一個檔案中。在here文件第一行的limit字串後面使用“>;”(建立檔案)或“>;”(如果檔案不存在,則建立檔案,如果檔案存在,則附加到檔案)重定向運算子。
這個指令碼是“heredoc-4.sh”。它將把輸出重定向到一個名為會話.txt.”
#!/bin/bash cat << _end_of_text > session.txt Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-4.sh cat session.texthere文件中使用的命令的輸出可以透過管道作為另一個命令的輸入。在here文件第一行的limit字串後面使用pipe“|”運算子。我們將把here document命令cat的輸出匯入sed。我們想用字母“e”替換字母“a”的所有出現處。
將此指令碼命名為“heredoc-5.sh”
#!/bin/bash cat << _end_of_text | sed 's/a/e/g' How To Gaak _end_of_text ./heredoc-5.sh“Gaak”改為“Geek”
與here文件一起使用的命令可以是指令碼中的函式。
此指令碼將一些車輛資料傳遞到函式中。函式讀取資料時,就好像它是由使用者鍵入的一樣。然後列印變數的值。將此指令碼另存為“heredoc-6.sh”。
#!/bin/bash # the set_car_details() function set_car_details () { read make read model read new_used read delivery_collect read location read price } # The here document that passes the data to set_car_details() set_car_details << _mars_rover_data NASA Perseverance Rover Used Collect Mars (long,lat) 77.451865,18.445161 2.2 billion _mars_rover_data # Retrieve the vehicle details echo "Make: $make" echo "Model: $model" echo "New or Used: $new_used" echo "Delivery or Collection: $delivery_collect" echo "Location: $location" echo "Price \$: $price" ./heredoc-6.sh車輛詳細資訊將寫入終端視窗。
我們可以使用here文件來撰寫和傳送電子郵件。注意,我們可以將引數傳遞給重定向運算子前面的命令。我們使用Linux mail命令透過本地郵件系統向名為“dave”的使用者帳戶傳送電子郵件。-s(主題)選項允許我們指定電子郵件的主題。
此示例形成指令碼“heredoc-7.sh”
#!/bin/bash article="Here Documents" mail -s 'Workload status' dave << _project_report User name: $(whoami) Has completed assignment: Article: $article _project_report ./heredoc-7.sh此指令碼沒有可見的輸出。但當我們檢查郵件時,我們發現郵件是由人撰寫、傳送和傳遞的。
mail這裡的文件是在建立SSH連線後在遠端計算機上執行某些命令的一種強大而方便的方法。如果您在兩臺計算機之間設定了SSH金鑰,那麼登入過程將是完全自動的。在這個又快又髒的例子中,會提示您輸入遠端計算機上使用者帳戶的密碼。
這個指令碼是“hereoc-8.sh”。我們要連線到一臺名為“遠端pc”的遠端計算機。使用者帳戶稱為“dave”。我們使用-T(disable偽終端分配)選項,因為我們不需要為我們分配一個互動式偽終端。
在指令碼的“在這裡做一些工作”部分,我們可以傳遞一個命令列表,這些命令將在遠端計算機上執行。當然,您可以呼叫遠端計算機上的指令碼。遠端指令碼可以儲存您想要執行的所有命令和例程。
我們的script-heredoc-8.sh要做的就是更新遠端計算機上的連線日誌。使用者帳戶和時間和日期戳被記錄到一個文字檔案中。
#!/bin/bash ssh -T [email protected] << _remote_commands # do some work in here # update connection log echo $USER "-" $(date) >> /home/dave/conn_log/script.log _remote_commands當我們執行命令時,系統會提示我們輸入遠端計算機上帳戶的密碼。
./heredoc-8.sh將顯示有關遠端計算機的一些資訊,並返回到命令提示符。
在遠端計算機上,我們可以使用cat檢查連線日誌:
cat conn_log/script.log為我們列出了每個連線。
相關:如何從Linux Shell建立和安裝SSH金鑰
這裡的文件很奇怪,但功能強大,尤其是用於向遠端計算機發送命令時。使用rsync編寫備份例程很簡單。然後,指令碼可以連線到遠端計算機,檢查剩餘的儲存空間,並在空間不足時傳送警報電子郵件。
相關:如何備份Linux系統
... 本課程將帶您瞭解Linux的“如何”和“為什麼”,並展示各種Linux命令的工作方式、它們的真實結構以及記住這些命令的正確方法。 ...
...bash是什麼、不同的模式(互動式和非互動式)以及它是如何產生的基礎知識開始,這個站點提供了一個全面的背景知識來幫助您理解命令列的機制。 ...
... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...
...更多的特性。瞭解更多關於Bash-on-Windows的資訊,從您應該如何以及為什麼安裝它,到您可能不知道的隱藏特性。 ...
... 如何在windows10上安裝linux bash shell ...
... 第一行告訴執行這個程式的人如何執行它(即使用bash直譯器)。第二個命令與您在命令列中輸入的任何其他命令一樣。將該檔案另存為hello_世界.sh,然後: ...
...改其目錄,您可以控制他們可以訪問哪些命令。下面介紹如何在Linux上設定受限shell。 受限炮彈 受限shell不是另一個shell。這是標準外殼的另一種模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下啟動。在本文中,我們將...
Bash不是唯一的Linux shell。很容易嘗試其他的shell,比如非常流行的Zsh。找到一個您喜歡的shell後,使用chsh命令將其設定為預設shell。我們會教你怎麼做。 為什麼貝殼很重要 shell位於您和作業系統之間。它在終端視窗內提供環境...