如何将数据通过管道传输到交互式 bash 脚本并将输出通过管道传输到另一个命令?

问题描述 投票:0回答:1

我想将数据通过管道传输到交互式命令中,并将交互式命令的输出接收为另一个命令的输入。

例如,我希望能够执行以下操作:

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

并且输出为:

你好赞福德

这是我对此的初步破解,但我遗漏了一些东西;-) 我实际上希望 hello.sh 从列表中进行选择。

你好.sh

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

再见.sh

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

编辑:通过“从列表中选择”,我想我是在暗示我的真实用例,即从

stdout
中获取任何内容,并让我选择一个选项,然后将其传递给
stdin
其他的东西......例如:

ls /tmp | select_from_list | xargs cat

允许我列出

/tmp
中的文件,以交互方式选择一个,然后
cat
文件的内容。

所以我的“select_from_list”脚本实际上看起来像这样:

#!/bin/bash
prompt="Please select an option:"
options=( $* )
if [ -z "$1" ]
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
bash zsh
1个回答
3
投票

感谢 4ae1e1,我知道了如何做我想做的事 - 具体来说,如何让我的

select_from_list
例程发挥作用:

所以现在我可以做这样的事情:

ls /tmp/ | select_from_list | xargs cat

/tmp
选择一个文件并对其进行管理。

从列表中选择

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

options=()

if [ -z "$1" ]
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 "$@" 
  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
© www.soinside.com 2019 - 2024. All rights reserved.