你問「它是如何工作的」。 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。你爲什麼要這麼做?
謝謝你的回答。在我問之後,我碰到過[-t 0],但我不知道fd表。 我想要這個,因爲qrsh似乎不適合重定向stdin,但是如果我在給予qrsh的命令中進行重定向,那麼一切都很好。 'qrsh「cmd」 esmit 2013-03-13 05:34:34
注意自我:我幾乎提出了一個新問題,爲什麼'file'指向一個帶有'(deleted) '附加,但是在這個週末,這個問題似乎已經解決了。 – esmit 2016-04-25 18:00:44