Suponiendo que file2ya existe, el comando
> file1 < file2 cat
parece estar copiando el contenido de file2a file1.
Pero no puedo entender esta estructura.
Entiendo que "Nada" se dirige a file1(crear o borrar su contenido). Entonces file2se dirige el contenido de file1.
¿Por qué es catdespués file2? ¿Cómo sabe cat file2si los operandos no están en el orden correcto?
shell
io-redirection
shaqed
fuente
fuente

Respuestas:
Antes de que el shell ejecute el
catcomando en la línea de comando, busca redirecciones.Hay dos redirecciones:
>file1Esto hará que la salida estándar del comando vaya afile1.<file2Esto hará que la entrada estándar del comando provengafile2.El hecho de que estas redirecciones se coloquen en una ubicación inestable en la línea de comando no importa.
es lo mismo que
que es lo mismo que
etc.¹
Tenga en cuenta que la
catutilidad en todas estas instancias se ejecuta sin ningún argumento de línea de comandos . Las redirecciones no son operandos alcatcomando, son instrucciones al shell para configurar las redirecciones dentro y fuera del comando (conectando su entrada y salida estándar a los archivos). El shell configura las redirecciones antes de invocar el comando.La diferencia entre el
cat filey elcat <file(o, si se quiere,<file cat) es que en el primer caso, lacatutilidad en sí está abriendo el archivo, que se da como un operando en la línea de comandos, para la lectura, mientras que en el segundo caso, la cáscara se abra el archivo y conectecatla secuencia de entrada de él². En el segundo caso,catnotará que no se le dio un operando de archivo y cambiará automáticamente a lectura desde su entrada estándar. Esta es una característica decat, y de algunas otras utilidades, no algo que hacen todas las utilidades.cattambién leerá desde su entrada estándar si se le da el operando-. Nuevamente, esto es especial solo paracatalgunas otras utilidades (es decir, nada que haga el shell ). Para usarcaten un archivo en el directorio actual cuyo nombre es-, agregue una ruta al nombre del archivo, como./-.¹ El orden de las redirecciones sigue siendo importante en algunas circunstancias; Con
cat <file2 >file1, por ejemplo,file1no se truncará sifile2es inaccesible (las redirecciones se analizan de izquierda a derecha).catSin embargo, la ubicación relativa de la palabra sigue siendo arbitraria y no influirá en esto.² Consulte también la pregunta " cat da un error diferente al abrir un archivo no existente ".
El hecho de que el shell configure las redirecciones incluso antes de ejecutar el comando en la línea de comando es la razón por la cual fallan cosas como estas y terminas con un archivo de salida vacío:
Aquí, el shell truncará (vaciará) el archivo
fileantes de ejecutarsort filey conectarsortla salida estándar del archivo. Lasortutilidad se abriráfiley ordenará su contenido (que no es nada). El resultado (nada) se pasa a través de la secuencia de salida estándar afile.El remedio en este caso particular (para ordenar un archivo "en el lugar") es
o
que es más o menos lo que
sorthace cuando se usa el-oarchivo para especificar el nombre del archivo de salida.Solo para respaldar la afirmación de que las redirecciones pueden preceder al nombre real de la utilidad en la línea de comando:
Y también sobre la redirección que no forma parte de los operandos de la utilidad:
fuente
<in foo | bar >outpone todo en orden lógico. También me gusta laecho >&2 Something bad happenedsalida de errores de los scripts de shell. Pero>out <in cates solo ofuscaciónsort file >filelograrse correctamente?sort -o file file.< file1 > file2 catsería mejor que> file2 < file1 cateso evitaríafile2ser truncado sifile1no se puede abrir.