0

I have a script which i am using as a filter:

#!/usr/bin/env gjs

const { Gio } = imports.gi;

let file = Gio.File.new_for_path(ARGV[0]);
let fileInfo = file.query_info('*', Gio.FileQueryInfoFlags.NONE, null);
let icons = fileInfo.get_icon().get_names();

if (typeof icons[1] === 'undefined') {
    // does not exist
    print(icons[0]);
}
else {
    print(icons[1]);
}

It gives icon when a path is given.

I am calling it like:

#!/usr/bin/env bash

shopt -s lastpipe

coproc get_icon_from_path_stdin

while IFS= read -r line; do

    echo "$line" >&"${COPROC[1]}"
    read -r icon <&"${COPROC[0]}"
    echo -en "$line"
    echo -en "\0icon\x1f${icon}\n"
done < <(cat $HOME/.dotfiles/rofi-bookmarks-list) | rofi -dmenu -i -theme-str 'window {fullscreen:true;}' | read select

if [ ${PIPESTATUS[1]} -eq 0 ]; then
    nemo "$select"
fi

The point is, $HOME/.dotfiles/rofi-list has 10,000+ file path so executing this function this many times is slow. What I want is to execute this function once and then just send file in stdin and get stdout from it.

However, this gives error like

/home/ismail/.dotfiles/.resources/bash-scripts-rofi/rofi-bookmarks: line 21: "${COPROC[1]}": Bad file descriptor
/home/ismail/.dotfiles/.resources/bash-scripts-rofi/rofi-bookmarks: line 22: "${COPROC[0]}": Bad file descriptor

what am i doing wrong here?

Ahmad Ismail
  • 11,636
  • 6
  • 52
  • 87

1 Answers1

2

Bash closes COPROC in subshells. You have to just pick another descriptors.

exec 10>&"${COPROC[1]}"
exec 11<&"${COPROC[0]}"

...
     echo "$line" >&10
     read -r icon <&11
KamilCuk
  • 120,984
  • 8
  • 59
  • 111