2012-07-01 13 views
25

Como ejercicio, ¿existe un método para redirigir una cadena a un archivo sin eco? Actualmente estoy usandoBash escribir en el archivo sin eco?

echo "Hello world" > test.txt 

que sé de cat y printf. Estaba pensando en algo como

> test.txt <<<"Hello world" 

Por supuesto, esto no funciona, pero tal vez un comando similar?

+5

Tengo que preguntarme por qué quieres esto; 'echo' y' printf' son ambos integrados, por lo que no pueden ser por razones de velocidad ... –

+1

Consulte la respuesta de Eric a continuación por una razón. –

+0

No quiero usar echo para archivos con líneas muy largas – Olga

Respuesta

2

Solo la redirección no funcionará, ya que no hay nada que conecte los descriptores de archivos ahora abiertos. Entonces no, no hay manera de esto.

3

Hay muchas maneras de discutir que probablemente no te interesen. Por supuesto, puedes hackear - strace bash, o hacer todo tipo de magia negra ejecutando Bash en gdb.

En realidad, tiene dos ejemplos completamente diferentes allí. <<<'string' ya está escribiendo una cadena en un archivo. Si hay algo aceptable que no sea printf, echo y cat, puede usar muchos otros comandos para comportarse como cat (sed, awk, tee, etc.).

$ cp /dev/stdin ./tmpfooblah <<<'hello world'; cat tmpfooblah 
hello world 

O infierno, dependiendo de cómo hayas compilado Bash.

$ enable -f /usr/lib/bash/print print; print 'hello world' >tmpfile 

Si desea utilizar sólo cadenas de bash y redirección, en bash pura, sin cortar, y no hay instrucciones cargables, no es posible. En ksh93 sin embargo, es posible.

$ rm tmpfooblah; <<<'hello world' >tmpfooblah <##@(&!()); cat tmpfooblah 
hello world 
3

La manera de hacer esto en bash es

zsh <<< '> test <<< "Hello World!"'

Ésta es una de las diferencias interesantes entre zsh y bash: dada una desencadenado > o >>, zsh tiene el buen sentido de gancho hasta stdin, mientras que bash no. Sería completamente útil, si fuera solo estándar. Intenté utilizar esto para enviar & anexar mi clave ssh sobre ssh a un archivo remoto authorized_keys, pero el host remoto era bash, por supuesto, y silenciosamente no hice nada.

Y es por eso que deberías simplemente usar cat.

2
awk ' BEGIN { print "Hello, world" } ' > test.txt 

lo haría

42

Usted puede hacer esto con "gato" y un documento interno.

cat <<EOF > test.txt 
some text 
EOF 

Una razón para hacer esto sería evitar la posibilidad de que una contraseña sea visible en la salida de ps. Sin embargo, en bash y en la mayoría de las conchas modernas, "echo" es un comando incorporado y no aparecerá en ps output, por lo que usar algo como esto es seguro (ignorando cualquier problema con el almacenamiento de contraseñas en los archivos, por supuesto):

echo "$password" > test.txt 
13

Tuve el problema de no poder enviar ">" y terminé con eco!

echo "Hello world" | dd of=test.txt 
+0

Este es un truco maravilloso. ¡Muchas gracias por recordarme que dd es tan útil! –

1

Tengo una solución para puristas de bash.

La función 'definir' nos ayuda a asignar un valor multilínea a una variable. Este toma un parámetro posicional: el nombre de la variable para asignar el valor.

En el heredoc, opcionalmente también hay expansiones de parámetros.

#!/bin/bash 

define() 
{ 
    IFS=$'\n' read -r -d '' $1 
} 

BUCH="Matthäus 1" 

define TEXT<<EOT 
Aus dem Buch: ${BUCH} 

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams. 
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder; 
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram, 

4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon, 
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai, 
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT 

define TEXTNOEXPAND<<"EOT" # or define TEXTNOEXPAND<<'EOT' 
Aus dem Buch: ${BUCH} 

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams. 
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder; 
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram, 


4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon, 
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai, 
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT 

OUTFILE="/tmp/matthäus_eins" 

# Create file 
>"$OUTFILE" 

# Write contents 
{ 
    printf "%s\n" "$TEXT" 
    printf "%s\n" "$TEXTNOEXPAND" 
} >>"$OUTFILE" 

¡Sé afortunado!

0

En realidad, usted está casi allí

cat > fileToWrite.txt <<< "this is my here-string" 

utilizo esto con las variables que contiene toneladas de líneas en ella. (Es decir, manipular todo en la memoria en primer lugar, a continuación, escribir para presentar finalmente)

a=$(do some operation here, get my variable loaded with multi-line test) 

modo de eco "$a" produciría:

line1 
line2 
. 
. 
. 
lineN 

Luego dicen que quiero hacer alguna otra operación de análisis aquí, a continuación, escribir en el archivo .

a=$($a | ./someOtherScript) 

Finalmente escriba en el archivo.

cat > file.txt <<< $a 

Ejemplo parece un poco tonto y todo esto se puede hacer en una línea, estoy de acuerdo. Es un poco simplificado en aras de la demostración. Las nuevas direcciones de las cuerdas pueden ser bastante útiles.

Cuestiones relacionadas