
インストールされていないchroot/dev
刑務所があります/proc
。ここでプロセスを交換しようとすると、これが発生します。
bash-4.4# cat <(ls)
cat: open /dev/fd/63: No such file or directory
手動で作成し、すべてのユーザーに十分な権限があることを確認しようとしましたが、/dev/fd
役に立ちませんでした。
外部システムに何もインストールせずにこれを行う方法はありますか?
答え1
Linuxでは、への/dev/fd
シンボリックリンクです/proc/self/fd
。ここでは、/proc/self
呼び出しプロセスのプロセスディレクトリへのシンボリックリンクです。/proc/$pid/fd
その後、開かれたファイルハンドルへのマジックリンクが含まれます。 Bashはこれを使用して、物理ファイルシステムに何も残さずにファイル名でアクセスできるパイプを作成します。
したがって、シンボリックリンクをインストールして/proc
作成する必要があります。/dev/fd
または、次のように、Bashがファイルシステムで名前付きパイプを使用できるようにすることを確認できます。手動、オプションでなければなりません。
/dev/fd
プロセス置換は、名前付きパイプ(FIFO)または名前付きファイルを開く方法をサポートするシステムでサポートされています。
しかし、この場合は再コンパイルが必要なようです。スクリプトは利用可能かどうかをconfigure
自動的に検出します/dev/fd
が、で無効にしてconfig.h
行を削除できます。
#define HAVE_DEV_FD 1
#undef HAVE_DEV_FD
(または確実にするためにaに変更してください。そして私が犯した間違いを犯さないでください。a1
に変更しても0
機能しません。)
この設定を使用すると取得できます
$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay
ただし、ls
別のコマンドを使用してこれを実行して実際にパイプを読み取らないと、パイプとシェルの両方のプロセスが残ります。