端末を生成し、標準出力を元のプロセスにリダイレクトします。

端末を生成し、標準出力を元のプロセスにリダイレクトします。

新しい端末を作成し、いくつかのコマンドを実行し、その出力を元のプロセスの標準入力にパイプしようとします。私がしようとしている1つは、次のbash文です。

$ xterm -e sh -c "echo -e 'foo\nbar' > /proc/$$/fd/1" | grep foo

その中に新しいxtermウィンドウを作成して印刷したfoo\nbar後、このコマンドを実行するシェルの標準入力にリダイレクトしたいと思います。動作していることを確認するためにgrep

上記のコードは単に印刷ではなくstdoutでfoo印刷されますが、その理由はよくわかりません。この問題をどのように解決できますか?barfoo

編集:これの実際の実装はfzfを使用するファイルセレクタです。

#!/usr/bin/env bash

function open() {
  # takes a bunch of file names (either passed as arguments or from stdin) and
  # opens them
  true
}

# This is what I have now
alacritty \
   -e sh -c 'fzf -m --prompt="Open> " --border=horizontal --print0 \
              | (nohup xargs -0 bash -c '\''open "$@"'\'' _ &>/dev/null &)'

# This is what I'm trying to do
# alacritty \
#  -e sh -c "fzf -m --prompt='Open> ' --border=horizontal > /proc/$$/fd/1" \
#  | open

答え1

パーティーに少し遅れていますが、名前付きパイプ(FIFO)を使用する代わりに、fzfはキーバインディングに応答して外部コマンドを実行する機能も提供します。これがfzfをファイルセレクタとして使用する方法です。xdg - 開く、これはほとんどのLinuxディストリビューションで動作します):

fzf --bind "enter:execute(setsid xdg-open {} 2>/dev/null &)+abort"

ターミナルを実行して、上記の操作のいくつかのバリエーションを実行できます(たとえば、グローバルキーボードショートカットから)。私のドットファイルにスクリプトがありますファイルを開くそして一つはGUIプログラムの起動gtkを試してみてください。何ヶ月も何の問題もなく使用してきましたが、gtk-launchは何らかの理由で再起動した後、常に最初の呼び出しを無視します。

とにかく、私はこれがfifoやファイル記述子を扱うよりも簡単であることがわかりました。

答え2

#!/bin/sh
exec alacritty -e /bin/sh -c \
  "exec fzf \"\$@\" < /proc/$$/fd/0 > /proc/$$/fd/1" \
  -- "$@" 2>/dev/null

関連情報