2012-07-01 10 views
25

練習として、エコーなしで文字列をファイルにリダイレクトする方法はありますか?現在、私はBashエコーなしでファイルに書き込みますか?

echo "Hello world" > test.txt 

を使用しています私は約catprintfを知っています。私は何かを考えていた

> test.txt <<<"Hello world" 

もちろん、これは動作しませんが、おそらく同様のコマンドですか?

+5

私はあなたがこれをなぜ望んでいるのだろうか。 'echo'と' printf'は両方ともビルトインですので、スピードの理由ではありません。 –

+1

以下の理由から、エリックの答えを見てください。 –

+0

非常に長い行のファイルにechoを使用したくない – Olga

答えて

2

オープンされているファイルディスクリプタには何も接続されていないので、リダイレクトは機能しません。そうですね、このような方法はありません。

3

多分あなたが気にしないと話すには余りにも多くの方法があります。あなたはもちろん、strace bashをハックすることも、gdbのBashを実行するあらゆる種類の黒い魔法を実行することもできます。

実際には2つの全く異なる例があります。 <<<'string'は既に文字列をファイルに書き込んでいます。 printfecho、およびcat以外のものがあれば、他の多くのコマンドを使ってcat(sed、awk、teeなど)のように動作させることができます。

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

どのようにBashをコンパイルしたかによって、地獄です。

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

あなたがいないハッキングして、純粋なbashで、唯一のbashの文字列とリダイレクトを使用する場合は、無loadables、それは不可能です。しかし、ksh93では可能です。非連鎖>または>>与え、zshのがフックする良識を持っています。bashでこれを行うには

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

の方法は、これはzshのとbashの間の興味深い相違点の一つである

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

ですそれはstdinまでですが、bashはそうしません。もしそれが標準的であったなら、それは完全に役に立つでしょう。 これを使って&にsshを介してリモートのauthorized_keysファイルにsshキーを追加しようとしましたが、リモートホストはもちろんbashであり、静かに何もしませんでした。

だからこそ、catを使用してください。

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

は、それが

42

あなたが「猫」とヒアドキュメントでこれを行うことができますだろう。

この理由の1つは、psの出力にパスワードが表示される可能性を避けるためです。しかし、bashや最近のシェルでは、 "echo"は組み込みコマンドであり、ps出力には表示されないので、次のようなものを使うのは安全です(もちろん、ファイルにパスワードを保存することは無視してください)。

echo "$password" > test.txt 
13

「>」を送信できないという問題があり、エコーで終了しました。

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

これはすばらしいトリックです。 ddがとても便利だと私に思い出させてくれてありがとう! –

1

私はbash puristsのためのソリューションを用意しました。

関数 'define'は、変数に複数行の値を割り当てるのに役立ちます。 これは1つの位置パラメータ、つまり値を割り当てる変数名をとります。

heredocには、オプションでパラメータ拡張もあります!

#!/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" 

幸運です!

0

は実際に私はそれに行のトンが含まれている変数でこれを使用

ほとんどが

cat > fileToWrite.txt <<< "this is my here-string" 
です。 (つまり、最終的にはファイルに書き込め、その後、最初のメモリ内のすべてを操作する)

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

ので"$a"が生じるであろうエコー:

line1 
line2 
. 
. 
. 
lineN 

はその後、ファイルに書き込み、その後、私はここにいくつかの他の解析操作をしたいと言います。

a=$($a | ./someOtherScript) 

最後にファイルに書き込みます。

cat > file.txt <<< $a 

例が少しばかげていて、これはすべて1行で行うことができます。デモンストレーションのために少しオーバーライドされています。ここでの文字列の再指示は非常に便利です。

関連する問題