BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

コマンドライン出力で改行を印刷する方法

驚くべきことに、コンピューターに人間が読める出力を提供させるのは簡単なことではありません。標準ストリーム、特に標準出力の導入により、プログラムはプレーンテキストストリームを使用して相互に通信する方法を獲得しました。しかし、stdoutを人間化して表示することは別の問題です。ビデオコンピュータのディスプレイでのASCII文字の使用から、echoのような最新のシェルコマンドまで、コンピューティング時代のテクノロジーがこの問題を解決しようと試みてきました。 およびprintf

これらの進歩はシームレスではありませんでした。ターミナルに出力を印刷する仕事は、改行を印刷するためにエスケープシーケンスを拡張するという一見取るに足らないタスクによって例示されるように、プログラマーがナビゲートするための癖に満ちています。プレースホルダーの展開\n さまざまな方法で達成でき、それぞれに独自の歴史と複雑さがあります。

echoの使用

Multicsでの登場から、現代​​のUnixライクなシステムユビキタスまで、echo 端末に「Helloworld!」と言わせるための使い慣れたツールです。残念ながら、オペレーティングシステム間で一貫性のない実装を行うと、使用が難しくなります。 echo 一部のシステムではエスケープシーケンスが自動的に拡張されますが、その他のシステムでは-eが必要です。 同じことをするオプション:

echo "the study of European nerves is \neurology"
# the study of European nerves is \neurology

echo -e "the study of European nerves is \neurology"
# the study of European nerves is 
# eurology

実装におけるこれらの不整合のため、echo ポータブルではないと見なされます。さらに、ユーザー入力と組み合わせて使用​​すると、コマンド置換を使用したシェルインジェクション攻撃によって比較的簡単に破損します。

最新のシステムでは、それを使用している多くのプログラムとの互換性を提供するためにのみ保持されます。 POSIX仕様では、printfの使用が推奨されています 新しいプログラムで。

printfの使用

第4版Unix以降、ポータブルprintf コマンドは本質的に新しく、より優れたecho 。これにより、フォーマット指定子を使用して入力を人間化することができます。バックスラッシュエスケープシーケンスを解釈するには、%bを使用します 。文字シーケンス\n 出力が改行で終了することを確認します:

printf "%b\n" "Many females in Oble are \noblewomen"
# Many females in Oble are 
# oblewomen

printf echoをはるかに強力に置き換えるオプションがさらにあります 、このユーティリティは絶対確実ではなく、制御されていないフォーマット文字列攻撃に対して脆弱である可能性があります。プログラマーにとって、ユーザー入力を慎重に処理することが重要です。

改行を変数に入れる

コンパイラ間の移植性を向上させるために、1983年にANSIC標準が確立されました。$'...'を使用したANSI-C引用 、エスケープシーケンスは、標準に従って出力で置き換えられます。

これにより、改行が解釈された状態で出力される変数に、改行を含む文字列を格納できます。これを行うには、変数を設定してから、printfで呼び出します。 $を使用する :

puns=$'\number\narrow\nether\nice'

printf "%b\n" "These words started with n but don't make $puns"

# These words started with n but don't make 
# umber
# arrow
# ether
# ice

展開された変数は一重引用符で囲まれ、文字通りprintfに渡されます。 。いつものように、入力を適切に処理することが重要です。

ボーナスラウンド:シェルパラメータの拡張

Bashと中括弧について説明している私の記事では、シェルパラメーター拡張の魔法について説明しました。 ${parameter@operator}という1つの拡張を使用できます 、エスケープシーケンスも解釈します。 printfを使用します の%s 文字列として出力する指定子、およびE 演算子は、変数のエスケープシーケンスを適切に展開します:

printf "%s\n" ${puns@E}

# umber
# arrow
# ether
# ice
人間で話すという継続的な課題

文字列補間は、プログラマーにとって引き続き厄介な問題です。言語とシェルに特定のプレースホルダーの意味について合意させることに加えて、正しいエスケープシーケンスを適切に使用するには、詳細に注意を払う必要があります。

文字列の補間が不十分だと、出力がばかげているだけでなく、インジェクション攻撃などのセキュリティの脆弱性が発生する可能性があります。ターミナルの次の進化で絵文字で話すまでは、人間向けの出力を印刷するときに注意を払うのが最善です。


  1. コマンドラインでUbuntuを更新する方法

    コマンドラインでLinuxを更新する方法を知ることは、熟練したユーザーにとって絶対に必要なことです。最新の状態を維持することで、システムを安全に、安全に保ち、最新の機能を備えた状態に保つことができます。今日は、ターミナルから、またはSSH接続を介してUbuntuデスクトップまたはサーバーを更新する方法を学習します。 コマンドラインから更新する必要がある理由 コマンドラインを使用してLinuxを更新する理由 多くの場合、Software UpdaterなどのGUIツールを使用するよりも高速であり、更新がリアルタイムで行われていることを確認できます。これは、これから調べようとしているので、学ぶ

  2. コマンドラインからUbuntuをアップグレードする方法

    UbuntuのUpdateManagerを使用すると、インストールを新しいメジャーリリースに比較的簡単にアップグレードできます。ユーティリティのグラフィカルインターフェイスは、わかりやすい手順のウィザードをガイドします。 ただし、グラフィカルユーティリティを使用できない場合があります。たとえば、サーバーではグラフィカルインターフェイスにアクセスできません。この場合、Ubuntuをアップグレードするためにコマンドラインを使用する必要があります。 ただし、これが役立つシナリオはこれだけではありません。コマンドラインインターフェイスを使用すると、通常、何が起こっているかを詳しく知ることができます