57

演習として、エコーなしで文字列をファイルにリダイレクトする方法はありますか?現在使用しています

echo "Hello world" > test.txt

私はとについて知っていcatますprintf。私は次のようなことを考えていました

> test.txt <<<"Hello world"

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

4

9 に答える 9

77

「cat」とヒアドキュメントでこれを行うことができます。

cat <<EOF > test.txt
some text
EOF

これを行う理由の 1 つは、パスワードが ps の出力に表示される可能性を回避することです。ただし、bash およびほとんどの最新のシェルでは、「echo」は組み込みコマンドであり、ps 出力には表示されないため、このようなものを使用しても安全です (もちろん、パスワードをファイルに保存する際の問題は無視してください)。

echo "$password" > test.txt
于 2013-03-05T16:49:12.887 に答える
5

おそらくあなたが気にしないことを議論する方法が多すぎます。もちろん、ハックすることもできます-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 文字列とリダイレクトだけを使用したい場合、それは不可能です。ただし、ksh93 では可能です。

 $ rm tmpfooblah; <<<'hello world' >tmpfooblah <##@(&!()); cat tmpfooblah
 hello world
于 2012-07-01T04:01:38.843 に答える
4

これを bash で行う方法は次のとおりです。

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

This is one of the interesting differences between zsh and bash: given an unchained > or >>, zsh has the good sense to hook it up to stdin, while bash does not. It would be downright useful - if it were only standard. I tried to use this to send & append my ssh key over ssh to a remote authorized_keys file, but the remote host was bash, of course, and quietly did nothing.

And that's why you should just use cat.

于 2012-09-22T02:29:36.563 に答える
3
awk ' BEGIN { print "Hello, world" } ' > test.txt

するだろう

于 2012-12-05T05:48:31.393 に答える
3

私はbashの純粋主義者のための解決策を持っています。

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

ヒアドキュメントには、オプションでパラメーター展開もあります!

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

ラッキー!

于 2017-01-31T04:03:33.827 に答える
2

現在開いているファイル記述子を接続するものがないため、リダイレクトのみが機能しません。いいえ、このような方法はありません。

于 2012-07-01T03:36:45.247 に答える