幹部

2012-03-05 5 views
3

ここでは私のシェルスクリプトです:幹部

#!/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に変更すると、大丈夫です! http://www.gnu.org/software/bash/manual/bashref.html#RedirectionsでGNUのbashのマニュアルから

+0

/bin/shを変更、より使いbashのようなフル機能のシェルを使用したい場合は? - あなたは何を期待していますか? – John3136

+0

@ John3136: 'exec'組み込み関数は入力と出力をファイル記述子にリダイレクトするためのメカニズムを提供します。 –

+0

アダム、私は知っている - 私はそれを使用する方法を知っている;-)私はちょうど彼らがやろうとしていたことについては、OPが少し明確にされている可能性があると思う。 – John3136

答えて

0

:彼らは、ファイルと競合する可能性として9より大きいファイル記述子を使用して

リダイレクトは、注意して使用する必要があり、シェルが内部で使用ディスクリプタ。

  • 0 = stdin、端末
  • 1 = stdoutから通常の入力端子に通常出力:一般に


は、最初の3つの記述子は、システムによって割り当てられています

  • 2 = stderr
  • 、また、通常、端末への出力が、彼らは誤ってパイプを下に送信されませんので、エラーメッセージを禁じます。

    あなたは高い数値を自由に使用できます。あなたはおそらくdashまたは他の最小限のシェルインタプリタにリンク/bin/shでスクリプトを実行しているので、

    +0

    :それは紛争のためだと思いますか?私は同じ考え方を共有していますが、私はそのような争いのふりをする方法を教えてくれるでしょうか? –

    1

    です。 XCU 2.7リダイレクトとは:

    オープンファイルは、ゼロから始まる10進数で表されます。可能な限り最大値の は実装定義です。ただし、すべての 実装は、アプリケーションを使用するために少なくとも0〜9をサポートします。

    したがって、これらの実装のいくつかは、最大9枚のFDをサポートしています。

    あなたがexecししようとしている何/bin/bash

    関連する問題