2014-10-19 46 views
0

我想要獲得用戶輸入的bash腳本,首先通過wget下載(在下面的代碼中使用cat),然後通過stdin輸入bash。我認爲這將是直接的,但它不起作用。閱讀用戶輸入的腳本傳遞給解釋器

腳本(在一個叫gistfile2.sh文件):

#!/bin/bash 

echo -n "Enter path: " 
read path 
echo $path 

我如何運行它:

[email protected]:/tmp# cat (or wget -qO-) gistfile2.sh | bash 
Enter path: [email protected]:/tmp# 

任何想法?

+0

這將運行很好,如果你做'。/ gistfile2.sh'。它需要輸入並將其回顯到屏幕.... – dramzy 2014-10-19 23:27:18

+0

@RespectMyAuthoritah是的,但我想在Github的要點上託管它,然後只是wget /捲曲它並將其管理到bash命令。 – Jeune 2014-10-19 23:28:20

回答

2

首先,讓我們來看看管道是如何工作的:

foo | bar 

運行bar,酒吧的標準輸入連接到foo的標準輸出。 這意味着bar無法知道它將繼承哪些stdin描述符,而不是管道覆蓋它。此信息丟失,無法恢復。

然而,在實踐中,人們經常可以猜測:如果stderr仍然是TTY句柄,那麼可以打開stdin;如果操作系統提供諸如/dev/tty之類的工具來處理進程的控制tty,那就更好了。


所以:

如果你的標準輸入(FD 0)已經由管道覆蓋,你可以嘗試從/dev/tty閱讀。 這不是任何方式保證工作,並且是依賴於平臺的功能 - 但是如果它不起作用,那麼你會回落在其他hackery上,例如希望stderr沒有被重定向。

/dev/tty閱讀:

read path </dev/tty || { rc=$?; echo "Unable to read from TTY" >&2; exit "$rc"; } 

從標準錯誤讀取(假設它連接到一個讀/寫FD將您的TTY - 一個很大的假設):

read path <&2 || { rc=$?; echo "stderr not attached to a TTY?" >&2; exit "$rc"; } 
+0

試過這個,它的工作原理。儘管如此,仍然試圖圍繞它的包圍。 – Jeune 2014-10-19 23:58:01

+0

如果您有任何具體問題,或者我的解釋沒有任何意義,請告訴我,我會盡力澄清。 – 2014-10-20 00:05:20

+0

我得到你必須從/ dev/tty讀取的部分,因爲管道被覆蓋。流水線被覆蓋時,這意味着什麼? 「酒吧」過程認爲它有一個真正的標準輸入,但事實上它有一個管道?所以當它試圖從它認爲是一個真正的stdin中讀取它時,它實際上是返回別的東西的管道。 – Jeune 2014-10-20 00:11:13