Como señalaron otros, su comando original falla porque cat 1.txtignora su entrada estándar. Indique que debería ser su primer argumento ( cat - 1.txt) o utilice la redirección de bloque para redirigir echo abcycat 1.txt juntos. Esto es:
Comandos
compuestos Un comando compuesto es uno de los siguientes. En la mayoría de los casos, una lista en la descripción de un comando puede estar separada del resto del comando por una o más líneas nuevas, y puede ser seguida por una nueva línea en lugar de un punto y coma.
(lista)
La lista se ejecuta en un entorno de subshell (ver ENTORNO DE EJECUCIÓN DE MANDOS a continuación). Las asignaciones variables y los comandos incorporados que afectan el entorno del shell no permanecen vigentes una vez que se completa el comando. El estado de retorno es el estado de salida de la lista.
{lista;}
La lista simplemente se ejecuta en el entorno de shell actual.
La lista debe terminarse con una nueva línea o punto y coma. Esto se conoce como un comando de grupo . El estado de retorno es el estado de salida de la lista . Tenga en cuenta que, a diferencia de los metacaracteres (y ),
{y }son palabras reservadas y deben aparecer donde se permite reconocer una palabra reservada. Como no causan un salto de palabra, deben estar separados de la lista
por espacios en blanco u otro metacarácter de shell.
La primera opción (entorno de subshell) tiene muchos efectos secundarios, la mayoría de los cuales son irrelevantes para su escenario; sin embargo, si todo lo que necesita es redireccionar la salida de un grupo de comandos, entonces se prefiere la Opción # 2 aquí (comando de grupo).
Conectó la salida de eco a cat, pero cat no tenía uso para la entrada y la ignoró. Ahora los comandos se ejecutan uno tras otro, y su salida se agrupa (los paréntesis) y se dirige a 2.txt.
Esta respuesta puede mejorarse explicando por qué el intento original del OP no funciona (y, por lo tanto, por qué esto es necesario).
Bob
1
La <(command)construcción es una extensión de bash. No es POSIX, por lo que no puede confiar en él en scripts con los que se supone que deben ejecutarse /bin/sh.
Rhialto apoya a Mónica el
0
Solo una suposición, pero parece que tienes un proceso repetible, que es un buen candidato para un alias o una función. Los alias suelen ser atajos para invocar comandos bash, como la abreviatura, en una sola secuencia de entrada como argumento / s.
alias hg="history | grep"
Sin embargo, en este caso, una función sería más legible, ya que está combinando múltiples flujos de entrada discretos (2), así como múltiples comandos bash. Tiene dos argumentos, el primero es una cadena y el otro una ruta de archivo. Al final, desea que el resultado se escriba en la secuencia de salida estándar.
Desde un indicador de CLI, escriba esto:
# ecat()
{
echo ${1}
cat ${2}
}
Su función se llama ecat, que es memorable.
Ahora puedes invocar como
ecat "abc" 1.txt
Para agregar, simplemente proporcione un destino de salida diferente para stdout:
ecat "abc" 1.txt >> 2.txt
El operador de redireccionamiento anexar '>>' agregará la salida al final del archivo especificado.
Si le gusta, anexe a su archivo ~ / .bashrc para reutilizarlo.
declare -f ecat >> ~/.bashrc
Eso también significa que puede decorar, etc., dentro de la definición de su función.
También es una buena idea proteger los archivos para que no se sobrescriban agregando esto a su ~ / .bashrc
Para que su función se comporte correctamente, debe usar "$1"y "$2". En este contexto, las llaves no hacen ningún bien. Ver ${name}no significa lo que usted cree ... .
G-Man dice 'restablecer a Monica' el
1
¿Cómo noclobberresponde la sugerencia a la pregunta en cuestión? (Tampoco estoy muy convencido de que sea un buen consejo: modificar el comportamiento global tiende a romper los scripts / consejos / prácticas creados con los valores predeterminados en mente).
Charles Duffy el
0
El siguiente código también funcionará:
echo abc >> 1.txt && cat 1.txt > 2.txt
La salida de echo abc se agregará a 1.txt con >>
Después de eso, && le indicará que ejecute el siguiente conjunto de comandos que tomará 1.txt y luego lo enviará a 2.txt . Básicamente, agrega la salida del primer comando a 1.txt y luego envía la salida de 1.txt a 2.txt.
Si desea que el abc aparezca primero, puede usar el siguiente código:
Esto (1) se colocará abcen la parte inferior de 2.txt; la pregunta lo quiere en la cima. (2) modificar el 1.txtarchivo; Esto es inaceptable.
G-Man dice 'reinstalar a Monica' el
¿Dónde dice eso? Ringger81 nunca especificó dónde en 2.txt quería que abc apareciera. Estás asumiendo cosas que la pregunta nunca dice.
Nasir Riley el
(1) OK, planteas un punto válido en el n. ° 1. Si bien la pregunta menciona "salida de echo" antes de "contenido de un archivo" en el texto, y luego pone el echoantes caten el comando de ejemplo, supongo que nunca, explícitamente , dice que quiere la salida de echo antes del contenido del archivo de entrada. Parece que la mayoría de la gente lo interpretó de esa manera. (2) 1.txtes un archivo de entrada. La pregunta no dice nada sobre la modificación 1.txt. El hecho de que los archivos de entrada no deben modificarse es evidente.
G-Man dice 'restablecer a Mónica' el
Puedo entender su punto sobre no modificar el archivo imput. Mi segundo código logrará el efecto deseado sin hacerlo.
Nasir Riley
1
Abrir un archivo, agregarlo, cerrarlo , abrirlo nuevamente, agregarlo nuevamente ... ¿por qué hacer eso en lugar de simplemente abrirlo una vez y mantener la redirección en su lugar para ambas operaciones?
cat
solo leen desde la entrada estándar si no tienen ningún argumento de nombre de archivo.Respuestas:
No funciona porque el
cat
programa en su secuencia de tubería no recibió instrucciones de leer laecho
salida del programa desde la entrada estándar.Puede usarlo
-
como un nombre de pseudo archivo para indicar la entrada estándar acat
. Desdeman cat
una instalación de msys2:Así que intenta
en lugar.
fuente
Como señalaron otros, su comando original falla porque
cat 1.txt
ignora su entrada estándar. Indique que debería ser su primer argumento (cat - 1.txt
) o utilice la redirección de bloque para redirigirecho abc
ycat 1.txt
juntos. Esto es:Extracto relevante del manual (
man bash
):La primera opción (entorno de subshell) tiene muchos efectos secundarios, la mayoría de los cuales son irrelevantes para su escenario; sin embargo, si todo lo que necesita es redireccionar la salida de un grupo de comandos, entonces se prefiere la Opción # 2 aquí (comando de grupo).
fuente
Conectó la salida de eco a cat, pero cat no tenía uso para la entrada y la ignoró. Ahora los comandos se ejecutan uno tras otro, y su salida se agrupa (los paréntesis) y se dirige a 2.txt.
fuente
bash(1)
, describe el comportamiento que cada shell compatible con POSIX debe admitir.Su comando
cat 1.txt
no hace nada con la salida deecho "abc"
.En cambio:
(echo "abc"; cat 1.txt) > 2.txt
escribirá la salida de ambos comandos en 2.txt.fuente
En cualquier shell POSIX, puede usar la sustitución de comandos para usar
cat file
como entrada paraecho
:En Bash puede usar la sustitución de procesos y usar echo como otro "archivo" para
cat
, como en:y luego canalice o redirija la salida como mejor le parezca.
Como dice cualquier otra respuesta, cat ignora stdin si tiene que ver un archivo. (También me gustan las respuestas de Daniel y mvw, +1 para ellas)
fuente
<(command)
construcción es una extensión de bash. No es POSIX, por lo que no puede confiar en él en scripts con los que se supone que deben ejecutarse/bin/sh
.Solo una suposición, pero parece que tienes un proceso repetible, que es un buen candidato para un alias o una función. Los alias suelen ser atajos para invocar comandos bash, como la abreviatura, en una sola secuencia de entrada como argumento / s.
Sin embargo, en este caso, una función sería más legible, ya que está combinando múltiples flujos de entrada discretos (2), así como múltiples comandos bash. Tiene dos argumentos, el primero es una cadena y el otro una ruta de archivo. Al final, desea que el resultado se escriba en la secuencia de salida estándar.
Desde un indicador de CLI, escriba esto:
Su función se llama ecat, que es memorable.
Ahora puedes invocar como
Para agregar, simplemente proporcione un destino de salida diferente para stdout:
El operador de redireccionamiento anexar '>>' agregará la salida al final del archivo especificado.
Si le gusta, anexe a su archivo ~ / .bashrc para reutilizarlo.
Eso también significa que puede decorar, etc., dentro de la definición de su función.
También es una buena idea proteger los archivos para que no se sobrescriban agregando esto a su ~ / .bashrc
fuente
"$1"
y"$2"
. En este contexto, las llaves no hacen ningún bien. Ver${name}
no significa lo que usted cree ... .noclobber
responde la sugerencia a la pregunta en cuestión? (Tampoco estoy muy convencido de que sea un buen consejo: modificar el comportamiento global tiende a romper los scripts / consejos / prácticas creados con los valores predeterminados en mente).El siguiente código también funcionará:
La salida de echo abc se agregará a 1.txt con >> Después de eso, && le indicará que ejecute el siguiente conjunto de comandos que tomará 1.txt y luego lo enviará a 2.txt . Básicamente, agrega la salida del primer comando a 1.txt y luego envía la salida de 1.txt a 2.txt.
Si desea que el abc aparezca primero, puede usar el siguiente código:
fuente
abc
en la parte inferior de2.txt
; la pregunta lo quiere en la cima. (2) modificar el1.txt
archivo; Esto es inaceptable.echo
antescat
en el comando de ejemplo, supongo que nunca, explícitamente , dice que quiere la salida de echo antes del contenido del archivo de entrada. Parece que la mayoría de la gente lo interpretó de esa manera. (2)1.txt
es un archivo de entrada. La pregunta no dice nada sobre la modificación1.txt
. El hecho de que los archivos de entrada no deben modificarse es evidente.