2013-03-12 29 views

回答

4

你問「它是如何工作的」。 UNIX進程使用名爲fork的操作創建。這需要當前過程的副本,並以非常有效的方式幾乎完全按照原樣複製它。複製還包括文件描述符表,其中stdin,stdout,stderr,live。

當你做重定向時,shell分叉,然後改變它自己的子文件描述符(fd)表。然後在相同的進程中使用相同的fd表運行新腳本。使用傳統的機制,進程可以檢查的唯一事情是stdin是否連接到終端。在C它使用isatty()和在bash中你可以if [[ -t 0 ]]...(零是stdin的fd)。在Linux中(如果您使用的是Linux),您有一個附加選項,fd表以/proc/$$/fd($$給出當前進程ID)的可讀形式顯示。 ls -l /proc/$$/fd,你會明白我的意思。

那麼,我重定向?

if [[ -t 0 ]] # is stdin a terminal? 
then 
    suffix="" 
else 
    line=$(ls -l /proc/$$/fd/0) 
    file="${line##*-> }" 

    suffix="< $file" 
fi 

echo "cat $suffix" 

在命令行:

/home/user1$ file_redirection.sh < tmp_file 
cat < /home/qa/tmp_file 

BUT。你爲什麼要這麼做?

+0

謝謝你的回答。在我問之後,我碰到過[-t 0],但我不知道fd表。 我想要這個,因爲qrsh似乎不適合重定向stdin,但是如果我在給予qrsh的命令中進行重定向,那麼一切都很好。 'qrsh「cmd」 esmit 2013-03-13 05:34:34

+0

注意自我:我幾乎提出了一個新問題,爲什麼'file'指向一個帶有'(deleted) '附加,但是在這個週末,這個問題似乎已經解決了。 – esmit 2016-04-25 18:00:44

6

不,這是不可能的。命令行上的<在您的腳本運行之前由shell解釋。您需要跳過<才能將其加入腳本。例如:

file_redirection.sh \< tmp_file 

會產生你要找的輸出,但做任何文件重定向。

+0

雖然這回答了我的問題'是否有可能?'(這就是爲什麼我將其標記爲正確的原因),它不能幫助我將重定向的stdin傳遞給子進程。我應該問這是一個單獨的問題還是編輯這個問題? – esmit 2013-03-12 20:06:52

-1

使用此:

file_redirection.sh "< tmp_file"

,並在文件中這樣的:

echo "cat $1"

OR

file_redirection.sh \< tmp_file

,並在文件中這樣的:

echo "cat $*"

+0

您正在改變輸入以獲得所需的輸出,而不是(不可能,因爲它變成了)改變腳本以從給定輸入產生期望的輸出。 – chepner 2013-03-12 19:30:51

相關問題