Antes de que el shell ejecute el cat
comando en la línea de comando, busca redirecciones.
Hay dos redirecciones:
>file1
Esto hará que la salida estándar del comando vaya a file1
.
<file2
Esto hará que la entrada estándar del comando provenga file2
.
El hecho de que estas redirecciones se coloquen en una ubicación inestable en la línea de comando no importa.
$ cat <file2 >file1
es lo mismo que
$ <file2 cat >file1
que es lo mismo que
$ <file2 >file1 cat
etc.¹
Tenga en cuenta que la cat
utilidad en todas estas instancias se ejecuta sin ningún argumento de línea de comandos . Las redirecciones no son operandos al cat
comando, 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 file
y el cat <file
(o, si se quiere, <file cat
) es que en el primer caso, la cat
utilidad 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 conecte cat
la secuencia de entrada de él². En el segundo caso, cat
notará 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 de cat
, y de algunas otras utilidades, no algo que hacen todas las utilidades.
cat
también leerá desde su entrada estándar si se le da el operando -
. Nuevamente, esto es especial solo para cat
algunas otras utilidades (es decir, nada que haga el shell ). Para usar cat
en 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, file1
no se truncará si file2
es inaccesible (las redirecciones se analizan de izquierda a derecha). cat
Sin 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:
$ sort file >file
Aquí, el shell truncará (vaciará) el archivo file
antes de ejecutar sort file
y conectar sort
la salida estándar del archivo. La sort
utilidad se abrirá file
y ordenará su contenido (que no es nada). El resultado (nada) se pasa a través de la secuencia de salida estándar a file
.
El remedio en este caso particular (para ordenar un archivo "en el lugar") es
$ sort -o file file
o
$ sort file >file.sorted && mv file.sorted file
que es más o menos lo que sort
hace cuando se usa el -o
archivo 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:
Un "comando simple" es una secuencia de asignaciones y redirecciones de variables opcionales, en cualquier secuencia, opcionalmente seguida de palabras y redirecciones, terminadas por un operador de control. [ref: POSIX Shell Command Language 2.9.1 Comandos simples]
Y también sobre la redirección que no forma parte de los operandos de la utilidad:
El número opcional, el operador de redireccionamiento y la palabra no aparecerán en los argumentos proporcionados al comando que se ejecutará (si corresponde). [ref: redirección POSIX Shell Command Language 2.7]