我希望将数据导入到一个交互式命令中,并将交互式命令的输出作为另一个命令的输入接收。
例如,我想要像下面这样做:
echo "Zaphod" | hello.sh | goodbye.sh
希望输出结果如下:
BYE HELLO Zaphod
以下是我的初步尝试,但是我还缺少一些内容;-) 我实际上想让hello.sh从一系列事物中进行选择。
hello.sh
echo Please supply your name
read NAME
echo "HELLO $NAME"
goodbye.sh
MSG=$*
if [ -z "$1" ]
then
MSG=$(cat /dev/stdin)
fi
echo "BYE $MSG"
编辑:通过“从事物列表中选择”,我想我暗示了我的真实用例,即从stdout中获取任何内容,并让我选择一个选项,然后将其传递给其他东西的stdin…例如:
ls /tmp | select_from_list | xargs cat
将允许我列出/tmp/中的文件,交互式地选择一个文件,然后查看文件的内容。
因此,我的“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
(ls /tmp/ && cat) | select_from_list
。我在bash
和zsh
中都尝试过。 - Brad Parkshello.sh
的标准输入已连接到管道,而不是 tty。请从/dev/tty
读取,或参见 https://dev59.com/FkvSa4cB1Zd3GeqPbhh7#1992967 了解如何耗尽 stdin 然后重新打开以进行读取。 - 4ae1e1