簡體   English   中英

動態提供默認輸入以從Shell腳本調用腳本

[英]dynamically providing default input to calling script from a shell script

我有一個shell腳本main_script.sh,它將調用3個其他腳本(a1.sh,a2.sh,a3.sh)。 現在在執行a1.sh/a2.sh/a3.sh時,我需要用Y / N來回答一些冗長的內容。

我知道每個a1.sh/a2.sh/a3.sh都需要2個Y / N。

如何實現main_script.sh,因此執行時不必回答Y / N請求?

這取決於腳本的編寫方式。 您提到每個腳本需要兩個Y 我假設每個Y后面都需要一個回車鍵(換行符)。 在這種情況下,可以像對main_script.sh使用以下main_script.sh一樣簡單:

#!/bin/bash
echo $'Y\nY\n' | bash a1.sh
echo $'Y\nY\n' | bash a2.sh
echo $'Y\nY\n' | bash a3.sh

在上面, echo命令將兩個Y和換行符發送到每個腳本。 您可以根據需要進行調整。

一些腳本會堅持要求交互式輸入來自終端,而不是stdin。 這樣的腳本更難但並非不可能。 對於他們來說,使用expect / pexpect

更多細節

讓我們更詳細地看一下其中一個命令:

echo $'Y\nY\n' | bash a1.sh

| 是管道符號。 它將echo命令外的標准連接到a1.sh命令的標准輸入。 如果a1.sh是可以接受的,這可以使我們預先回答a1.sh提出的所有問題。

在這種情況下, echo命令的輸出為$'Y\\nY\\n' 這是bash shell語法,表示Y ,后跟換行字符,用\\n表示,然后是Y ,然后是換行符\\n 換行符與enterreturn鍵生成的東西相同。

使用expect

如果你的腳本不標准輸入接受輸入,則expect可用於自動化與腳本的相互作用。 舉個例子:

#!/bin/sh

expect <<EOF1
spawn a1.sh
expect "?"
send "Y\r"
expect "?"
send "Y\r"
sleep 1
EOF1

expect <<EOF2
spawn a2.sh
expect "?"
send "Y\r"
expect "?"
send "Y\r"
sleep 1
EOF2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM