如何以非交互方式將參數傳遞給交互式腳本

文章目錄

    • 問題
    • 回答
      • 1. 使用 Here Document
      • 2. 使用 echo 管道傳遞
      • 3. 使用文件描述符
      • 4. 使用 expect 工具
    • 參考

問題

我有一個 Bash 腳本,它使用 read 命令以交互方式讀取命令參數,例如 yes/no 選項。是否有一種方法可以在非交互式腳本中調用這個腳本,并將默認選項值作為參數傳遞?

我不止需要向交互式腳本傳遞一個選項。

回答

如果你的腳本是通過 read 命令在交互式環境下讀取命令參數,并且你希望在非交互式腳本中傳遞參數,那么你可以使用以下幾種方法來模擬交互式輸入:

1. 使用 Here Document

Here Document 可以用來傳遞多行輸入到腳本:

bash your-interactive-script.sh <<EOF
answer1
answer2
answer3
EOF

其中 answer1, answer2, 和 answer3 是對應于腳本中每一個 read 提示的輸入。

2. 使用 echo 管道傳遞

可以通過 echo 命令和管道來傳遞輸入值:

echo -e "answer1\nanswer2\nanswer3" | bash your-interactive-script.sh

在這里,-e 會啟用對反斜杠轉義的解釋,\n 用于模仿輸入鍵(ENTER)的效果。

3. 使用文件描述符

還可以使用文件描述符來模擬交互式輸入:

exec 3< <(echo -e "answer1\nanswer2\nanswer3")
./your-interactive-script.sh <&3
exec 3<&-

在這里,打開了一個文件描述符 3,并將其與提供輸入的進程替換關聯起來。你的腳本從該文件描述符中讀取內容,而不是從標準輸入(stdin)中讀取。
最后使用命令 exec 3<&- 關閉這個文件描述符,這樣可以防止資源泄露,并確保這個文件描述符可以在腳本或程序的后續部分重新使用。

在 Bash 腳本中,exec 命令用于執行命令并在當前 shell 環境中改變 shell 的行為。文件描述符是用于訪問文件和流的小的、非負整數。常見的文件描述符包括 0(標準輸入 stdin)、1(標準輸出 stdout)和 2(標準錯誤 stderr)。

下面是這條命令的一部分解釋:

  • exec 3< ...:這個命令會打開一個文件或者創建一個輸入流,并將它分配給文件描述符 3。當你讀取文件描述符 3 時,你實際上會從這個文件或流中讀取數據。

  • <&-:這是用來關閉文件描述符的語法。具體到 exec 3<&-,這條命令會關閉之前分配給文件描述符 3 的文件或流。

總的來說,exec 3< <(command) 會創建一個新的文件描述符 3,并從 command 命令產生的輸出中讀取數據。當你完成使用這個文件描述符后,使用 exec 3<&- 就可以關閉這個文件描述符,這樣可以防止資源泄露,并確保這個文件描述符可以在腳本或程序的后續部分重新使用。

測試截圖:

4. 使用 expect 工具

對于需要等待特定提示或需要更多控制的復雜場景,可以使用 expect 工具:

#!/usr/bin/expect -fspawn ./your-interactive-script.sh
expect "第一次提示"
send "answer1\r"
expect "第二次提示"
send "answer2\r"
expect "第三次提示"
send "answer3\r"
interact

你可以用以下命令來安裝 expect

sudo apt-get install expect  # Debian/Ubuntu 系統

或者

sudo yum install expect      # CentOS/RHEL 系統

根據你的腳本輸入場景的復雜程度來選擇最合適的方法。如果只是一系列簡單的輸入,方法 1 和 2 可能是最簡便的。但是,如果腳本需要更復雜的交互,expect 可能更合適。

#!/usr/bin/expect -fspawn ./interactive-script.sh
expect "name"
send "Bob\r"
expect "age"
send "17\r"
interact

測試截圖:

總之,根據你的腳本輸入場景的復雜程度來選擇最合適的方法。如果只是一系列簡單的輸入,方法 1 和 2 是最簡便的。但是,如果腳本需要更復雜的交互,expect 更合適。


參考

  • stackoverflow question 14392525
  • Here-Documents
  • man expect

相關閱讀:

  • sh和Bash的區別
  • 2>&1是什么意思
  • 如何使用bash腳本并行運行多個程序
  • 為什么要使用xargs命令
  • 在shell程序里如何從文件中獲取第n行
  • 如何用命令行將文本每兩行合并為一行?

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

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

相關文章

vue用vite配置代理解決跨域問題(target、rewrite和changeOrigin的使用場景)

Vite的target、rewrite和changeOrigin的使用場景 1. target 使用場景&#xff1a;target 屬性在 Vite 的 vite.config.ts 或 vite.config.js 文件的 server.proxy 配置中指定&#xff0c;用于設置代理服務器應該將請求轉發到的目標地址。這通常是一個后端服務的API接口地址。…

Chrome 源碼閱讀:跟蹤一個鼠標事件的流程

我們通過在關鍵節點打斷點的方式&#xff0c;去分析一個鼠標事件的流程。 我們知道chromium是多進程模型&#xff0c;那么&#xff0c;我們可以推測&#xff1a;一個鼠標消息先從主進程產生&#xff0c;再通過跨進程通信發送給渲染進程&#xff0c;渲染進程再發送給WebFrame&a…

【FAS】《CN103106397B》

原文 CN103106397B-基于亮瞳效應的人臉活體檢測方法-授權-2013.01.19 華南理工大學 方法 / 點評 核心方法用的是傳統的形態學和模板匹配&#xff0c;亮點是雙紅外發射器做差分 差分&#xff1a;所述FPGA芯片控制兩組紅外光源&#xff08;一近一遠&#xff09;交替亮滅&…

[力扣題解] 700. 二叉搜索樹中的搜索

題目&#xff1a;700. 二叉搜索樹中的搜索 思路 觀察法 二叉搜索樹的搜索操作&#xff0c;比較根節點的數值&#xff0c; 如果等于&#xff1a;找到了&#xff1b;大于根節點&#xff1a;在右子樹&#xff0c;往右走&#xff1b;小于根節點&#xff1a;在左子樹&#xff0c;…

【Java基礎】線程方法

start()&#xff1a;啟動線程&#xff0c;使線程進入就緒狀態。 run()&#xff1a;線程執行的代碼邏輯&#xff0c;需要重寫該方法。 停止線程 void interrupt() 中斷線程&#xff0c;讓它重新去爭搶cpu 如果目標線程長時間等待&#xff0c;則應該使用interrupt方法來中斷等待…

RDMA (2)

iWARP(RDMA)怎么工作的 招式1:bypass內核 非iWARP時,當應用向網絡適配器發出讀或者寫命令時,命令穿過用戶空間以及內核空間,因此需要在用戶空間和內核空間間進行切換。 iWARP使用RDMA,讓應用直接將命令送達到網絡適配器。這規避了對內核的調用,減少了開銷和延遲。 招式2…

【Kubernetes】三證集齊 Kubernetes實現資源超賣(附鏡像包)

目錄 插敘前言一、思考和原理二、實現步驟0. 資料包1. TLS證書簽發2. 使用 certmanager 生成簽發證書3. 獲取secret的內容 并替換CA_BUNDLE4.部署svc deploy 三、測試驗證1. 觀察pod情況2. 給node 打上不需要超售的標簽【可以讓master節點資源不超賣】3. 資源實現超賣4. 刪除還…

[補題記錄]Leetcode 209.長度最小的子數組

傳送門&#xff1a;長度最小的子數組 Problem/題意 給定一個整數數組和一個整數 target&#xff0c;要求算出數組中最小長度的連續子數組&#xff0c;數組元素的和大于等于 target。 Thought/思路 題目要求維護最小的長度&#xff0c;因此我們希望&#xff1a;當條件不滿足…

IP域名關系的研究與系統設計(學習某知名測繪系統)

IP域名關系庫管理包括域名庫檢索和whois庫檢索&#xff0c;詳情如下。 域名庫檢索支持以下5項功能&#xff1a; 1.通過過濾器檢索 篩選條件包含IP地址、口令、工具名稱、可利用的漏洞編號、創建時間&#xff1b; 2.通過關鍵字檢索 在查詢框中輸入域名庫名稱的部分關鍵詞&a…

計算機組成結構—IO系統概述

目錄 一、I/O 系統的發展 1. 早期階段 2. 接口模塊和 DMA 階段 3. 通道結構階段 4. 處理機階段 二、I/O 系統的組成 1. I/O 軟件 2. I/O 硬件 三、I/O 設備 1. I/O 設備分類 2. I/O 設備的組成 在計算機中&#xff0c;除 CPU 和主存兩大模塊之外&#xff0c;第三個重…

Apple開發者應用商店(AppStore)描述文件及ADHOC描述文件生成

創建AD HOC描述文件 1.選中Profiles,然后點擊加號創建 2.創建已注冊設備可安裝描述文件 3.選擇要注冊的id 4.選擇證書 5.選擇設備 6.輸入文件名,點擊生成 7.生成成功,點擊下載

TCP為什么握手是三次,而揮手是四次

TCP&#xff08;傳輸控制協議&#xff09;使用三次握手&#xff08;3WHS&#xff09;來建立一個可靠的連接&#xff0c;并使用四次揮手&#xff08;4WHS&#xff09;來終止連接。以下是每個步驟的詳細解釋&#xff1a; 三次握手&#xff08;3WHS&#xff09;建立連接&#xff…

solidity的modifier修飾符

solidity的modifier修飾符 什么是modifier修飾符 修飾器&#xff08;modifier&#xff09;是solidity特有的語法&#xff0c;類似于面向對象編程中的decorator&#xff0c;聲明函數擁有的特性&#xff0c;并減少代碼冗余。 Solidity 中關鍵字 modifier 用于聲明一個函數修改…

electron調用dll時應用程序閃退

electron調用dll時&#xff0c;直接閃退&#xff0c;且用如下方式監聽無任何輸出&#xff1a; window-all-closed 或 will-quit 此時需要檢查傳給dll的參數及參數類型是否正確&#xff0c;特別是使用ffi-napi時調用dll&#xff0c;使用 ref-napi定義類型&#xff0c;經常容易…

go 源碼學習1:scanner學習

scanner所在包是scanner.go type scanner struct {// 步驟是一個函數&#xff0c;用于執行下一個轉換。// 也嘗試使用整數常量和單個函數以及帶有開關的函數&#xff0c;// 但是直接使用函數在64位Mac Mini上快了10%&#xff0c;// 而且閱讀起來更直觀。step func(*scanner, …

域名區分英文大小寫嗎?

在互聯網的早期&#xff0c;域名系統(DNS)的設計并沒有考慮大小寫敏感性。然而&#xff0c;隨著技術的發展和用戶需求的多樣化&#xff0c;域名的大小寫問題逐漸引起了人們的關注。本文將探討域名是否區分英文大小寫&#xff0c;以及這一特性對網站運營和用戶體驗的影響。 一、…

【Android】Git Patch生成的文件怎么合并到項目里面和遇到的一些問題

前言 Git patch是一種描述文件&#xff0c;它記錄了一系列的文件變更&#xff08;如新增、修改、刪除&#xff09;以及變更的具體內容。通過使用patch文件&#xff0c;可以將這些變更應用到其他代碼庫中&#xff0c;從而實現代碼的同步和更新。 Git 提供了兩種補丁方案&#…

Java使用OpenCV計算兩張圖片相似度

業務&#xff1a;找出兩個表的重復的圖片。 圖片在表里存的是二進制值&#xff0c;存在大量由于一些特殊情況例如掃描有差異&#xff0c;導致圖片存的二進制值不同&#xff0c;但圖片其實是一樣來的。 所以找出兩個表重復相同的圖片&#xff0c;不可能只是單純的比較二進制值…

flask招聘數據分析及展示平臺-計算機畢業設計源碼39292

目 錄 摘要 1 緒論 1.1研究意義 1.2國內外研究進展 1.3flask框架介紹 2 1.4論文結構與章節安排 3 2 招聘數據分析及展示平臺分析 4 2.1 可行性分析 4 2.2 系統流程分析 4 2.2.1數據增加流程 5 2.3.2數據修改流程 5 2.3.3數據刪除流程 5 2.3 系統功能分析 5 2.3.1 功能性分…

亞馬遜新品如何快速吸引流量?自養號測評助賣家一臂之力

在亞馬遜平臺上每天都會有大量的新品推出&#xff0c;而這些新品中有部分可能并沒有什么流量和訂單&#xff0c;有些可能上架后立馬就能獲得流量了&#xff0c;那么亞馬遜上新品一般幾天出單&#xff1f; 一、亞馬遜上新品一般幾天出單&#xff1f; 亞馬遜上新品出單的時間因…