[英]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
。 換行符與enter
或return
鍵生成的東西相同。
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.