Para algunos comandos, es posible especificar cierta entrada como stdin o un argumento de línea de comando.
Específicamente, suponga que command
puede tomar la entrada estándar y un nombre de archivo como argumento de línea de comando command < myfile
, cat myfile | command
y command myfile
puede producir el mismo resultado.
Por ejemplo,
Cuando el comando es sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Cuando el comando es cat
:
cat < myfile
cat myfile
- Me preguntaba si hay algunas reglas generales sobre sus actuaciones, es decir, ¿cuál de ellas suele ser la más eficiente y la que menos?
- ¿La redirección siempre es mejor que la tubería?
Respuestas:
La
cat file | command
sintaxis se considera un uso inútil deCat
. De todas sus opciones, se necesita un golpe de rendimiento porque tiene que generar otro proceso en el núcleo. Por insignificante que esto pueda resultar en el panorama general, está sobrecargado que las otras formas no tienen. Esto se ha cubierto en preguntas como: ¿Debería preocuparme por los gatos innecesarios?Entre las otras dos formas, prácticamente no hay diferencias de rendimiento. STDIN es un nodo de archivo especial que el proceso tiene que abrir y leer como cualquier otro. Pasar un nombre de archivo en lugar de STDIN solo hace que abra un archivo diferente.
La diferencia estaría en qué características / flexibilidad está buscando.
sed -i
para la edición in situ. (Nota: dado que esto tiene que crear un nuevo archivo detrás de escena, no es una ganancia de rendimiento sobre otros redireccionamientos, pero es un paso conveniente).sed [exp] < file1 file2
o inclusosed [exp] < <(grep command)
. Los detalles de este caso de uso se pueden encontrar en esta pregunta: sustitución del proceso y tuberíafuente
sed [exp] < <(grep command)
funcionará bien comosed [exp] <(grep command)
(ya que<(grep command)
crea un archivo temporal con nombre para la longitud del comando quesed
es perfectamente capaz de abrirse por sí solo sin asistencia de shell).Dado que
command file
solo abre el archivo y desde entonces funciona como si lo fuerastdin
, hay poca diferencia. Con la redirección de shell, simplemente abre el archivo de antemano (shell lo hace) en lugar del comando binario en sí.Si estamos hablando de
cat file | command
vs.command <file
, entonces este último es el preferido. No notará una diferencia de rendimiento significativa entre los dos, pero el primero es innecesariamente complicado (proceso adicional y búfer de memoria compartida para la tubería, con rendimiento limitado). Además, no puedeseek
(cambiar la posición del puntero del archivo arbitrariamente) en un tubería, mientras que puede en un archivo ordinario. Algunos comandos pueden usar un algoritmo más eficiente cuandoseek
es posible hacer ting en el archivo de entrada.fuente
<file
? Su punto es válida para usar el nombre del archivo de entrada de nombre de archivo de salida derivan duro, por ejemplo:gzip file
producefile.gz
.close
sstdin
y llamadasdup
en el descriptor de archivo abierto, por lo que reemplazar el antiguostdin
(que era una especie de TTY en la mayoría de los casos.) Desde el punto de vista reproductor de películas que no hay diferencia entre eso y abrir el archivo por su nombre en el jugador en sí. El descriptor de archivo se puede buscar en ambos escenarios, por lo que cuando saltamos al final no hay diferencia detectable por el usuario.