2010-01-18 12 views
6

http://bash.cyberciti.biz/file-management/shell-script-to-simulate-unix-more-command/¿Cómo leer usando "leer" del descriptor de archivo 3 en el script bash?

#!/bin/bash 
# Write a shell script like a more command. It asks the user name, the 
# name of the file on command prompt and displays only the 15 lines of 
# the file at a time. 
# ------------------------------------------------------------------------- 
# Copyright (c) 2007 nixCraft project <http://cyberciti.biz/fb/> 
# This script is licensed under GNU GPL version 2.0 or above 
# ------------------------------------------------------------------------- 
# This script is part of nixCraft shell script collection (NSSC) 
# Visit http://bash.cyberciti.biz/ for more information. 
# ------------------------------------------------------------------------- 

counter=1 
echo -n "Enter a file name : " 
read file 

if [ ! -f $file ] 
then 
    echo "$file not a file!" 
    exit 1 
fi 

# read file line by line 
exec 3<&0 
while read line 
do 
     # pause at line no. 15 
    if [ $counter -eq 15 ] 
    then 
     counter=0 # reset counter 
     echo " *** Press [Enter] key to continue ..." 
     read -u 3 enterKey 
    fi 
    echo $line 
    ((counter++)) 
done < $file 

Esto emula comando more .. consigo este error ..

de lectura: 26: Ilegal opción -u

Asegúrese de introducir el nombre de un archivo que tiene más de 15 líneas ... También leo la página man de "leer" y no obtuve una opción como "-u" ..

Entonces, ¿cómo leo utilizando "leer" desde el descriptor de archivo 3 (que es una copia de stdin).

+0

¿Qué versión de Bash? –

Respuesta

11

tratar

read key <&3 
+0

: omg: así de fácil. thanx .. –

+0

Obtengo: '-bash: 3: Descriptor de archivo incorrecto' – Timo

0

Sólo para que conste, aquí está otro guión más:

# Author: Steve Stock 
# http://www.linuxjournal.com/article/7385 (comments) 

shmore() { 
LINES="" 
while read -d $'\n' line; do 
    printf "%s\n" "$line" 
    #echo "$line" 
    LINES=".${LINES}" 
    if [[ "$LINES" == "......................." ]]; then 
    echo -n "--More--" 
    read < /dev/tty 
    LINES="" 
    fi 
done 
return 0 
} 


shmore < file.txt 

encontrado aquí: http://codesnippets.joyent.com/posts/show/1788

5

También es posible conseguir bash para asignar un descriptor de archivo a una variable; El siguiente número de descriptor de conexión se asignará a partir de 10. Por ejemplo:

#!/bin/bash 
FILENAME="my_file.txt" 
exec {FD}<${FILENAME}  # open file for read, assign descriptor 
echo "Opened ${FILENAME} for read using descriptor ${FD}" 
while read -u ${FD} LINE 
do 
    # do something with ${LINE} 
    echo ${LINE} 
done 
exec {FD}<&- # close file