Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何获得等待用户输入的while循环?_Linux_Bash - Fatal编程技术网

Linux 如何获得等待用户输入的while循环?

Linux 如何获得等待用户输入的while循环?,linux,bash,Linux,Bash,在第一个循环中,它等待用户键入某些内容,而在第二个循环中,它没有 for f in *; do echo $f IFS= read -r opt done find . -maxdepth 1 -type f -name "*" | while read f; do echo $f IFS= read -r opt done 问题 如何让while循环像for循环一样等待用户输入?问题在于循环发生在管道中,因此标准输入被重定向到上一个管道命令的输出。您可以使用exec将正常标

在第一个循环中,它等待用户键入某些内容,而在第二个循环中,它没有

for f in *; do
  echo $f
  IFS= read -r opt
done

find . -maxdepth 1 -type f -name "*" | while read f; do
  echo $f
  IFS= read -r opt
done
问题


如何让while循环像for循环一样等待用户输入?

问题在于循环发生在管道中,因此标准输入被重定向到上一个管道命令的输出。您可以使用
exec
将正常标准输入重定向到不同的文件描述符,并从中读取用户输入:

exec 3<&0
find . -maxdepth 1 -type f -name "*" | while read f; do
  echo $f
  IFS= read -r -u3 opt
  echo $opt
done
exec 3<&-  # Close fd3

exec 3问题在于循环发生在管道中,因此标准输入被重定向到上一个管道命令的输出。您可以使用
exec
将正常标准输入重定向到不同的文件描述符,并从中读取用户输入:

exec 3<&0
find . -maxdepth 1 -type f -name "*" | while read f; do
  echo $f
  IFS= read -r -u3 opt
  echo $opt
done
exec 3<&-  # Close fd3

exec 3最后一次
read
也从stdin(查找的stdout)读取。最后一次
read
也从stdin(查找的stdout)读取。总的来说,这是一种很好的方法,但根据情况,通常需要执行
read
。如果目的是等待“用户键入内容”,则从/dev/tty读取可能是合适的。总体而言,这是一种很好的方法,但根据情况,通常也需要执行
读取
。如果目的是等待“用户键入内容”,那么从/dev/tty读取可能是合适的。