Comment transférer des données vers un script de bash interactif et des sorties de pipe vers une autre commande?

j'aimerais tuyau de données dans une commande interactive, et le résultat de la commande interactive d'être reçu en entrée d'une autre commande.

par exemple, j'aimerais pouvoir faire quelque chose comme:

echo "Zaphod" | hello.sh | goodbye.sh

et avoir pour sortie:

BYE HELLO Zaphod

voici ma fissure initiale à ce, mais je manque quelque chose; -) je voudrais en fait comme le hello.sh choisir dans une liste de choses.

hello.sh

echo Please supply your name
read NAME
echo "HELLO $NAME"

goodbye.sh

MSG=$*
if [ -z "" ]
then
  MSG=$(cat /dev/stdin)
fi
echo "BYE $MSG"

EDIT: by" select from a list of things", je suppose que je sous-entends mon cas d'utilisation réelle, qui est de prendre n'importe quoi de stdout, et de me laisser choisir une option, et passer à la stdin de quelque chose d'autre... Par exemple:

ls /tmp | select_from_list | xargs cat

me permettrait de lister les fichiers dans /tmp/, d'en choisir un de façon interactive, puis de repérer le contenu du fichier.

donc mon script "select_from_list" ressemble à ceci:

#!/bin/bash
prompt="Please select an option:"
options=( $* )
if [ -z "" ]
then
  options=$(cat /dev/stdin)
fi

PS3="$prompt "
select opt in "${options[@]}" "Quit" ; do 
    if (( REPLY == 1 + ${#options[@]} )) ; then
        exit

    elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
        break

    else
        echo "Invalid option. Try another one."
    fi
done    
echo $opt
3
demandé sur Brad Parks 2015-12-11 18:16:36
la source

1 ответов

merci à 4ae1e1 , j'ai trouvé comment faire ce que je veux-spécifiquement, comment obtenir mon select_from_list routine à travailler:

donc maintenant je peux faire quelque chose comme ça:

ls /tmp/ | select_from_list | xargs cat

pour choisir un fichier de /tmp et le cat il.

select_from_list

#!/bin/bash
prompt="Please select an item:"

options=()

if [ -z "" ]
then
  # Get options from PIPE
  input=$(cat /dev/stdin)
  while read -r line; do
    options+=("$line")
  done <<< "$input"
else
  # Get options from command line
  for var in "[email protected]" 
  do
    options+=("$var") 
  done
fi

# Close stdin
0<&-
# open /dev/tty as stdin
exec 0</dev/tty

PS3="$prompt "
select opt in "${options[@]}" "Quit" ; do 
    if (( REPLY == 1 + ${#options[@]} )) ; then
        exit

    elif (( REPLY > 0 && REPLY <= ${#options[@]} )) ; then
        break

    else
        echo "Invalid option. Try another one."
    fi
done    
echo $opt
1
répondu Brad Parks 2017-05-23 15:15:45
la source

Autres questions sur