演習として、エコーなしで文字列をファイルにリダイレクトする方法はありますか?現在使用しています
echo "Hello world" > test.txt
私はとについて知っていcat
ますprintf
。私は次のようなことを考えていました
> test.txt <<<"Hello world"
もちろんこれは機能しませんが、おそらく同様のコマンドですか?
演習として、エコーなしで文字列をファイルにリダイレクトする方法はありますか?現在使用しています
echo "Hello world" > test.txt
私はとについて知っていcat
ますprintf
。私は次のようなことを考えていました
> test.txt <<<"Hello world"
もちろんこれは機能しませんが、おそらく同様のコマンドですか?
「cat」とヒアドキュメントでこれを行うことができます。
cat <<EOF > test.txt
some text
EOF
これを行う理由の 1 つは、パスワードが ps の出力に表示される可能性を回避することです。ただし、bash およびほとんどの最新のシェルでは、「echo」は組み込みコマンドであり、ps 出力には表示されないため、このようなものを使用しても安全です (もちろん、パスワードをファイルに保存する際の問題は無視してください)。
echo "$password" > test.txt
おそらくあなたが気にしないことを議論する方法が多すぎます。もちろん、ハックすることもできます-strace bash、またはgdbでBashを実行するあらゆる種類の黒魔術を実行します。
実際には、まったく異なる 2 つの例があります。<<<'string'
すでに文字列をファイルに書き込んでいます。printf
、echo
、および以外のものが受け入れられる場合は、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
これを 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
.
awk ' BEGIN { print "Hello, world" } ' > test.txt
するだろう
私は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"
ラッキー!
現在開いているファイル記述子を接続するものがないため、リダイレクトのみが機能しません。いいえ、このような方法はありません。