5

標準出力でユーザーに通信したいbashスクリプトがありますが、ファイル記述子を介してサブプロセスにコマンドを送信します-次のようになります:

# ...
# ...

echo "Hello user, behold a cleared gnuplot window"

# pass the string "clear" to gnuplot via file descriptor 3
echo "clear" >&3  

したがって、最初に次のようにサブプロセスを開始することで、「これを設定」できると思いました。

#!/bin/bash

# Initiate(?) file descriptor 3, and let it direct to a newly 
# started gnuplot process:
exec >3 >( gnuplot )

しかし、それはエラーを引き起こします:

/dev/fd/63: Permission denied

これは予想されることですか?

何が起こっているのかわかりません。(私は何か間違ったことをしていますか?私のシステムに特別なセキュリティ設定があり、私がやろうとしていることを許可していない可能性がありますか?(Ubuntu Linux 12.10を実行しています。))

「回避策」 -以下は私がやろうとしていることと同等のようで、エラーなしで動作します。

#!/bin/bash

# open fd 3 and direct to where fd 1 directs to, i.e. std-out 
exec 3>&1 

# let fd 1 direct to a newly opened gnuplot process
exec 1> >( gnuplot ) 

# fd 1 now directs to the gnuplot process, and fd 3 directs to std-out.
# I would like it the other way around. So we'll just swap fd 1 and 3 
# (using an extra file descriptor, fd 4, as an intermediary)

exec 4>&1 # let fd 4 direct to wherever fd 1 directs to (the gnuplot process)
exec 1>&3 # let fd 1 direct to std-out 
exec 3>&4 # let fd 3 direct to the gnuplot process
exec 4>&- # close fd 4

または、ワンライナーとして:

#!/bin/bash
exec 3>&1 1> >( gnuplot ) 4>&1 1>&3 3>&4 4>&- 

なぜこれが機能しているのに、初期バージョンが機能していないのですか?

どんな助けでも大歓迎です。

$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
[...]
4

2 に答える 2

1

タイプミスがあります。exec 3> >( gnuplot )の代わりに使用しexec >3 >( gnuplot )ます。

ところで、はい、それは予想されます。exec >3 >( gnuplot )stdout を 3 という名前のファイルにリダイレクトし、>( gnuplot )(/dev/fd/63 に変換される) プログラムとして実行しようとします。

于 2013-01-08T01:04:24.107 に答える
1

私は得ていました:

/dev/fd/63: 権限が拒否されました

hereに記載されているように、sudo の使用によるプロセス置換を使用します。

だからそうしないでください:

$ sudo ruby <(echo "puts 'foo'")
ruby: Bad file descriptor -- /dev/fd/63 (LoadError)
于 2013-03-29T18:00:02.870 に答える