機能の最後に新しい行を印刷するには?

機能の最後に新しい行を印刷するには?

と入力すると、echo hello端末は次のように表示されます。

My-Computer:~ user$ echo hello
hello
My-Computer:~ user$ 

しかし、このような機能がある場合

stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

こんな感じ

My-Computer:~ user$ stringen 18
^\k6JPWVIUdEiudcWSMy-Computer:~ user$ 

新しい行に印刷されないことを確認しますか? vs.を使用するprintf場合も同様です。echo関数でこのような新しい行を生成するにはどうすればよいですか?私は彼らが;この問題を修正すると思いましたが、明らかにそうではありませんでした。

たとえば、これは私が欲しいものを返します。

variable=$(stringen 18)
echo $variable

鳴り響くのでしょうか?

答え1

catまたは改行を追加しませtrheadurandom動作しますがランダムなので信頼できません)。新しい行を手動で挿入し、関数の末尾にまたはprintf '\n'を追加する必要がありますecho

しかし、一部のシェルでは、zshこのような状況を防ぐためにこれを追加します。

答え2

関数が改行文字を印刷するかどうかはまったく重要ではありません。コマンドの置き換え存在する場合は削除されます。

Bash はコマンドを実行し、コマンド置換をコマンドの標準出力に置き換えて拡張を実行します。すべての末尾の改行を削除。 (強調は私のもの)

testfunc() { echo hello; }    # a newline is printed
output=$(testfunc)            # $output does NOT contain a trailing newline
echo "$output"                # echo adds a newline
printf "%s" "$output"         # no newline

答え3

IMHO可能です。部分的にしかし、echo問題の別の部分は影響力です。したがって、ディストリビューションが最近リリースされた場合、理想的には牛に似た一種の栄養なぜなら、以下に示すように、GNUが「修正」を適用する必要がある場所を知らせることについて文句を言う構文trには明らかな問題があるからです。tr

オリジナル:

$ stringen() { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }

$ stringen 18
tr: range-endpoints of 'a-Z' are in reverse collating sequence order

あや!ここに問題を解決した代替バージョンがあります(少なくとも私のものGNU展開がtr成功しました):

「安定した」:

$ stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Za-z0-9' | head -c "$1" ; }
$ stringen 18
V068BrYGKIICyLI4QB
$ 

結論:集合と範囲を混在させないのが最善ですがtr、集合/範囲を組み合わせるときは、常に大文字と比較して大文字、小文字と比較して小文字を維持する必要があります。

しかし、: GNU でない場合、tr改行不足の問題がまだ存在する可能性があります。ただし、GNUを使用すると、修正された行には素晴らしい改行トリックは必要ありません。

答え4

この出力を保存するために変数は必要ありません。直接的で簡単なecho出力:

echo "$(stringen 18)"

関連情報