Bash在管道的 bash 腳本中使用
在管道的 bash 腳本中使用read
Bash 可以從管道執行腳本。一個最小的例子是:
> echo "echo hello world" | bash hello world
如果您想執行從
curl
或下載的腳本,這很方便wget
。但顯然,您不能
read
在這種腳本執行中使用。例如,#!/bin/bash echo 'input: ' read HELLO echo hello: $HELLO
如果您只是從 bash 腳本文件執行上述腳本,您將可以輸入
$HELLO
. 並將echo hello: $HELLO
列印結果。如果您以我們之前討論的方式提供腳本:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash input: hello:
你根本不會得到互動。並且
$HELLO
仍然是空的。我也嘗試-i
在 bash 中添加選項,但沒有成功。有什麼方法可以
read
在流水線腳本中使用嗎?如何?或者,如果我們不能,為什麼?
read
將通過標準輸入(它將從中讀取內容)和標準錯誤(它將列印其-p
提示,如果有的話)與使用者“互動”。如果 stdin 是script,
read
將從中獲取它的內容,導致它跳過一行:$ echo ' read foo what the -)(*$;? echo "$foo" ' | bash what the -)(*$;?
這不是一個好的做法,並且不適用於所有 shell。另請注意,當通過標準輸入管道腳本時,
bash
必須逐字節讀取它們。在您的範例中,您的整個腳本是一行,因此
read
內置函式只會獲取 EOF 而不會設置任何變數。如果您想
read
始終從控制 tty 讀取,則顯式重定向它:read var </dev/tty
這也應該謹慎使用。如果他們必須使用
expect(1)
來檢測您的腳本,沒有人會感激您。