2012-03-05 56 views
3

這裏是我的shell腳本:EXEC沒有發現(因爲文件描述符)

#!/bin/sh 
exec 100>&1 
exec 1>hello.txt 
echo "hello exec" 
echo "hello world" 
exec 1>&100 100>&- 

但是當我運行它時,系統會提示:

​​

當我使用命令lsof檢查它的文件描述符的信息,它提示說:

lsof -p 31931 -d 100 
COMMAND  PID USER FD TYPE  DEVICE SIZE/OFF NODE NAME 
dbus-daem 1230 kaiwii 100u unix 0x00000000  0t0 3753938 socket 
bash  31931 kaiwii cwd DIR  8,7  4096 6316395 /home/kaiwii/test 
bash  31931 kaiwii rtd DIR  8,7  4096  2/
bash  31931 kaiwii txt REG  8,7 822420 8208388 /bin/bash 
bash  31931 kaiwii mem REG  8,7 1434180 1688385 /lib/i386-linux-gnu/libc-2.13.so 
bash  31931 kaiwii mem REG  8,7 38500 1688435 /lib/i386-linux-gnu/libnss_nis-2.13.so 
bash  31931 kaiwii mem REG  8,7 79672 1688425 /lib/i386-linux-gnu/libnsl-2.13.so 
bash  31931 kaiwii mem REG  8,7 26400 1688427 /lib/i386-linux-gnu/libnss_compat-2.13.so 
bash  31931 kaiwii mem REG  8,7 117960 1688372 /lib/i386-linux-gnu/ld-2.13.so 
bash  31931 kaiwii mem REG  8,7  9736 1688395 /lib/i386-linux-gnu/libdl-2.13.so 
bash  31931 kaiwii mem REG  8,7 223468 1687611 /lib/libncurses.so.5.7 
bash  31931 kaiwii mem REG  8,7 42580 1688431 /lib/i386-linux-gnu/libnss_files-2.13.so 
bash  31931 kaiwii mem REG  8,7 123384 5685786 /usr/share/locale-langpack/zh_CN/LC_MESSAGES/bash.mo 
bash  31931 kaiwii mem REG  8,7 8322432 319489 /usr/lib/locale/locale-archive 
bash  31931 kaiwii 0r CHR  136,0  0t0  3 /dev/pts/0 
bash  31931 kaiwii 1u CHR  136,0  0t0  3 /dev/pts/0 
bash  31931 kaiwii 2u CHR  136,0  0t0  3 /dev/pts/0 
bash  31931 kaiwii 255u CHR  136,0  0t0  3 /dev/pts/0 

對於緣故,我不熟悉的命令exec尤其是關於如何修改文件描述符,我不知道發生了什麼!順便說一下,當我將文件描述符100更改爲8時,它運行正常!

+0

什麼是你想給exec? - 你在期待什麼? – John3136 2012-03-05 03:43:15

+0

@ John3136:'exec'內置提供了一種將輸入和輸出重定向到文件描述符的機制。 – 2012-03-05 03:48:05

+0

亞當,我知道 - 我甚至知道如何使用它;-)我只是覺得OP可能對他們正在嘗試做的事更清楚一些。 – John3136 2012-03-05 03:53:21

回答

0

從GNU bash的手冊在http://www.gnu.org/software/bash/manual/bashref.html#Redirections:使用文件

重定向描述符大於9應小心使用,因爲它們可能與文件發生衝突的描述符殼內部使用。

  • 0 = stdin,通常是從一個終端
  • 1 = stdout輸入,通常輸出到終端:


一般來說,只有所述第一3個描述符由系統分配

  • 2 = stderr,通常也輸出到一個終端,但保留給錯誤消息,所以他們不會意外地發送管道。
  • 您可以自由使用更高的數字。

    +0

    :所以你的意思是因爲衝突?我分享你的同一個想法。但是,你會告訴我如何假裝這樣的衝突,我的意思是,如何檢查衝突?thx – 2012-03-05 06:37:23

    1

    這是因爲你正在運行腳本/bin/sh這可能鏈接到dash或其他最小的shell解釋器。 XCU 2.7重定向說:

    打開的文件由從零開始的十進制數表示。 最大的可能值是實現定義的;然而,所有 實現應支持至少0至9,包括 應用程序使用。

    因此,其中一些實現支持最​​大9 fd。

    如果你想使用更多,使用全功能的殼像bash,改變/bin/sh/bin/bash