Bash

將帶有“read”的腳本傳遞給 bash

  • October 19, 2018

我需要通過管道來執行一個腳本(而不是直接用 bash 執行它)bashwget

$ wget -O - http://example.com/my-script.sh | bash

它不起作用,因為我的腳本中有read語句。由於某種原因,這些在管道到 bash 時不起作用:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

讀取命令並沒有按應有的方式提示input:和詢問值,而是被bash.

有誰知道我如何通過管道傳輸腳本readto bash

read從標準輸入讀取。但是腳本已經採用了 bash 程序的標準輸入。根據外殼程序,要麼read不會讀取任何內容,因為外殼程序已經讀取並解析了整個腳本,要麼read會消耗腳本中不可預測的行。

簡單的解決方案:

bash -c "$(wget -O - http://example.com/my-script.sh)"

更複雜的解決方案,更多的是出於教育目的,而不是說明此特定場景的良好解決方案:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

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