Bash

在管道的 bash 腳本中使用read

  • June 25, 2019

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 是scriptread將從中獲取它的內容,導致它跳過一行:

$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?

這不是一個好的做法,並且不適用於所有 shell。另請注意,當通過標準輸入管道腳本時,bash必須逐字節讀取它們。

在您的範例中,您的整個腳本是一行,因此read內置函式只會獲取 EOF 而不會設置任何變數。

如果您想read始終從控制 tty 讀取,則顯式重定向它:

read var </dev/tty

這也應該謹慎使用。如果他們必須使用expect(1)來檢測您的腳本,沒有人會感激您。

引用自:https://unix.stackexchange.com/questions/526756