Suponiendo que file2
ya existe, el comando
> file1 < file2 cat
parece estar copiando el contenido de file2
a file1
.
Pero no puedo entender esta estructura.
Entiendo que "Nada" se dirige a file1
(crear o borrar su contenido). Entonces file2
se dirige el contenido de file1
.
¿Por qué es cat
después file2
? ¿Cómo sabe cat file2
si los operandos no están en el orden correcto?
shell
io-redirection
shaqed
fuente
fuente
Respuestas:
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 afile1
.<file2
Esto 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
cat
utilidad en todas estas instancias se ejecuta sin ningún argumento de línea de comandos . Las redirecciones no son operandos alcat
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 elcat <file
(o, si se quiere,<file cat
) es que en el primer caso, lacat
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 conectecat
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 decat
, 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 paracat
algunas otras utilidades (es decir, nada que haga el shell ). Para usarcat
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á sifile2
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:
Aquí, el shell truncará (vaciará) el archivo
file
antes de ejecutarsort file
y conectarsort
la salida estándar del archivo. Lasort
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 afile
.El remedio en este caso particular (para ordenar un archivo "en el lugar") es
o
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:
Y también sobre la redirección que no forma parte de los operandos de la utilidad:
fuente
<in foo | bar >out
pone todo en orden lógico. También me gusta laecho >&2 Something bad happened
salida de errores de los scripts de shell. Pero>out <in cat
es solo ofuscaciónsort file >file
lograrse correctamente?sort -o file file
.< file1 > file2 cat
sería mejor que> file2 < file1 cat
eso evitaríafile2
ser truncado sifile1
no se puede abrir.